Nilai optimal untuk koneksi Nginx worker_connections

25

Nginx worker_connections"mengatur jumlah maksimum koneksi simultan yang dapat dibuka oleh proses pekerja. Nomor ini mencakup semua koneksi (misalnya koneksi dengan server proksi, antara lain), tidak hanya koneksi dengan klien. Pertimbangan lain adalah jumlah aktual koneksi simultan tidak dapat melebihi batas saat ini pada jumlah maksimum file terbuka ". Saya punya beberapa pertanyaan seputar ini:

  1. Apa yang harus menjadi nilai optimal atau yang direkomendasikan untuk ini?
  2. Apa kerugian menggunakan sejumlah besar koneksi pekerja?
Aarti
sumber
+1, pertanyaan bagus!
cnst

Jawaban:

31

Mari kita ambil pendekatan pragmatis.

Semua batasan ini adalah hal-hal yang di-hardcode dan dirancang pada abad yang lalu ketika perangkat keras lambat dan mahal. Kami berada di 2016 sekarang, pemanggang roti wall-mart rata-rata dapat memproses lebih banyak permintaan daripada nilai default.

Pengaturan default sebenarnya berbahaya. Memiliki ratusan pengguna di situs web bukanlah hal yang mengesankan.

proses pekerja_

Pengaturan terkait, mari kita jelaskan sementara kita berada di topik.

nginx sebagai penyeimbang beban:

  • 1 pekerja untuk menyeimbangkan beban HTTP.
  • 1 pekerja per inti untuk penyeimbangan beban HTTPS.

nginx sebagai webservers:

Yang ini rumit.

Beberapa aplikasi / framework / middleware (mis. Php-fpm) dijalankan di luar nginx. Dalam hal itu, 1 pekerja nginx sudah cukup karena biasanya aplikasi eksternal yang melakukan pemrosesan berat dan memakan sumber daya.

Juga, beberapa aplikasi / kerangka kerja / middleware hanya dapat memproses satu permintaan pada satu waktu dan itu bumerang untuk membebani mereka.

Secara umum, 1 pekerja selalu merupakan taruhan yang aman.

Jika tidak, Anda dapat menempatkan satu pekerja per inti jika Anda tahu apa yang Anda lakukan. Saya akan menganggap rute itu sebagai pengoptimalan dan menyarankan benchmarking dan pengujian yang tepat.

koneksi pekerja

Jumlah total koneksi adalah worker_process * worker_connections. Setengah dalam mode penyeimbang beban.

Sekarang kita mencapai bagian pemanggang. Ada banyak batasan sistem yang secara serius diremehkan:

  • ulimits adalah 1k max file terbuka per proses di linux (1k soft, 4k hard pada beberapa distro)
  • Batas systemd hampir sama dengan batas ulimit.
  • nginx default adalah 512 koneksi per pekerja.
  • Mungkin ada lebih banyak: SELinux, sysctl, supervisord (setiap versi + distro sedikit berbeda)

Koneksi pekerja 1k

Default amannya adalah meletakkan 1k di mana-mana.

Ini cukup tinggi untuk menjadi lebih dari sebagian besar situs internal dan tidak dikenal yang pernah akan ditemui. Cukup rendah untuk tidak mencapai batas sistem lainnya.

Koneksi pekerja 10k

Sangat umum memiliki ribuan klien, terutama untuk situs web publik. Saya berhenti menghitung jumlah situs web yang saya lihat turun karena standarnya rendah.

Minimum yang dapat diterima untuk produksi adalah 10rb. Batas sistem terkait harus ditingkatkan untuk memungkinkannya.

Tidak ada yang namanya batas terlalu tinggi (batas tidak akan berpengaruh jika tidak ada pengguna). Namun batas yang terlalu rendah adalah hal yang sangat nyata yang mengakibatkan pengguna ditolak dan situs mati.

Lebih dari 10rb

10rb bagus dan mudah.

Kami dapat menetapkan batas 1000kk yang sewenang-wenang (ini hanya batasnya saja) tetapi itu tidak masuk akal, kami tidak pernah mendapatkan lalu lintas itu dan tetap tidak bisa menerimanya.

