Solusi 1:
file-max
adalah File Descriptors (FD) maksimum yang diterapkan pada level kernel, yang tidak dapat dilampaui oleh semua proses tanpa peningkatan. ulimit
diberlakukan pada tingkat proses, yang bisa kurang dari file-max
.
Tidak ada risiko dampak kinerja dengan meningkatkan file-max
. Distribusi modern memiliki FD maksimum yang disetel cukup tinggi, sedangkan di masa lalu diperlukan kompilasi ulang dan modifikasi kernel untuk meningkat melewati 1024. Saya tidak akan meningkatkan seluruh sistem kecuali Anda memiliki kebutuhan teknis.
Konfigurasi per-proses seringkali perlu disetel untuk melayani daemon tertentu baik itu database atau server Web. Jika Anda menghapus batas seluruhnya, daemon tersebut berpotensi menghabiskan semua sumber daya sistem yang tersedia; artinya Anda tidak akan dapat memperbaiki masalah kecuali dengan menekan tombol reset atau power cycle. Tentu saja, salah satu dari hal tersebut cenderung mengakibatkan kerusakan pada file yang terbuka.
Solusi 2:
Batasan ulimit adalah per pengguna unik. Jadi pengguna1, terlepas dari berapa kali masuk atau proses berjalan, akan dibatasi hingga 1024. Ini digabungkan.
Saya tidak yakin apakah saya benar-benar memahami arti kalimat itu (Bahasa Inggris bukan bahasa ibu saya) Jika kalimat itu berarti konfigurasi ulimit untuk deskriptor file bukan batasan per proses, jawaban yang diterima (AFAIK) salah.
Yang saya maksud adalah, jika beberapa pengguna telah meluncurkan 4 proses dan konfigurasi ulimit untuk FD adalah 1024, setiap proses dapat membuka 1024 FD. Pengguna tidak akan dibatasi hingga 1024 FD tetapi proses yang diluncurkan oleh pengguna tersebut.
Misalnya:
[email protected]:~$ ulimit -n
1024
[email protected]:~$ lsof | grep $USER | wc -l
8145
Berikut contoh perl di mana kami mencapai batas (ini adalah batas per proses):
#!/usr/bin/perl
$count = 0;
@filedescriptors;
while ($count <= 1024) {
$FILE = ${count};
open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
push(@filedescriptors, $FILE);
$count ++;
}
Hasil:
FDs: 1021 Too many open files at ./test.pl line 8.
1021 karena ada 3 deskriptor file terbuka sebelum mencapai while loop (stdout, stdin dan stderr)
Maaf jika saya benar-benar salah atau saya salah memahami jawabannya.