Tuning Apache2 prefork MaxClients ServerLimit

22

Saya memiliki mesin dengan Ram 128 GB yang menggunakan Apache2 sebagai Webserver (di mesin ini tidak ada Database Server, Mesin Database adalah mesin Ram 64 GB yang dapat menangani 2000 koneksi maks). Saya melihat dengan alat pemantauan bahwa saat ini ada sekitar 44 pekerja sibuk dan 12 pekerja menganggur, apa nilai teoritis terbaik untuk modul prefork saya?

saya mendapat halaman kosong terkadang memuat situs web pada jam buka tinggi dan mendapatkan kesalahan ini di log kesalahan apache saya:

[pemberitahuan] child pid 13595 sinyal keluar Kesalahan segmentasi (11)

bagaimana bisa mengatasi masalah ini juga?

Konfigurasi Modul Prefork Apache2 Saya:

StartServers          3
MinSpareServers       3
MaxSpareServers       5
ServerLimit           3200
MaxClients            3100
MaxRequestsPerChild   0

Bebas-h di Mesin www :

total: 128 G gratis: 97GB (dengan menjalankan apache2) membagikan 0b buffer 1,9G cache 23G

Ram digunakan oleh Apache2 dan Program lainnya:

Private  +   Shared  =  RAM used    Program

 96.0 KiB +  61.0 KiB = 157.0 KiB   sh
176.0 KiB +  26.0 KiB = 202.0 KiB   atd
176.0 KiB +  35.5 KiB = 211.5 KiB   acpid
208.0 KiB +  19.5 KiB = 227.5 KiB   mdadm
204.0 KiB +  30.0 KiB = 234.0 KiB   init
248.0 KiB +  62.0 KiB = 310.0 KiB   sendmail
376.0 KiB +  36.0 KiB = 412.0 KiB   dbus-daemon
388.0 KiB + 285.5 KiB = 673.5 KiB   cron (2)
820.0 KiB +  42.0 KiB = 862.0 KiB   gam_server
920.0 KiB + 108.0 KiB =   1.0 MiB   ntpd
968.0 KiB + 243.0 KiB =   1.2 MiB   getty (6)
  1.3 MiB + 351.5 KiB =   1.6 MiB   udevd (3)
  1.5 MiB + 343.0 KiB =   1.8 MiB   sendmail-msp
  2.0 MiB + 910.0 KiB =   2.9 MiB   plugin-localresources2
  3.4 MiB +  50.0 KiB =   3.4 MiB   rsyslogd
  3.6 MiB +  68.5 KiB =   3.7 MiB   bash
  1.9 MiB +   2.1 MiB =   4.0 MiB   sendmail-mta (4)
  3.8 MiB + 556.0 KiB =   4.3 MiB   sshd (2)
  3.7 MiB +   1.2 MiB =   4.8 MiB   plugin-apache2
  5.1 MiB +   1.2 MiB =   6.3 MiB   agent-service
  7.0 MiB + 654.0 KiB =   7.6 MiB   fail2ban-server
  9.6 MiB +   2.6 MiB =  12.2 MiB   proftpd (8)
 59.2 MiB +  70.0 KiB =  59.3 MiB   miniserv.pl
 96.8 MiB +   3.6 MiB = 100.4 MiB   php5-cgi (2)
196.4 MiB +  35.9 MiB = 232.3 MiB   apache2 (40)
---------------------------------
                     tot 450.0 MiB
Pengguna-N
sumber
2
Apa kode aplikasi yang berjalan di dalam server web? Kemungkinan besar pelakunya.
Shane Madden
silakan kirim beberapa sampel status apache2ctl; apakah ada sesuatu di error_log mungkin?
Hrvoje Špoljar

Jawaban:

63

Pengaturan prefork Apache, per pedoman penyesuaian kinerja apache

mengutip:

The single biggest hardware issue affecting webserver performance is RAM.
A webserver should never ever have to swap, as swapping increases the latency
of each request beyond a point that users consider "fast enough". 
This causes users to hit stop and reload, further increasing the load.
You can, and should, control the MaxClients setting so that your server does
not spawn so many children it starts swapping. This procedure for doing this
is simple: determine the size of your average Apache process, by looking at
your process list via a tool such as top, and divide this into your total 
available memory, leaving some room for other processes.

Anda harus mengaturnya seperti ini berdasarkan masukan Anda ke:

  • Total Memori: 128 GB
  • -10% memori untuk semuanya kecuali apache: 115 GB
  • Sekarang kita perlu mencari tahu berapa banyak proses apache tunggal menggunakan.

Untuk menghitung ini, Anda dapat menggunakan skrip berikut:

pgrep apache2 | xargs -n1 -I{} cat /proc/{}/smaps | \
  awk '{if ($0 ~ /stack/) {pids+=1} else if ($0 ~/^Shared_/) 
    {shared+=$2} else if ($0 ~ /^Pss:/) {priv+=$2}} END {
      printf "%.2f MB\n",(priv+shared/(pids*pids))/1024}'

Ini adalah perkiraan terbaik tentang berapa banyak proses apache tunggal menggunakan memori saat mencoba membagi secara proporsional penggunaan bersama per jumlah proses apache aktif dan menambahkannya di atas Pss (ukuran set proporsional)

Akhirnya Anda membagi 115 GB dengan angka ini dan Anda dapatkan MaxClients/ServerLimit. Dari sini Anda relatif dapat menghitung angka-angka lain seperti

  • StartServers 30% dari MaxClients
  • MinSpareServers 5% dari MaxClients
  • MaxSpareServers 10% dari MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (sebagai alternatif konservatif untuk mengatasi kemungkinan masalah dengan aplikasi yang bocor memori)
Hrvoje Špoljar
sumber
2
Saya harap seseorang dengan poin rep lebih banyak dari saya akan memberikan Anda suara untuk jawaban ini, terima kasih banyak!
Pengguna-N
2
Skrip perhitungan Anda memberi saya 842,13 MB. Itu tentang urutan besarnya di atas apa yang akan saya (apache 2.2 pada CentOS 6.7).
Quinn Comendant
1
Ini dalam mode prefork. Berikut ini keluaran dari /server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant
1
@QuinnComendant trik jahat namun IfModule akan benar jika modul prefork tersedia (yang mana), dan sebenarnya kedua opsi tersebut tersedia untuk pekerja dan MPM ... Saya memiliki server yang identik dan penggunaan memori pada sistem saya untuk pekerja adalah ~ 850 MB. Tidak mungkin prefork dapat digunakan untuk 1 proses 800 MB memori. Anda mengubah baris dalam skrip tempat referensi proses nama apache2 ke httpd kan?
Hrvoje Špoljar
1
@shawn mengapa Anda berkata begitu? bagaimana Anda percaya itu harus dihitung?
Hrvoje Špoljar