Open File Cache

Open File Cache #

Setiap kali Nginx menyajikan file statis, sistem operasi perlu membuka file tersebut: mencari inode di filesystem, membaca metadata, lalu membuka file descriptor. Untuk server yang menyajikan ribuan file statis dengan traffic tinggi, operasi ini bisa menjadi bottleneck.

open_file_cache menyimpan file descriptor yang terbuka dan metadata file (ukuran, waktu modifikasi) di memori. Request berikutnya untuk file yang sama langsung menggunakan file descriptor dari cache — tanpa syscall open() ke filesystem.

Cara Kerja #

Tanpa open_file_cache (setiap request):
  1. Nginx terima request /static/app.js
  2. Nginx panggil syscall open("/var/www/app.js")
  3. OS cari inode di filesystem
  4. Buka file descriptor
  5. Baca dan kirim konten
  6. Tutup file descriptor

Dengan open_file_cache (setelah request pertama):
  1. Nginx terima request /static/app.js
  2. Cek cache → file descriptor sudah ada
  3. Langsung baca dan kirim konten (lewati langkah 2-4)

Manfaat terbesar terasa di server yang menyajikan banyak file kecil dengan traffic tinggi, atau di filesystem dengan latency lookup yang tinggi.


Konfigurasi #

http {
    # max: jumlah maksimum file descriptor yang di-cache
    # inactive: hapus dari cache jika tidak diakses selama ini
    open_file_cache max=10000 inactive=30s;

    # Berapa sering Nginx memvalidasi bahwa file di cache masih valid
    # (belum dimodifikasi atau dihapus)
    open_file_cache_valid 60s;

    # File harus diakses minimal N kali selama periode inactive
    # sebelum disimpan ke cache
    # Ini mencegah file yang jarang diakses mengisi cache
    open_file_cache_min_uses 2;

    # Cache juga error "file not found" (404)
    # Mencegah filesystem lookup berulang untuk file yang tidak ada
    open_file_cache_errors on;
}

Memilih Nilai yang Tepat #

max=10000:
  Berapa banyak file berbeda yang aktif diakses?
  Untuk static file server biasa: 1000-5000
  Untuk server dengan banyak user-uploaded content: bisa lebih tinggi
  Masing-masing entry menggunakan ~500 bytes memori → 10000 = ~5MB

inactive=30s:
  Seberapa sering file diakses?
  File statis web yang sering diakses: 20-60s
  File yang jarang diakses: lebih pendek agar memori terpakai untuk yang aktif

open_file_cache_valid=60s:
  Seberapa sering file berubah di disk?
  File statis production (jarang berubah): 60-300s
  File yang sering di-deploy ulang: 10-30s
  Nilai tinggi = lebih efisien, tapi file yang diupdate tidak langsung terdeteksi

Open File Cache untuk File Statis yang Banyak #

Konfigurasi yang dioptimalkan untuk server yang banyak menyajikan file statis:

http {
    # Cache agresif untuk production static file server
    open_file_cache max=50000 inactive=60s;
    open_file_cache_valid 120s;
    open_file_cache_min_uses 3;
    open_file_cache_errors on;

    server {
        listen 443 ssl;
        server_name static.example.com;

        root /var/www/static;
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;

        location ~* \.(css|js|png|jpg|woff2|ico)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
            access_log off;
        }
    }
}

Interaksi dengan sendfile #

open_file_cache bekerja sinergis dengan sendfile:

http {
    # sendfile: gunakan syscall sendfile() untuk mengirim file
    # Lebih efisien dari read() + write() karena menghindari copy ke user space
    sendfile on;

    # tcp_nopush: kumpulkan data sebelum dikirim (mengurangi jumlah paket TCP)
    # Hanya efektif saat sendfile on
    tcp_nopush on;

    # tcp_nodelay: kirim data segera tanpa delay Nagle algorithm
    # Berguna untuk koneksi keepalive
    tcp_nodelay on;

    open_file_cache max=10000 inactive=30s;
    open_file_cache_valid 60s;
}

Ketiganya bersama-sama (sendfile, tcp_nopush, open_file_cache) adalah kombinasi optimal untuk menyajikan file statis dengan efisien.


Kapan open_file_cache Tidak Signifikan #

Open file cache paling bermanfaat untuk:

  • Server yang banyak menyajikan file statis (HTML, CSS, JS, gambar)
  • Server dengan traffic tinggi dan banyak file berbeda yang diakses
  • Filesystem dengan latency lookup yang tinggi (network filesystem, filesystem yang sudah penuh)

Open file cache kurang bermanfaat untuk:

  • Server yang terutama berfungsi sebagai reverse proxy (tidak menyajikan file dari disk)
  • Server dengan sedikit file yang sudah di-cache oleh OS page cache
  • Server dengan traffic rendah di mana overhead syscall tidak signifikan

Ringkasan #

  • open_file_cache menyimpan file descriptor terbuka di memori — menghilangkan syscall open() untuk setiap request ke file statis.
  • open_file_cache_errors on juga cache “file not found” — mencegah filesystem lookup berulang untuk URL yang tidak ada.
  • open_file_cache_valid menentukan seberapa sering Nginx memvalidasi cache — nilai lebih tinggi lebih efisien tapi file yang diupdate tidak langsung terdeteksi.
  • Kombinasikan dengan sendfile on dan tcp_nopush on untuk performa file statis yang optimal.
  • Manfaat paling signifikan untuk server static file dengan traffic tinggi — untuk pure reverse proxy, manfaatnya minimal.

← Sebelumnya: Keepalive   Berikutnya: Modul Bawaan →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact