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:
- Apa yang harus menjadi nilai optimal atau yang direkomendasikan untuk ini?
- Apa kerugian menggunakan sejumlah besar koneksi pekerja?
Jawaban:
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:
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:
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.
sumber
sendfile
) sehingga kita dapat berkembang biak ke menghitung berapa banyak RAM yang dibutuhkan untuk mempertahankan jumlah tertentuworker_connections
.sysctl
pengaturan.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_range
tentukan rentang total soket yang memungkinkan per IP.Jadi, Anda
worker_connections
tidak boleh lebih dari itu, atau koneksi klien Anda akan mengantri sampainet.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_timeout
dan 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 menggunakansysctl
, 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!
sumber
net.ipv4.ip_local_port_range
hanya relevan untuk koneksi keluar , tidak untuk koneksi masuk (seperti khas dengan nginx pada port misalnya 80 dan 443); lihat di sini .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
sumber
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:
Dan dapat dikonfirmasi pada level kode sumber pada
event/ngx_event.c
jugasumber
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.
sumber
max_connections
lebih tinggi dari batas lunak default.