📑 Daftar Isi
- Kenapa File Descriptors Limit Ini Penting Banget?
- Cara Cek Limit File Descriptors Saat Ini
- Step 1: Edit /etc/security/limits.conf
- Step 2: Cek /etc/security/limits.d/ (Kalau Ada)
- Step 3: Tune via /etc/sysctl.conf (Global Limit)
- Step 4: Systemd Service Limits (Kalau Pakai Systemd)
- Step 5: Verifikasi Semua Perubahan
- Quick Reference: Angka yang Direkomendasikan
- Troubleshooting: Kalau Masih Gak Work
- 1. Login session lama masih aktif
- 2. Systemd override lebih kuat dari limits.conf
- 3. PAM module belum aktif
- 4. User yang tepat
- 5. Angka terlalu tinggi untuk system
- Q: Apa bedanya soft limit dan hard limit?
- Q: Kenapa pakai 65535 bukan 65536?
- Q: Apakah menaikkan file descriptors limit berpengaruh ke RAM?
- Q: Harus restart server setelah edit limits.conf?
- Q: Angka 65535 itu universal atau ada case yang butuh lebih?
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.
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 rootrootbaris terpisah karena root kadang di-treat beda oleh beberapa distrosoft= limit default yang diberikan ke processhard= limit maksimum yang bisa di-set oleh user sendiri viaulimitnofile= number of file descriptors65535= angka yang cukup untuk hampir semua use case
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.

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 |
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.
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.