• Indonesian
  • English
  • Tune File Descriptors Limit Linux: Panduan Lengkap

    Kecepatan:
    ⏱ 9 min read

    Skip basa-basi. Kalau kamu dapet alert “Too many open files” di production server — atau Nginx tiba-tiba nolak koneksi baru, atau Node.js app crash tanpa error log yang jelas — fix-nya ada di sini. File descriptors limit. Sesuatu yang kelihatannya sepele tapi bisa bikin server production mati mendadak di jam-jam sibuk.

    Aku personally udah handle ini di belasan server berbeda. Awalnya gak paham, coba-coba sana sini, googling sana sini, dan akhirnya nemu pola yang works di semua distro. Artikel ini aku tulis biar kamu gak ngalamin hal yang sama — capek tengah malam debug cuma gara-gara limit 1024 yang gak pernah diubah sejak server di-install.

    Difficulty: Intermediate
    Last Updated: Agustus 2026
    Tested On: Ubuntu 22.04/24.04 LTS, Debian 12, CentOS 7/8/9, Rocky Linux 9, AlmaLinux 9

    Kenapa File Descriptors Limit Ini Penting Banget?

    Jadi gini, di Linux, setiap kali aplikasi membuka sebuah file — entah itu file biasa di disk, socket koneksi network, pipe antar process, bahkan log — sistem operasi memberikan satu “file descriptor”. Ini kayak nomor antrian di rumah sakit: setiap pasien (file/socket) dapet nomor, dan rumah sakit (kernel) punya batas berapa nomor yang bisa dikeluarkan sekaligus.

    Default limit di banyak distro Linux itu cuma 1024 file descriptors per process. Untuk VPS yang cuma jalanin satu aplikasi kecil, mungkin cukup. Tapi kalau kamu jalanin Nginx + PHP-FPM + MySQL + Redis + Node.js background worker di satu server — 1024 itu habis dalam hitungan menit saat traffic naik.

    Dan masalahnya, gak ada error message yang dramatik. Gak ada sirene. Aplikasi kamu pelan-pelan mulai menolak koneksi baru, atau crash tiba-tiba, atau — yang paling berbahaya — diam-diam kehilangan data karena gak bisa nulis log lagi.

    Symptoms yang sering muncul saat limit tercapai:

    • Error "Too many open files" di error log Nginx/Apache
    • MySQL atau MariaDB tiba-tiba restart sendiri atau jadi super lambat
    • Aplikasi Node.js/Python/Go tiba-tiba mati tanpa penjelasan jelas
    • 502 Bad Gateway atau 503 Service Unavailable di balik reverse proxy
    • Server load average naik tiba-tiba padahal CPU usage normal-normal aja

    Serius, ini sering terjadi di production. Dan kalau belum pernah kena, itu cuma masalah waktu.

    Cara Cek Limit File Descriptors Saat Ini

    Sebelum ngopak-ngopak konfigurasi, cek dulu limit yang sekarang aktif di server kamu. Ada beberapa cara:

    Cek dengan ulimit

    ulimit -n

    Ini nge-return soft limit file descriptors untuk user yang sedang login. Default biasanya 1024. Kalau angkanya masih 1024, berarti belum pernah di-tune — dan itu masalah.

    # Cek hard limit juga
    ulimit -Hn
    
    # Contoh output kalau sudah di-tune:
    # 65535

    Cek via /proc

    cat /proc/sys/fs/file-nr

    Output-nya tiga angka. Yang pertama itu jumlah file descriptors yang lagi dipakai, yang kedua (selalu 0), dan yang ketiga itu max limit global:

    # Contoh output:
    # 4128    0    9223372036854775807
    # 4128    = file descriptors aktif
    # 9223372036854775807 = max global (practically unlimited)

    Cek per-process

    # Cari PID process-nya
    tpids=$(pidof nginx)
    
    # Lihat open file descriptors untuk process tertentu
    ls -la /proc/$tpids/fd | wc -l
    
    # Atau lebih detail:
    ls -la /proc/$tpids/fd

    Ini useful banget kalau kamu mau tau proses mana yang paling banyak makan file descriptors. Biasanya Nginx worker atau MySQL process yang juara di sini.

    Cek via /etc/security/limits.conf

    grep -i nofile /etc/security/limits.conf
    # Atau cek juga di conf.d:
    grep -ri nofile /etc/security/limits.d/

    Kalau hasilnya kosong atau nilainya masih 1024, berarti memang belum pernah di-tune.

    Command Yang Dicek Contoh Output
    ulimit -n Soft limit per-user 1024 atau 65535
    ulimit -Hn Hard limit per-user 1024 atau 65535
    cat /proc/sys/fs/file-nr Global usage vs limit 4128 0 9223372036854775807
    ls /proc/PID/fd | wc -l Open FDs per process 42 (contoh)
    grep nofile /etc/security/limits.conf Configured limit * soft nofile 65535

    Step 1: Edit /etc/security/limits.conf

    Ini file utama yang ngatur limit per-user. Buka dengan nano atau vim:

    sudo nano /etc/security/limits.conf

    Tambahin baris ini di bagian paling bawah file:

    # File descriptors limit
    * soft nofile 65535
    * hard nofile 65535
    root soft nofile 65535
    root hard nofile 65535

    Penjelasan singkat:

    • * berlaku untuk semua user kecuali root
    • root baris terpisah karena root kadang di-treat beda oleh beberapa distro
    • soft = limit default yang diberikan ke process
    • hard = limit maksimum yang bisa di-set oleh user sendiri via ulimit
    • nofile = number of file descriptors
    • 65535 = angka yang cukup untuk hampir semua use case
    Tip: Kenapa 65535? Karena ini adalah max untuk unsigned 16-bit integer. Angka yang “aman” dan widely used. Kalau kamu butuh lebih (jarang), bisa pakai 1048576 tapi itu sudah masuk territory yang perlu pertimbangan lebih lanjut.

    PENTING: Setelah edit file ini, kamu HARUS logout dan login lagi (atau buka SSH session baru) supaya limit baru aktif. Login session yang sudah ada gak akan dapet limit baru.

    Step 2: Cek /etc/security/limits.d/ (Kalau Ada)

    Beberapa distro — terutama CentOS/RHEL — punya file override di /etc/security/limits.d/ yang bisa nge-override settings di limits.conf. Kalau ada file di sana, limits.conf bisa diabaikan.

    # Cek semua file di limits.d
    ls -la /etc/security/limits.d/
    
    # Cek isinya
    cat /etc/security/limits.d/20-nproc.conf
    # Atau yang generic:
    cat /etc/security/limits.d/*-nofile.conf 2>/dev/null

    Kalau ada settingan nofile di situ, edit juga atau hapus (tergantung kebutuhan kamu). Prioritas: file di limits.d/ dibaca SETELAH limits.conf, jadi isinya yang menang.

    Step 3: Tune via /etc/sysctl.conf (Global Limit)

    Selain per-user limit, ada juga global limit di level kernel. Ini ngeberapa total file descriptors yang bisa dibuka oleh SELURUH system, bukan per-process.

    sudo nano /etc/sysctl.conf

    Tambahin:

    # Maximum number of file descriptors system-wide
    fs.file-max = 2097152
    
    # Recommendation for systems with 2GB+ RAM
    # fs.file-max = 4194304

    Langsung apply tanpa restart:

    sudo sysctl -p

    Verifikasi:

    cat /proc/sys/fs/file-max
    # Output: 2097152

    Angka 2097152 (2 juta) itu cukup untuk kebanyakan server. Kalau RAM server kamu 4GB ke atas, bisa naikkan ke 4194304 (4 juta) tanpa masalah.

    tune file descriptors limit di linux sysctl.conf

    Step 4: Systemd Service Limits (Kalau Pakai Systemd)

    Ini yang sering dilupakan. Kalau aplikasi kamu jalan sebagai systemd service (kebanyakan modern server), kamu perlu set limit juga di unit file-nya. Karena systemd punya limit sendiri yang bisa OVERWRITE limits.conf.

    # Contoh untuk Nginx
    sudo systemctl edit nginx.service

    Tambahin di bagian [Service]:

    [Service]
    LimitNOFILE=65535

    Lalu reload dan restart:

    sudo systemctl daemon-reload
    sudo systemctl restart nginx

    Hal yang sama berlaku untuk service lain:

    Service Command Edit LimitNOFILE
    Nginx systemctl edit nginx 65535
    Apache/Httpd systemctl edit apache2 atau httpd 65535
    MySQL/MariaDB systemctl edit mariadb 65535
    PHP-FPM systemctl edit php8.2-fpm 65535
    Redis systemctl edit redis 65535
    PostgreSQL systemctl edit postgresql 65535
    Warning: Kalau kamu cuma edit limits.conf tapi gak set LimitNOFILE di systemd unit, service yang dijalankan via systemd TETAP pakai limit lama (biasanya 1024). Ini penyebab paling umum kenapa “sudah di-tune tapi gak work”.

    Step 5: Verifikasi Semua Perubahan

    Setelah semua step di atas, wajib verifikasi. Jangan asal assume work.

    # 1. Cek global limit
    cat /proc/sys/fs/file-max
    # Harusnya: 2097152
    
    # 2. Buka SSH session baru (bukan yang lama!)
    # Lalu cek:
    ulimit -n
    # Harusnya: 65535
    
    ulimit -Hn
    # Harusnya: 65535
    
    # 3. Cek untuk service spesifik (misal Nginx)
    sudo systemctl show nginx -p LimitNOFILE
    # Harusnya: LimitNOFILE=65535
    
    # 4. Cek open FDs untuk running process
    pidof nginx | xargs -I{} ls /proc/{}/fd | wc -l
    # Ini menunjukkan berapa FD yang sedang dipakai Nginx saat ini

    Kalau salah satu hasilnya masih 1024, cek lagi step mana yang belum ke-apply. Paling sering: lupa logout-login setelah edit limits.conf, atau ada override di /etc/security/limits.d/.

    Quick Reference: Angka yang Direkomendasikan

    Server Type nofile (per-user) fs.file-max Catatan
    VPS kecil (1 vCPU, 1GB RAM) 32768 524288 Cukup untuk 1-2 web apps
    VPS menengah (2 vCPU, 4GB RAM) 65535 2097152 Web + DB + cache di satu server
    Dedicated server (8+ CPU, 32GB+ RAM) 131072 4194304 High traffic, multiple services
    Database-heavy server 131072 4194304 MySQL/PG banyak koneksi + replication

    Troubleshooting: Kalau Masih Gak Work

    Oke, kamu udah ikuti semua step di atas tapi masih dapat error yang sama. Jangan panik. Ini beberapa hal yang sering terlewat:

    1. Login session lama masih aktif

    Limit baru hanya berlaku untuk login session BARU. Kalau kamu login via SSH dan gak pernah logout, limit lama masih aktif. Buka terminal baru, atau logout-login lagi.

    2. Systemd override lebih kuat dari limits.conf

    Sudah dijelaskan di Step 4. Kalau service dijalankan via systemd, kamu HARUS set LimitNOFILE di unit file-nya. Jangan cuma andalkan limits.conf.

    3. PAM module belum aktif

    Pastikan pam_limits.so aktif di PAM config:

    grep pam_limits /etc/pam.d/sshd
    # Harus ada baris: session required pam_limits.so

    4. User yang tepat

    Pastikan limits.conf di-set untuk user yang benar. Kalau Nginx jalan sebagai www-data, limit untuk * harusnya cover. Tapi kalau kamu pakai custom user, set spesifik untuk user itu.

    5. Angka terlalu tinggi untuk system

    Kalau fs.file-max terlalu rendah dari total nofile yang diminta semua process, kernel bisa ignore beberapa setting. Pastikan fs.file-max cukup besar.

    Q: Apa bedanya soft limit dan hard limit?

    Soft limit itu limit default yang diberikan ke process baru. Hard limit itu batas maksimum yang bisa di-set oleh user sendiri via ulimit -n. User bisa naikkan soft limit sampai hard limit, tapi gak bisa naikkan hard limit tanpa akses root. Jadi hard limit itu “plafon”, soft limit itu “target”.

    Q: Kenapa pakai 65535 bukan 65536?

    65535 itu max value untuk unsigned 16-bit integer. Beberapa aplikasi dan kernel internal bisa bermasalah kalau nilainya tepat 65536 (overflows ke 0 di beberapa implementasi). Pakai 65535 itu safe convention yang widely adopted.

    Q: Apakah menaikkan file descriptors limit berpengaruh ke RAM?

    Secara langsung? Sangat minim. Setiap file descriptor cuma butuh sekitar 100-200 bytes di kernel memory. Bahkan 1 juta file descriptors cuma makan sekitar 100-200 MB kernel memory. Jadi gak perlu khawatir RAM habis cuma gara-gara naikkan limit ini.

    Q: Harus restart server setelah edit limits.conf?

    Gak harus restart server. Tapi kamu harus logout-login lagi untuk user yang bersangkutan. Untuk service systemd, cukup restart service-nya (bukan server). Tapi kalau mau pasti aman, reboot juga gak ada salahnya.

    Q: Angka 65535 itu universal atau ada case yang butuh lebih?

    65535 itu cukup untuk 95% use case. Tapi kalau kamu handle WebSocket server dengan ribuan koneksi simultan, atau proxy yang handle banyak upstream, atau mesin yang jalanin banyak container Docker, bisa naikkan ke 131072 atau bahkan 1048576. Yang penting sesuaikan dengan fs.file-max juga.

    Author: Syslog Solutions — NOC & Server Management Team. We handle 500+ servers daily, from shared hosting to enterprise dedicated infrastructure.

    Nah, gitu doang sih step-nya. Gampang banget sebenernya — yang sering bikin masalah itu ketidak-tahuan, bukan kesulitan teknisnya. Langsung praktekin sekarang juga. Cek limit server kamu, bandingin sama tabel rekomendasi di atas, dan update kalau masih 1024. Jangan nunggu sampai dapat alert tengah malam. Praktek langsung, pastiin hasilnya, dan tutup ticket ini dengan percaya diri. Done.