Penggunaan memori httpd

13

Mengalami beberapa masalah dengan httpd( Apache/2.2.29) penggunaan memori.

Seiring waktu, penggunaan memori dalam httpdproses meningkat hingga akhirnya mencapai 100%.

Terakhir kali saya memulai kembali httpdadalah sekitar 24 jam yang lalu. Output dari free -madalah:

[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655       1415        239          0        202        424
-/+ buffers/cache:        788        866
Swap:         1023          4       1019

Untuk membuktikannya httpd, saya memulai kembali httpddan berlari free -mlagi:

[ec2-user@www ~]$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]
[ec2-user@www ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1655        760        894          0        202        360
-/+ buffers/cache:        197       1457
Swap:         1023          4       1019

Jadi, memulai ulang Apache membutuhkan memori bebas dari 239 Mb hingga 894 Mb - yang sepertinya merupakan lompatan besar .

Saya telah memeriksa daftar modul Apache yang saat ini diaktifkan (ada cukup banyak) dan dinonaktifkan / dihapus mod_wsgidan mod_perl(keduanya tidak diperlukan untuk server ini, yang menjalankan aplikasi web berbasis PHP - Magento, khususnya).

Berdasarkan pada https://servercheck.in/blog/3-small-tweaks-make-apache-fly , saya telah menjalankan ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'dan mendapatkan output berikut:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024 " MB";}' 15.1328 MB 118.09 MB 127.449 MB 129.059 MB 117.734 MB 113.824 MB 125.062 MB 123.922 MB 119.855 MB 108.066 MB 136.23 MB 114.031 MB 113.27 MB 110.695 MB 102.113 MB 113.234 MB 186.816 MB 118.602 MB 0.835938 MB

Menjalankan alat diagnosis yang disarankan lainnya MaxClientsyang ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'mengembalikan berikut ini:

[root@www ~]# ps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
110.212 MB

Server ini ( m1.smallcontoh Amazon AWS ) memiliki 1.7 GbRAM. Jadi, oleh karena itu:

Adakah petunjuk / saran lebih lanjut tentang cara terbaik untuk mengubah httpdpengaturan atau cara mendiagnosis apa yang sebenarnya menyebabkan hal ini?

James Spittal
sumber
Perhatikan bahwa untuk memeriksa penggunaan memori dengan proses, Anda perlu melihat -/+ buffers/cachebarisnya; namun dalam hal ini perubahannya sebanding. Bergantung pada bagaimana apache disetel, apache mungkin dimulai hanya dengan beberapa proses yang siap untuk menangani permintaan; setelah periode banyak permintaan bersamaan mungkin akan ada lebih banyak proses bercabang untuk menangani beban. Jumlah proses idle juga dapat disetel. Jadi jika apache tumbuh menggunakan terlalu banyak memori, Anda perlu melakukan beberapa penyetelan.
Wurtel
Saya baik-baik saja di konfigurasi server Apache tetapi belum melakukan sejumlah besar dalam hal penyetelan kinerja untuk Apache di masa lalu. Adakah saran tentang arahan atau panduan yang harus saya lihat? Apakah ada pengaturan konfigurasi yang dapat saya aktifkan untuk memberi tahu Apache untuk mematikan proses bercabang setelah waktu tertentu? (Tampaknya Apache tidak melakukan ini secara default karena beberapa alasan.)
James Spittal
Ini adalah alasan tepat saya pindah dari Apache ... coba Nginx atau bahkan Lighttpd.
Menarik. Mendengar hal-hal baik tentang nginxjadi mungkin sudah saatnya kita mencobanya, tapi jujur, saya telah menggunakan Apache selama bertahun-tahun dan tidak pernah memiliki masalah besar. Magento benar-benar mengunyah memori.
James Spittal
Perhatikan bahwa skrip Anda untuk menghitung penggunaan memori rata-rata mencakup penggunaan proses-memori yang rendah grep httpd(setidaknya untuk saya). Untuk memperbaikinya saya akan merekomendasikan untuk mengecualikan garis itu dari perhitungan seperti ini:ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
MaPePeR

Jawaban:

11

Inilah yang telah saya lakukan untuk 'menyelesaikannya':

  1. Setel MaxClients 7(berdasarkan (1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

Karena itu:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. Menonaktifkan semua modul Apache kecuali authz_host_module, log_config_module, expires_module, deflate_module, setenvif_module, mime_module, autoindex_module, negotiation_module, dir_module, alias_module, rewrite_module,php5_module

  2. Hapus mod_sslpaket karena klien tidak menggunakan https://apa pun.

Saya akan melaporkan kembali setelah konfigurasi baru ini berjalan beberapa saat untuk melihat apakah ini menyelesaikannya.

Beberapa inspirasi di sini dipinjam dari: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/ dan http://www.activoinc.com/ unduhan / httpd.conf-magento

James Spittal
sumber
Konfigurasi di atas jelas sangat membantu.
James Spittal
1
Beberapa hari kemudian, masalah 'kebocoran memori' di httpdtampaknya hilang sepenuhnya.
James Spittal
2

Saya khawatir opsi MaxRequestsPerChild membantu dalam kasus Anda, karena memungkinkan proses daur ulang setelah jumlah permintaan yang ditentukan, sehingga kebocoran memori ada di sana, tetapi tidak terlihat lagi.

Selain itu: MaxClients = ServerLimit * ThreadsPerChild

Dalam kasus Anda jika Anda hanya membutuhkan 7 pengguna secara bersamaan (MaxClients = 7) itu sudah cukup dengan 2 proses (untuk berjaga-jaga jika ada yang gagal meminimalkan downtime), maka konfigurasi dapat berupa:

<IfModule prefork.c>
StartServers       2
MinSpareServers    2
MaxSpareServers   20
ServerLimit        2
MaxClients         8
ThreadsPerChild    4
MaxRequestsPerChild  4000
</IfModule>

Saya menggunakan MaxClients 8 , hanya untuk membuat distribusi permintaan lebih merata antara 2 proses.

Igor Levkov
sumber