memahami max file descriptors untuk linux dan nginx, dan nilai terbaik untuk worker_rlimit_nofile

10

Saya mendapat kesalahan "nampaknya terlalu banyak deskriptor file" pada nginx. Setelah banyak mencari, solusinya jelas untuk meningkatkan jumlah deskriptor file yang tersedia untuk nginx. Tetapi tidak ada info yang cukup di luar sana bagi saya untuk merasa nyaman melakukan ini dengan cara yang bermakna dan aman. Berikut adalah poin-poin utama yang dibahas oleh sebagian besar forum / email:

  • OS memiliki batas deskriptor file total sendiri (pada sistem saya, cat /proc/sys/fs/file-maxoutput "100678")
  • setiap pengguna juga dapat memiliki batasnya sendiri (tetapi di sistem saya, berjalan ulimitkarena setiap pengguna menampilkan "tidak terbatas" lihat pembaruan di bagian bawah dengan lebih detail )
  • beberapa orang mengatakan sesuatu seperti apa yang dikatakan orang ini : 'Directive worker_rlimit_nofile tidak menentukan "berapa banyak", itu adalah batas sistem operasi yang berlaku. Directive worker_rlimit_nofile hanya memungkinkan cara cepat dan kotor untuk memperbesar batas ini jika itu tidak cukup. ' Jadi saya kira implikasinya adalah bahwa "lebih baik" untuk menetapkan batas untuk pengguna OS nginx daripada di konfigurasi?

Saya hanya bisa memasukkan nilai worker_rlimit_nofile lebih besar dari jumlah koneksi per pekerja dan menyebutnya sehari, tapi saya merasa saya tidak benar-benar tahu apa yang terjadi di sini.

  • mengapa batas per pekerja lebih kecil dari batas OS?
  • Bagaimana cara mengetahui batas saya sekarang?

pembaruan : untuk root dan pengguna normal, keluaran ulimit "tidak terbatas", TETAPI ulimit -Hndan ulimit -Snkeduanya keluaran 1024

John Bachir
sumber

Jawaban:

10

worker_rlimit_nofileakan menetapkan batas untuk deskriptor file untuk proses pekerja sebagai lawan dari pengguna yang menjalankan nginx. Jika program lain yang berjalan di bawah pengguna ini tidak akan dapat menangani kehabisan deskriptor file dengan anggun maka Anda harus menetapkan batas ini sedikit kurang dari apa yang untuk pengguna.

Pertama, Apa yang menggunakan deskriptor file Anda?

  1. Setiap koneksi aktif ke klien
  2. Menggunakan proxy_pass? Itu akan membuka soket ke host: port menangani permintaan ini
  3. Menggunakan proxy_pass ke port lokal? Itu soket terbuka lain. (Untuk pemilik proses itu)
  4. file statis dilayani oleh nginx

Mengapa batas per pekerja lebih kecil dari batas OS?

Ini dikendalikan oleh OS karena pekerja bukan satu-satunya proses yang berjalan pada mesin. Untuk mengubahnya untuk pengguna yang menjalankan nginx lihat di bawah. Akan sangat buruk jika pekerja Anda menggunakan semua deskriptor file yang tersedia untuk semua proses, jangan menetapkan batas Anda sehingga itu mungkin.

#/etc/sysctl.conf
#This sets the value you see when running cat  /proc/sys/fs/file-max
fs.file-max = 65536"


#/etc/security/limits.conf
#this sets the defaults for all users
* soft nofile 4096
* hard nofile 4096

#This overrides the default for user `usernamehere`
usernamehere soft nofile 10240
usernamehere hard nofile 10240

Setelah perubahan batas keamanan itu, saya yakin saya masih harus meningkatkan softlimit untuk pengguna ulimit.

Bagaimana cara mengetahui batas saya sekarang?

ulimit -a Akan menampilkan semua batas yang terkait dengan pengguna Anda menjalankannya.

Dan R
sumber
1
Terima kasih - sekarang saya telah meningkatkan batas deskriptor file, saya kehabisan koneksi. Mungkin Anda dapat membantu saya dengan itu juga :) serverfault.com/questions/209014/...
John Bachir
1
Catatan untuk pengguna CentOS / Fedora, jika Anda memiliki SELinux diaktifkan, Anda harus menjalankan setsebool -P httpd_setrlimit 1sehingga nginx memiliki izin untuk mengatur rlimit-nya.
Jarrett
2

Harus memeriksa sumber untuk jujur, tetapi cukup rendah.

Saya menggunakan worker_rlimit_nofile 15000;dan tidak memiliki masalah, Anda dapat dengan aman meningkatkannya, meskipun, kemungkinan kehabisan file deskriptor sangat kecil.

Martin Fjordvald
sumber