Terlalu banyak membuka file dengan nginx, sepertinya tidak dapat menaikkan batas

22

Servernya adalah Ubuntu 13.04 (GNU / Linux 3.9.3-x86_64-linode33 x86_64).

nginx adalah nginx / 1.2.6.

Saya sudah mengerjakan ini selama beberapa jam sekarang, jadi inilah yang saya dapatkan dan inilah yang saya lakukan.

tail -f /usr/local/nginx/logs/error.log
2013/06/18 21:35:03 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:04 [crit] 3427#0: accept4() failed (24: Too many open files)
2013/06/18 21:35:05 [crit] 3426#0: accept4() failed (24: Too many open files)

Nginx running:

geuis@localhost:~$ ps aux | grep nginx
root      3422  0.0  0.0  39292   380 ?        Ss   21:30   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    3423  3.7 18.8 238128 190848 ?       S    21:30   0:13 nginx: worker process      
nobody    3424  3.8 19.0 236972 192336 ?       S    21:30   0:13 nginx: worker process      
nobody    3426  3.6 19.0 235492 192192 ?       S    21:30   0:13 nginx: worker process      
nobody    3427  3.7 19.0 236228 192432 ?       S    21:30   0:13 nginx: worker process      
nobody    3428  0.0  0.0  39444   468 ?        S    21:30   0:00 nginx: cache manager process

Batas lunak / keras yang dimodifikasi di /etc/security/limits.conf (pengaturan dari akhir file)

root soft  nofile 65536
root hard  nofile 65536

www-data soft nofile 65536
www-data hard nofile 65536

nobody soft nofile 65536
nobody hard nofile 65536

Pembacaan file maks

cat /proc/sys/fs/file-max
500000

Dan di /etc/pam.d/common-session:

session required pam_limits.so

Dengan ini ditambahkan dan server restart untuk ukuran yang baik, untuk nginx saya menghitung batas lunak / keras dengan mendapatkan PID proses induk dan:

cat /proc/<PID>/limits
Limit                     Soft Limit           Hard Limit           Units     
Max open files            1024                 4096                 files     

Proses induk berjalan sebagai 'root' dan 4 pekerja berjalan sebagai 'tidak ada'.

root      2765  0.0  0.0  39292   388 ?        Ss   00:03   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    2766  3.3 17.8 235336 180564 ?       S    00:03   0:21 nginx: worker process      
nobody    2767  3.3 17.9 235432 181776 ?       S    00:03   0:21 nginx: worker process      
nobody    2769  3.4 17.9 236096 181524 ?       S    00:03   0:21 nginx: worker process      
nobody    2770  3.3 18.3 235288 185456 ?       S    00:03   0:21 nginx: worker process      
nobody    2771  0.0  0.0  39444   684 ?        S    00:03   0:00 nginx: cache manager process

Saya sudah mencoba semua yang saya tahu bagaimana melakukannya dan telah dapat saya peroleh dari Google. Saya tidak bisa mendapatkan batas file untuk nginx meningkat.

Membantu?

Geuis
sumber

Jawaban:

32

Tambahkan baris berikut ke nginx Anda dan mulai ulang proses:

worker_rlimit_nofile 30000;

Ini akan memungkinkan para pekerja untuk mengambil lebih banyak file. Anda kemudian dapat memverifikasi dengan:

su - nobody
ulimit -Hn
ulimit -Sn

Ini akan menghasilkan batas keras / lunak baru.

Referensi

Nathan C
sumber
6
Jika Anda hanya mengubah worker_rlimit_nofilepengaturan uWSGI dan bukan batas sistem (yang berfungsi untuk saya), Anda tidak dapat memverifikasinya melalui ulimit. Sebaliknya, Anda harus melihat langsung /proc/<pid of worker>/limits.
Jan Fabry
Saya pikir pengguna (tidak ada / www-data) harus keluar dan kembali. Yaitu. restart server. ulimit bagi saya menunjukkan bahwa ini meningkat, tetapi prosesnya masih terbatas sesuai kucing / proc / {pid} / Limit
felix
@ Feliks OP menyebutkan mereka sudah me-restart server, tapi ya, ini diperlukan.
Nathan C
3

Di Ubuntu, edit /etc/pam.d/su tambahkan atau batalkan komentar pada sesi baris yang diperlukan pam_limits.so

Juga, di /etc/security/limits.conf pastikan Anda memiliki TABS antara karakter dan bukan spasi.

Rusty Hodge
sumber
1

pastikan Anda menjalankan perintah berikut setelah mengedit file-file itu

sysctl -p

Kemudian mulai kembali nginx

Mike
sumber
1
Tidak berpengaruh. Batasnya tetap sama.
Geuis