Nilai optimal untuk arahan ServerLimit, MaxClients, MaxRequestsPerChild

29

Saya menjalankan situs padat lalu lintas banyak konten dinamis, sebagian besar dihasilkan oleh pengguna.

Server ini berdedikasi dan memiliki total 4 prosesor Intel (R) Xeon (R) CPU X3210 @ 2.13GHz. Saya perlu tahu nilai-nilai optimal untuk arahan ServerLimit dan MaxClients, mengingat server memiliki RAM 4GB dan basis data MySQL berjalan pada server terpisah. Panel adalah DirectAdmin dengan CentOS.

Di bawah ini adalah arahan saya saat ini, tetapi selama jam sibuk dengan lebih dari 5k pengguna, ada kelambatan penting - dan ini bukan kesalahan MySQL secara keseluruhan, karena halaman tampaknya dihasilkan dengan cepat (saya menerapkan penghitung waktu pembuatan halaman), tetapi ada panjang penundaan koneksi hingga halaman mulai merespons dan dikirim ke browser.

<IfModule prefork.c>
    StartServers     800
    MinSpareServers   20
    MaxSpareServers   60
    ServerLimit      900
    MaxClients       900
    MaxRequestsPerChild  2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5

Saya harus menyebutkan bahwa pemantauan server menggunakan perintah teratas, penggunaan CPU tidak pernah melampaui 20% ~ 30% pada jam sibuk. Server MySQL juga memiliki penggunaan 30 ~ 50% pada waktu itu, dan saya terus berupaya memperbaiki kueri lambat, tapi itu masalah yang berbeda. Saya tahu ini bukan hambatan DB karena halaman statis juga butuh waktu lama untuk memuat pada jam sibuk.

Setiap tips untuk mengoptimalkan nilai-nilai ini akan sangat dihargai, terima kasih.

andreszs
sumber

Jawaban:

24

MaxClients Anda WAY WAY WAY terlalu tinggi. Berapa ukuran proses apache Anda saat ini? Lipat gandakan itu 900. Apakah itu lebih besar dari 4GB? Jika demikian, mesin kemungkinan akan beralih. Saya biasanya mulai dengan MaxClients = 2x vCPU di dalam kotak (grep -c processor / proc / cpuinfo). Yang dalam hal ini akan menjadi sekitar 8. Kemudian pastikan ukuran proses MaxClients x apache tidak lebih dari 4GB.

Anda dapat meningkatkan MaxClients Anda dari sana, tergantung pada jenis koneksi yang dimiliki klien Anda. (Pengguna dial-up perlu ditipu, dll.) Tetapi pastikan Anda tidak pernah mendapatkan diri Anda dalam situasi pertukaran.

Kemudian atur Min, Max, dan Mulai server Anda ke MaxClients. Tidak perlu ada perbedaan di lingkungan server khusus.

Kemudian lakukan beberapa pengujian dengan ab (seperti catatan angsa.)

terguling
sumber
Untuk beberapa alasan tampaknya saya menentukan ukuran proses salah ... sekarang saya melihat di perintah atas bahwa proses apache RESIDENT SIZE berkisar dari 10 hingga 15MB. Saya membaca di suatu tempat bahwa karena perpustakaan bersama termasuk dalam angka ini, ukuran "asli" adalah setengah dari ukuran itu. Mempertimbangkan hal ini saya harus menghitung bahwa saya dapat mengakomodasi 570 proses masing-masing berukuran 7 MB, apakah Anda pikir ini benar?
andreszs
Saya sarankan Anda menggunakan 15 MB untuk perhitungan dan kemudian mulai memeriksa metrik: # proses http vs penggunaan memori. Ini akan memberi Anda ide yang lebih baik untuk jumlah MaxClients
hdanniel
1
Saya menurunkannya menjadi 400 dan bahkan sebelum jam puncak hasilnya memiliki efek sebaliknya dari yang diinginkan: Nilai apa pun yang lebih rendah dari aslinya membuat batas waktu dan penundaan lama. Bahkan sekarang saya meningkatkannya menjadi 1500 klien dan penggunaan memori sekarang pada 3 GB sedangkan penggunaan CPU rata-rata adalah 8%. Tentu saja ada lebih banyak memuat pada SQL server sekarang dan saya harus bekerja di dalamnya.
andreszs
Inilah perintah htop saya sekarang, 1500 proses apache dan hampir 100 proses sistem. Ini dengan 75% penggunaan RAM. a.imagehost.org/0011/htop.png Jika Anda mempertimbangkan kembali formula Anda? ;)
andreszs
1
Inilah sebabnya mengapa Anda perlu melakukan pengujian di lingkungan Anda sendiri. Kami memiliki akselerator http di depan apache kami sehingga mereka tidak menyendok pengguna ponsel. Aplikasi Anda juga tampak sangat ringan. Jika Anda telah memindahkan beban ke DB Anda yang memberitahu saya bahwa lebih dari proses-proses apache sebenarnya melayani data vs duduk dan menunggu koneksi mysql. Yang kemudian membuat saya bertanya berapa banyak koneksi yang Anda izinkan ke DB Anda? Apakah angka itu melebihi MaxClients Anda? Apakah Anda memiliki 5.000 koneksi simultan? Jika demikian, Anda mungkin ingin melihat sesuatu seperti perlbal di depan.
toppledwagon
5

