Kiat untuk memaksimalkan permintaan Nginx / detik?

15

Saya sedang membangun paket analitik, dan persyaratan proyek menyatakan bahwa saya perlu mendukung 1 miliar hit per hari. Yap, "miliar". Dengan kata lain, tidak kurang dari 12.000 hit per detik dipertahankan, dan lebih disukai beberapa ruang untuk meledak. Saya tahu saya akan membutuhkan beberapa server untuk ini, tetapi saya mencoba untuk mendapatkan kinerja maksimal dari setiap node sebelum "melemparkan lebih banyak perangkat keras padanya".

Saat ini, saya telah menyelesaikan bagian pelacakan-pelacakan, dan dioptimalkan dengan baik. Saya cukup banyak hanya menyimpan permintaan langsung ke Redis (untuk diproses nanti dengan Hadoop). Aplikasi ini adalah Python / Django dengan gunicorn untuk gateway.

Server Rackspace 2GB Ubuntu 10,04 saya (bukan mesin produksi) dapat melayani sekitar 1.200 file statis per detik (diperbandingkan menggunakan Apache AB terhadap aset statis tunggal). Sebagai perbandingan, jika saya menukar tautan file statis dengan tautan pelacakan saya, saya masih mendapatkan sekitar 600 permintaan per detik - saya pikir ini berarti pelacak saya dioptimalkan dengan baik, karena itu hanya faktor 2 lebih lambat daripada melayani aset statis yang sama berkali-kali.

Namun, ketika saya melakukan benchmark dengan jutaan hit, saya perhatikan beberapa hal -

  1. Tidak ada penggunaan disk - ini diharapkan, karena saya telah mematikan semua log Nginx, dan kode khusus saya tidak melakukan apa pun selain menyimpan detail permintaan ke Redis.
  2. Penggunaan memori yang tidak konstan - Mungkin karena pengelolaan memori Redis, penggunaan memori saya secara bertahap akan naik dan turun kembali, tetapi itu tidak pernah menjadi hambatan saya.
  3. Beban sistem berkisar sekitar 2-4, sistem ini masih responsif bahkan selama tolok ukur terberat saya, dan saya masih dapat melihat secara manual http://mysite.com/tracking/pixel dengan sedikit keterlambatan yang terlihat sementara server saya (lainnya) melakukan 600 permintaan per kedua.
  4. Jika saya menjalankan tes singkat, katakan 50.000 hit (membutuhkan sekitar 2m), saya mendapatkan 600 permintaan yang stabil dan dapat diandalkan per detik. Jika saya menjalankan tes yang lebih lama (mencoba sejauh 3,5m sejauh ini), r / s saya menurun menjadi sekitar 250.

Pertanyaan saya --

Sebuah. Apakah sepertinya saya memaksimalkan server ini? Apakah 1.200 / s file statis kinerja nginx sebanding dengan apa yang orang lain alami?

b. Apakah ada penyetelan nginx umum untuk aplikasi volume tinggi seperti itu? Saya memiliki thread pekerja diatur ke 64, dan thread pekerja gunicorn diatur ke 8, tetapi mengutak-atik nilai-nilai ini tampaknya tidak banyak membantu atau membahayakan saya.

c. Apakah ada pengaturan tingkat linux yang dapat membatasi koneksi masuk saya?

d. Apa yang dapat menyebabkan kinerja saya menurun ke 250r / s pada tes yang berjalan lama? Sekali lagi, memori tidak maksimal selama pengujian ini, dan penggunaan HDD tidak ada.

Terima kasih sebelumnya, semua :)

EDIT Ini adalah konfigurasi nginx saya - http://pastie.org/1450749 - sebagian besar adalah vanila, dengan lemak yang jelas dipangkas.