Mari tetap berpegang pada 10k sebagai pengaturan yang masuk akal. Layanan yang mencari (dan benar-benar dapat melakukan) lebih banyak akan memerlukan penyetelan khusus dan pembandingan.

Skenario Khusus: Penggunaan Lanjutan

Terkadang, kami tahu bahwa server tidak memiliki banyak sumber daya dan kami berharap lonjakan yang tidak dapat kami lakukan banyak hal. Kami lebih suka menolak pengguna daripada mencoba. Dalam hal ini, masukkan batas koneksi yang masuk akal dan konfigurasikan pesan kesalahan dan penanganan yang baik.

Kadang-kadang, server backend bekerja dengan baik dan baik tetapi hanya sampai beberapa beban , apa pun lebih dan semuanya berjalan cepat ke selatan. Kami lebih suka memperlambat daripada memiliki server crash. Dalam hal ini, konfigurasikan antrian dengan batas yang ketat, biarkan nginx buffer semua panas saat permintaan dikeringkan dengan kecepatan maksimal.

pengguna5994461
sumber
Saya suka jawabannya tetapi untuk membuat tebakan yang benar-benar terdidik tentang seberapa tinggi seseorang harus menetapkan itu, tampaknya kita harus tahu kira-kira berapa banyak RAM yang dibutuhkan satu koneksi (misalnya untuk menyimpan file statis normal dengan sendfile) sehingga kita dapat berkembang biak ke menghitung berapa banyak RAM yang dibutuhkan untuk mempertahankan jumlah tertentu worker_connections.
nh2
1
Anda dapat melakukan hingga 10 ribu tanpa terlalu banyak menyetel. Buffer koneksi diatur dalam sysctlpengaturan.
user5994461
10

ulimit -a akan memberi tahu Anda berapa banyak file yang terbuka yang dapat digunakan oleh sistem Anda untuk digunakan.

Juga, net.ipv4.ip_local_port_rangetentukan rentang total soket yang memungkinkan per IP.

Jadi, Anda worker_connectionstidak boleh lebih dari itu, atau koneksi klien Anda akan mengantri sampai net.core.netdev_max_backlog- ukuran total antrian TCP.

Ingatlah bahwa jika Anda menggunakan nginx sebagai reverse-proxy, itu menggunakan dua soket per koneksi. Anda mungkin ingin bermain sedikit dengan net.ipv4.tcp_fin_timeoutdan timeout terkait kernel tcp lainnya untuk mencoba mengganti status soket dengan cepat. Hal lain yang perlu diperhatikan adalah bahwa setiap soket mengalokasikan memori dari tumpukan memori TCP, Anda juga dapat mengatur beberapa batasan dari tumpukan memori TCP menggunakan sysctl, Anda dapat memberikan lebih banyak tekanan dalam RAM selama Anda memiliki CPU dan penangan file yang cukup.

FYI dimungkinkan karena sumber daya komputasi yang cukup, untuk memiliki satu server dengan ram sekitar 32GB dan beberapa antarmuka jaringan virtual untuk menangani koneksi simultan 1MM dengan beberapa tuning kernel menggunakan sysctl. Selama pengujian saya ketika berhadapan dengan lebih dari 1MM dan mengirimkan payload sekitar 700Bytes server membutuhkan waktu sekitar 10 detik untuk memperbarui sekitar 1.2MM klien simultan. Selanjutnya adalah meningkatkan bandwidth jaringan dengan mengikat beberapa NIC tambahan dan membuang virtual nics. Adalah mungkin untuk mencapai pseudo near real-time communication dengan lebih dari 1.2MM klien, mengingat payload, bandwidth dan waktu yang wajar untuk memperbarui semua klien.

Selamat menyetel!