Anda perlu mendapatkan ukuran rata-rata proses apache Anda. Dengan nomor ini dan ukuran total RAM Anda, Anda dapat menghitung arahan MaxClients. Ingat ini: "Server web tidak boleh pernah bertukar" ( Apache Performance Tuning )

Pemantauan dengan top atau htop tidak apa-apa, tetapi Anda memerlukan pandangan yang lebih baik dari semua statistik server Anda (cpu, ram, disk i / o, permintaan apache, permintaan lambat mysql, dll ...) dengan beberapa alat pemantauan seperti ganglia atau munin untuk temukan kemungkinan kemacetan.

hdanniel
sumber
Untuk saat ini saya hanya memiliki perintah top dan htop, dan saya tidak dapat memahami semua informasinya. Ini adalah aktivitas kemarin di jam sibuk, sepertinya tidak ada pertukaran; tolong beri tahu saya jika saya salah: Tugas: total 1043, 2 berlari, 1041 tidur, 0 berhenti, 0 zombie Cpu (s): 13,8% kami, 1,8% sy, 0,0% ni, 82,1% id, 0,8% wa, 0,0% hi, 1,5% si, 0,0% st Mem: 4138360k total, 3961276k digunakan, 177084k gratis, 75016k buffer Tukar: 2031608k total, 1484k digunakan, gratis 2030124k, 1836600k di-cache
andreszs
Ya, server Anda tidak bertukar. Saya lebih suka metrik kehidupan nyata tetapi jika mau, Anda dapat menggunakan alat yang menekan seperti ab atau httperf untuk memeriksa seberapa banyak server Anda dapat menangani. Untuk pengujian, berhati-hatilah dengan MaxClients dan mulailah dengan angka rendah (berdasarkan asumsi 15MB).
hdanniel
4

Saya merekomendasikan bermain-main dengan alat benchmark (ab) apache. Anda dapat bermain-main dengan nilai-nilai untuk mencocokkannya dengan arus lalu lintas Anda dan melihat apa jenis respons yang Anda dapatkan sejauh waktu buka rata-rata & sejenisnya. Pada titik itu Anda dapat bermain-main dengan pengaturan yang sedang Anda bicarakan untuk mencoba dan mengoptimalkannya. Anda harus dapat dengan ab untuk menangani kinerja yang optimal untuk setiap tweak kinerja.

Ini tidak benar-benar bijaksana bagi saya untuk berbicara tentang pengaturan Anda, namun Anda juga perlu mempertimbangkan RAM Anda juga karena sepertinya Anda memakan banyak RAM dengan pengaturan itu. Meskipun itu hanya spekulasi tanpa data. htop memberi Anda pembacaan visual yang baik tentang sumber daya Anda.

Rata-rata beban Anda juga bisa dikatakan banyak. Saya ragu bahwa penggunaan Anda jauh lebih tinggi dari jumlah total inti Anda dari 20-30% CPU, tetapi ini merupakan indikator seberapa keras server Anda benar-benar berfungsi.

angsa
sumber
Masalahnya adalah saya tidak cukup berpengalaman dalam administrasi server sehingga mulai bermain-main dengan settigns dan memantau hasilnya .. Saya tidak pernah menggunakan alat ab untuk jujur. Juga mengubah nilai memerlukan restart HTTDP, yang menyebabkan ketidaknyamanan bagi pengguna saya jadi saya lebih suka untuk menghindari ini. Bayangkan Anda mengirim pesan ke pengguna lain dan setelah Anda mengklik "Kirim", Anda mendapatkan masalah koneksi Server. Pada penggunaan CPU, lihat info dari komentar saya sebelumnya: itu tidak melampaui 15% pada jam sibuk. Saya pikir itu cukup dapat diterima mengingat saya memiliki 6000 pengguna online kemarin.
andreszs
Yah saya pasti tidak ingin Anda melakukan ini di lingkungan produksi. Saya sarankan melakukan ini pada waktu lalu lintas terendah Anda jika server lain (dengan perangkat keras yang sangat mirip jika tidak identik) untuk menguji. ab cukup mudah digunakan, tetapi saya pasti berpikir bahwa toppledwagon memberikan instruksi yang baik untuk menghitung MaxClients Anda. Setelah Anda berhenti menggunakan ruang swap, Anda akan melihat peningkatan yang pasti. periksa httpd.apache.org/docs/2.0/programs/ab.html dan cyberciti.biz/tips/… untuk AB
goose