tertaut tertaut
sumber
Anda membuat beberapa pertanyaan dalam satu posting, pertimbangkan untuk merevisinya. Saya hanya membuat komentar dan bukan jawaban, karena saya tidak bisa menjawab semua bagian. Saya berasumsi Anda telah mempertimbangkan kinerja Python / Django - itu tidak ideal untuk kecepatan ekstrim. Mengenai 1200 req / s, kedengarannya sangat sangat rendah untuk apa yang saya asumsikan adalah respons 1px gif atau HTTP 204. Lihat fx simonhf.wordpress.com/2010/10/02/nginx-versus-sxe-hello-world (24k req / s, berjalan di localhost, tetapi hanya menggunakan 1 pekerja nginx.)
Jesper M
Komentar tambang emas, terima kasih banyak. Saya akan membaca posting dan kembali dengan temuan saya; terima kasih untuk petunjuk "banyak pertanyaan"!
linkedlinked

Jawaban:

8

Anda melecehkan pekerja_threads Nginx. Sama sekali tidak perlu menjalankan banyak pekerja. Anda harus menjalankan pekerja sebanyak yang Anda punya CPU dan menyebutnya sehari. Jika Anda menjalankan gunicorn di server yang sama, Anda mungkin harus membatasi pekerja nginx menjadi dua. Jika tidak, Anda hanya akan menghancurkan CPU dengan semua pergantian konteks yang diperlukan untuk mengelola semua proses itu.

blueben
sumber
1
Ah terima kasih. Performa tampak hampir sama dengan 64 seperti halnya dengan 2, tapi saya tahu tidak WTF lakukan. Terima kasih telah mengklarifikasi.
linkedlinked
Bisakah Anda membagikan konfigurasi Nginx Anda? Sulit untuk memberikan tip tuning ketika kita tidak tahu apa yang kita tuning.
blueben
2

Saya telah menggunakan nginx untuk melayani permintaan 5K per detik untuk konten statis. Anda dapat menambah jumlah koneksi pekerja yang saat ini diatur ke 1024.

Perhitungan max_client adalah sebagai berikut.

Pekerja_koneksi dan proses pekerja_dari bagian utama memungkinkan Anda untuk menghitung nilai maksclients:

max_clients = proses pekerja_ * koneksi pekerja_

Dalam situasi proxy terbalik, max_clients menjadi

max_clients = proses pekerja_ * pekerja_ koneksi / 4

http://wiki.nginx.org/EventsModule#worker_connections

Menghitung koneksi pekerja maks mudah setelah Anda mengetahui kapasitas pengaturan Anda. Total kapasitas / jumlah inti adalah koneksi pekerja maks. Untuk menghitung kapasitas total ada beberapa cara.

  1. Saya sarankan Anda mencoba dan membandingkan pengaturan Anda yang akan memberi Anda angka paling realistis. Anda dapat menggunakan alat-alat seperti pengepungan, pukulan, bangku apache dll, jangan lupa untuk mengukur penggunaan sumber daya sistem di saat pengujian.

Jika Anda metode di atas tidak berhasil, cobalah metode di bawah ini. Saya melakukan asumsi luas dengan mengabaikan RAM dan IO, mereka juga akan memperhitungkan tetapi ini akan memberi Anda titik awal dan Anda dapat membuat penyesuaian dari sana.

  1. Asumsikan bahwa bandwidth adalah bottleneck, ambil ukuran objek rata-rata yang dilayani nginx dan bagi bandwidth Anda dengan itu dan Anda akan mendapatkan qps yang didukung maksimal.

  2. Dalam asumsi kedua, CPU adalah hambatan. Dalam hal ini, ukur waktu permintaan dan bagi 1 dengan permintaan tersebut dan gandakan dengan jumlah core di sistem Anda. Ini akan memberikan jumlah permintaan per detik yang bisa ditangani nginx.

Sameer
sumber
Bagaimana cara menentukan apakah Anda dapat meningkatkan pekerja_ koneksi dan apa pengaturan yang ideal untuk server yang diberikan?
Kato
Ada beberapa cara untuk melakukannya.
Sameer