Marcel
sumber
tolong perbaiki perintah untuk ulimit bukan ulimits
Ali.MD
Catatan net.ipv4.ip_local_port_rangehanya relevan untuk koneksi keluar , tidak untuk koneksi masuk (seperti khas dengan nginx pada port misalnya 80 dan 443); lihat di sini .
nh2
@ nh2 tetapi jika seseorang menggunakan nginx sebagai proxy terbalik, setidaknya ada 2 soket yang terbuka untuk setiap koneksi klien, dan kemudian penting berapa banyak port lokal yang dapat diikat oleh kernel.
Marcel
Ya itu benar.
nh2
0

Ukuran yang tepat dapat ditemukan melalui pengujian, karena ini adalah variabel berdasarkan jenis lalu lintas yang ditangani Nginx.

Secara teoritis, nginx dapat menangani: klien maks = pekerja_proses * pekerja_koneksi (* = multiply) dan pekerja_processes = jumlah prosesor

Untuk mengetahui prosesor, gunakan: grep processor / proc / cpuinfo | wc -l

Sachin Gargya
sumber
Sebenarnya dengan proxy terbalik: max_clients = (worker_processes * worker_connections) / (X * 2) di mana X adalah banyak koneksi konkuren yang dilakukan klien kepada Anda. Selain itu, struktur koneksi digunakan untuk mendengarkan soket, soket kontrol internal antara proses nginx, dan untuk koneksi hulu. Jadi maks klien ini = proses pekerja_ * pekerja_ koneksi tidak akan berfungsi karena kami tidak tahu banyak koneksi yang digunakan dalam soket kontrol internal.
Aarti
0

Menetapkan batas bawah mungkin berguna saat Anda mengalami keterbatasan sumber daya. Beberapa koneksi, misalnya, koneksi tetap-hidup (tidak hanya dengan klien, tetapi dengan server hulu juga), secara efektif membuang sumber daya Anda (bahkan jika nginx sangat efisien, yang mana itu), dan tidak diperlukan untuk operasi yang benar dari server tujuan umum, yang berarti bahwa mereka dapat dengan aman dijatuhkan untuk membuat lebih banyak sumber daya yang tersedia untuk sisa operasi.

Dengan demikian memiliki batas sumber daya yang lebih rendah akan menunjukkan kepada nginx bahwa Anda mungkin memiliki sumber daya fisik yang rendah, dan yang tersedia harus dialokasikan untuk koneksi baru, daripada untuk melayani koneksi idle keep-live dengan mengorbankan koneksi yang lebih baru yang mengalami kesulitan membuat koneksi ke melayani kebutuhan yang lebih mendesak.

Apa nilai yang disarankan? Ini standarnya.

Defaultnya semua didokumentasikan dalam dokumentasi:

Default: worker_connections 512;

Dan dapat dikonfirmasi pada level kode sumber padaevent/ngx_event.c juga

13 # tentukan DEFAULT_CONNECTIONS 512

cnst
sumber
0

Jawaban Marcel benar-benar perlu ditingkatkan! Jika ulimits diatur ke nilai default sekitar 1k, max_connections harus ditetapkan sekitar nilai yang sama jika tidak, tidak ada manfaatnya untuk mengatur max_connections ke 10k.

Anda akan mendapatkan permintaan antrian dan soket ditutup pada nginx jika "koneksi pekerja_ Anda tidak boleh lebih dari itu, atau koneksi klien Anda akan mengantri sampai net.core.netdev_max_backlog - ukuran total antrian TCP."

Suatu proses tunggal dapat terbuka sebagai koneksi yang dimungkinkan oleh ulimits. num_workers * max_connections adalah rumus tetapi di luar loadbalancer / koneksi dan proksi maks perlu dipertimbangkan dengan nilai yang masuk akal. Mengatur max_connection ke nilai yang sangat tinggi dapat menjadi bumerang karena ulimits akan menjadi faktor pembatas.

Cryptophobia
sumber
1
Itu sebenarnya salah. Batas lunak pada desktop linux adalah 1k tetapi tidak mencegah proses menggunakan lebih dari itu jika mereka meminta, hingga batas keras (32k atau lebih). nginx akan meningkatkan ulimit secara otomatis jika max_connectionslebih tinggi dari batas lunak default.
user5994461