Terlalu banyak membuka file di Debian

15

Saya memiliki proses yang berjalan lama di Debian. Pada suatu saat ada kesalahan:

Terlalu banyak file yang terbuka.

Berlari:

ulimit -a

menunjukkan:

buka file (-n) 1024

Saya ingin menambah jumlah file terbuka dalam 2 kali. Setelah eksekusi

ulimit -n 2048

batas aktif sampai akhir sesi saya, yang tidak berlaku untuk tugas tersebut.

Bagaimana saya bisa meningkatkan jumlah file terbuka secara permanen?

FoxyBOA
sumber

Jawaban:

12

Jika proses Anda dimulai melalui skrip, Anda dapat menempatkan panggilan untuk ulimit dalam skrip sesaat sebelum menjalankan daemon.

Jika Anda ingin meningkatkan ulimit untuk pengguna Anda, atau untuk semua pengguna, Anda dapat menetapkan batas yang diterapkan melalui pam_limitslogin. Ini diatur dalam /etc/security/limits.conf. Dalam kasus Anda, Anda dapat melakukan sesuatu seperti:

*               hard    nofile             2048

Perhatikan bahwa "keras" menunjukkan batas keras - batas yang tidak dapat dilampaui, dan tidak dapat diubah. Batas lunak dapat diubah oleh pengguna (mis. Seseorang tanpa kemampuan root), tetapi tidak melampaui batas keras.

Baca limits.confuntuk informasi lebih lanjut tentang cara menggunakan pam_limits.

Daniel Lawson
sumber
Pada batas conf saya memiliki 2 baris: * soft nofile 4096 * hard nofile 8192 Yang tidak memiliki efek.
FoxyBOA
Dan Anda sudah logout dan masuk lagi sejak mengujinya? Ini akan berarti keluar langsung dari X / GNOME / KDE dll, jika Anda mencoba ini di mesin lokal
Daniel Lawson
Iya. /etc/security/limits.conf tidak berfungsi untuk saya. Saya akan mencoba pendekatan kedua.
FoxyBOA
3
/etc/security/limits.conf hanya berfungsi untuk layanan yang menggunakan pam dan modul pam pam_limits (lihat /etc/pam.d/ untuk konfigurasi PAM untuk setiap layanan dan /etc/pam.d/common-* khususnya) . Dengan demikian itu menyangkut semua sesi pengguna yang dibuat oleh sshd, gdm, login, dll. Itu tidak menyangkut semua program yang dimulai saat boot ...
Raphaël Hertzog
Saya memang mengatakan sesuatu tentang efek itu, tetapi terima kasih telah menjelaskannya. OP belum menjelaskan apakah itu layanan atau proses yang dijalankan penggunanya.
Daniel Lawson
13

Ada juga "total maks" dari file terbuka yang diatur dalam kernel, Anda dapat memeriksa pengaturan saat ini dengan:

cat /proc/sys/fs/file-max 

Dan tetapkan nilai baru dengan:

echo "104854" > /proc/sys/fs/file-max

Jika Anda ingin menjaga konfigurasi antara reboot tambahkan

sys.fs.file-max=104854

untuk

/etc/sysctl.conf

Untuk memeriksa penggunaan file maks saat ini:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)
rkthkr
sumber
1
Perhatikan bahwa jika deskriptor file yang dialokasikan gratis menunjukkan 0, itu hanya berarti bahwa jumlah file yang dialokasikan benar-benar cocok dengan jumlah file yang digunakan.
tacotuesday
Tambang menunjukkan beberapa nomor cabul di sini: 49152 0 18446744073709551615 . Saya tidak mengerti mengapa dua kolom pertama tidak bertambah hingga yang ketiga. Dan jika saya memiliki 1,8 triliun triliun yang tersedia, saya tidak melihat bagaimana saya menggunakan semuanya.
mlissner
4

Seperti yang dikatakan orang lain, Anda dapat menerapkan batasan spesifik per pengguna atau grup di /etc/security/limits.conf.

Catatan: ulimit -n menunjukkan batas lunak.

ulimit -H -n 

akan menunjukkan batas keras.

Ini membuat ulimit -a dan ulimit -n keluaran cukup membingungkan jika misalnya, Anda menaikkan jumlah file dari 1024 ke 4096, seperti yang Anda harapkan untuk melihat output batas keras, tetapi Anda masih melihat 1024 yang merupakan soft membatasi.

Juga, ingatlah bahwa batasan ini diberlakukan per login, jadi login kembali di shell baru dan periksa perubahan Anda, jangan berharap mereka akan disebarkan ke login yang ada.

Tom Feiner
sumber
2

Ketahuilah bahwa jika Anda menjalankan proses Anda dengan memulai ulimits pengaturan start-stop-daemon di /etc/security/limits.conf tidak berfungsi. Jika Anda misalnya ingin menaikkan batas file terbuka untuk kucing jantan ke 20000, Anda perlu menambahkan ini ke baris ke /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Saya mengalami masalah ini pada debian 6.0.4 Untuk proses lain jawaban yang diberikan akan membantu.

Janning
sumber
1

Itu tergantung pada bagaimana Anda memulai proses jangka panjang Anda. Jika dimulai saat boot (via /etc/rcX.d/* skrip) maka Anda harus memasukkan panggilan ulimit ke skrip startup Anda karena batas defaultnya ditentukan oleh kernel dan itu tidak dapat disetel tanpa mengkompilasi ulang.

Menggunakan /etc/security/limits.confbisa berfungsi jika Anda menggunakannya cronuntuk memulainya misalnya dengan entri seperti ini:

@reboot $HOME/bin/my-program

Itu seharusnya bekerja karena /etc/pam.d/cron mengaktifkan pam_limits.so.

Raphaël Hertzog
sumber
-1

Anda dapat menambahkan ini di /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

simpan lalu reboot.

kxmp
sumber
3
Apakah ada sesuatu yang baru di sini yang tidak ada dalam jawaban yang diterima untuk pertanyaan berusia 5 tahun ini?
Andrew Schulman
-2

Perintah yang sangat bagus adalah ulimit -ntetapi ada masalah dengan terlalu banyak koneksi dan terlalu banyak file yang terbuka:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
obrolan
sumber
Saya mencoba untuk membersihkan jawaban Anda, tetapi saya masih tidak jelas apa yang Anda katakan pada pertanyaan poster asli. Bisakah Anda mencoba dan membersihkan ini lebih lanjut?
slm
Juga ini adalah output ulimit -a, bukan ulimit -n.
Yvan