การใช้หน่วยความจำ httpd


13

มีปัญหากับhttpd( Apache/2.2.29) การใช้หน่วยความจำ

เมื่อเวลาผ่านไปการใช้หน่วยความจำในhttpdกระบวนการจะเพิ่มขึ้นจนกว่าจะถึง 100%

ครั้งสุดท้ายที่ฉันเริ่มต้นใหม่httpdประมาณ 24 ชั่วโมงที่ผ่านมา ผลลัพธ์จากfree -mคือ:

[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

เพื่อพิสูจน์ว่ามันแน่นอนhttpdฉันเริ่มต้นใหม่httpdและวิ่งfree -mอีกครั้ง:

[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

ดังนั้นการรีสตาร์ท Apache จะใช้หน่วยความจำฟรีจาก 239 Mb เป็น 894 Mb ซึ่งดูเหมือนจะเป็นการก้าวกระโดดครั้งใหญ่

ฉันได้ผ่านรายการของโมดูล Apache ที่เปิดใช้งานในปัจจุบัน (มีค่อนข้างมาก) และถูกปิดใช้งาน / ลบออกmod_wsgiและmod_perl(ไม่จำเป็นสำหรับเซิร์ฟเวอร์นี้ซึ่งใช้แอปพลิเคชันเว็บที่ใช้ PHP - Magento โดยเฉพาะ)

จากhttps://servercheck.in/blog/3-small-tweaks-make-apache-flyฉันได้ทำงานps aux | grep 'httpd' | awk '{print $6/1024 " MB";}'และรับผลลัพธ์ต่อไปนี้:

[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

การรันเครื่องมือการวินิจฉัยที่แนะนำอื่น ๆMaxClientsซึ่งจะps aux | grep 'httpd' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'คืนค่าต่อไปนี้

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

เซิร์ฟเวอร์นี้ ( m1.smallอินสแตนซ์Amazon AWS ) มี1.7 GbRAM ดังนั้น:

คำแนะนำ / ข้อเสนอแนะเพิ่มเติมเกี่ยวกับวิธีปรับแต่งการhttpdตั้งค่าหรือวิธีการวินิจฉัยว่าอะไรเป็นสาเหตุของปัญหา


โปรดทราบว่าในการตรวจสอบการใช้งานหน่วยความจำตามกระบวนการคุณต้องดูที่-/+ buffers/cacheบรรทัดนั้น อย่างไรก็ตามในกรณีนี้การเปลี่ยนแปลงจะเปรียบเทียบกันได้ อาจเริ่มต้นด้วยกระบวนการเพียงไม่กี่กระบวนการที่พร้อมสำหรับจัดการคำขอ หลังจากช่วงเวลาของการร้องขอพร้อมกันจำนวนมากอาจมีกระบวนการมากขึ้นในการจัดการโหลด จำนวนกระบวนการที่ไม่ได้ทำงานสามารถปรับได้ ดังนั้นหากอาปาเช่ใช้หน่วยความจำมากเกินไปคุณต้องทำการปรับแต่ง
wurtel

ฉันตกลงที่การกำหนดค่าเซิร์ฟเวอร์ Apache แต่ไม่เคยทำการปรับแต่งประสิทธิภาพจำนวนมากสำหรับ Apache ในอดีต คำแนะนำใดที่ฉันควรดูคำแนะนำหรือแนวทาง? มีการตั้งค่าการกำหนดค่าที่ฉันสามารถเปิดใช้งานบอก Apache ให้ฆ่ากระบวนการที่ถูกแยกหลังจากช่วงระยะเวลาหนึ่งหรือไม่? (ดูเหมือนว่า Apache ไม่ได้ทำสิ่งนี้ตามค่าเริ่มต้นด้วยเหตุผลบางประการ)
James Spittal

นี่คือเหตุผลที่แน่นอนที่ฉันย้ายออกจาก Apache ... ลอง Nginx หรือแม้แต่ Lighttpd

น่าสนใจ ได้ยินสิ่งที่ดีเกี่ยวกับnginxดังนั้นอาจถึงเวลาที่เราจะลองทำ แต่โดยสุจริตฉันใช้ Apache มาหลายปีแล้วและไม่เคยมีปัญหาใหญ่เลย วีโอไอพีจะเคี้ยวความจำจริงๆ
James Spittal

โปรดทราบว่าสคริปต์ของคุณเพื่อคำนวณการใช้หน่วยความจำเฉลี่ยรวมถึงการใช้หน่วยความจำต่ำของgrep httpd-process (อย่างน้อยสำหรับฉัน) เพื่อแก้ไขว่าฉันอยากจะแนะนำให้แยกบรรทัดนั้นออกจากการคำนวณเช่นนี้:ps aux | grep 'httpd' | grep -v grep | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'
MaPePeR

คำตอบ:


11

นี่คือสิ่งที่ฉันได้ทำเพื่อ 'แก้ปัญหา' มัน:

  1. ตั้งค่าMaxClients 7(ขึ้นอยู่กับ(1740.8Mb Memory on server - 900Mb for MySQL + other stuff) / 111Mb average usage per httpd process = 7.5747747747747747747747747747748)

ดังนั้น:

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients         7
MaxRequestsPerChild  4000
</IfModule>
  1. ปิดการใช้งานโมดูล Apache ทั้งหมดยกเว้น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. ลบmod_sslแพ็กเกจเนื่องจากไคลเอ็นต์ไม่ได้ใช้งานhttps://ใด ๆ

ฉันจะรายงานกลับมาเมื่อการกำหนดค่าใหม่นี้ใช้เวลาสักครู่เพื่อดูว่าจะแก้ปัญหาได้หรือไม่

แรงบันดาลใจบางอย่างที่นี่ถูกยืมมาจาก: http://www.activoinc.com/blog/2009/08/31/performance-optimized-httpd-conf-for-magento-ecommerce/และhttp://www.activoinc.com/ ดาวน์โหลด / httpd.conf-วีโอไอพี


การกำหนดค่าข้างต้นได้ช่วยอย่างหนาแน่น
James Spittal

1
สองสามวันต่อมาปัญหา 'การรั่วไหลของหน่วยความจำ' ในhttpdดูเหมือนจะหายไปอย่างสมบูรณ์
James Spittal

2

ฉันกลัวว่าตัวเลือกMaxRequestsPerChildช่วยคุณในกรณีของคุณเนื่องจากช่วยให้กระบวนการรีไซเคิลได้ตามจำนวนคำขอที่กำหนดไว้ดังนั้นหน่วยความจำรั่วจึงมีอยู่ แต่ไม่สามารถมองเห็นได้อีกต่อไป

นอกจากนี้: MaxClients = ServerLimit * ThreadsPerChild

ในกรณีของคุณหากคุณต้องการผู้ใช้งานพร้อมกันเพียง 7 คน (MaxClients = 7) มันมีทั้งหมดเพียงพอกับ 2 กระบวนการ (ในกรณีที่ถ้าใครจะล้มเหลวในการลดเวลาหยุดทำงาน) ดังนั้นการกำหนดค่าสามารถ:

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

ฉันใช้MaxClients 8เพียงเพื่อให้การกระจายคำขอเท่ากันมากขึ้นระหว่าง 2 กระบวนการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.