การปรับแต่ง Apache2 prefork MaxClients ServerLimit


22

ฉันมีเครื่องที่มี 128 GB Ram ที่ใช้ Apache2 เป็นเว็บเซิร์ฟเวอร์ (ในเครื่องนี้ไม่มีเซิร์ฟเวอร์ฐานข้อมูลเครื่องฐานข้อมูลเป็นเครื่อง 64 GB Ram ที่สามารถรองรับการเชื่อมต่อสูงสุด 2000 ครั้ง) ฉันเห็นด้วยเครื่องมือตรวจสอบที่มีอยู่ในขณะนี้ประมาณ 44 คนทำงานไม่ว่างและ 12 คนไม่ได้ใช้งาน 12 สิ่งที่เป็นค่าทางทฤษฎีที่ดีที่สุดสำหรับโมดูล prefork ของฉัน?

ฉันมีหน้าว่างบางครั้งโหลดเว็บไซต์ในชั่วโมงการโหลดสูงและมีข้อผิดพลาดนี้ในบันทึกข้อผิดพลาด apache ของฉัน:

[แจ้งให้ทราบล่วงหน้า] เด็ก pid 13595 สัญญาณทางออกแบ่งส่วนผิดพลาด (11)

จะแก้ไขปัญหานี้ได้อย่างไร?

การกำหนดค่าโมดูล Apache Prefork ของฉัน:

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

ฟรี -h บนเครื่อง www :

รวม: 128 G ฟรี: 97GB (พร้อม apache2 ที่ทำงาน) แชร์ 0b บัฟเฟอร์ 1.9G แคช 23G

Ram ใช้โดย Apache2 และโปรแกรมอื่น ๆ :

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

2
รหัสแอปพลิเคชันที่ทำงานในเว็บเซิร์ฟเวอร์คืออะไร เป็นไปได้มากว่าผู้กระทำผิด
Shane Madden

กรุณาส่งตัวอย่างของสถานะ apache2ctl; อาจมีข้อผิดพลาดอะไรบ้างใน error_log
Hrvoje Špoljar

คำตอบ:


63

การตั้งค่า prefork Apache ต่อแนวทางการปรับแต่งประสิทธิภาพ Apache

พูด:

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.

คุณควรตั้งค่าเช่นนี้ตามอินพุตของคุณเป็น:

  • หน่วยความจำทั้งหมด: 128 GB
  • หน่วยความจำ -10% สำหรับทุกอย่างยกเว้น apache: 115 GB
  • ตอนนี้เราต้องหาว่าอาปาเช่นั้นใช้กระบวนการเท่าไร

ในการคำนวณสิ่งนี้คุณสามารถใช้สคริปต์ต่อไปนี้:

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}'

นี่เป็นการประมาณที่ดีที่สุดว่ากระบวนการ apache เดียวใช้หน่วยความจำมากน้อยเพียงใดในขณะที่พยายามแบ่งการใช้งานแบบแบ่งใช้ต่อจำนวนกระบวนการ apache ที่ใช้งานอยู่และเพิ่มเข้าไปด้านบนของPss (ขนาดชุดตามสัดส่วน)

ในที่สุดคุณแบ่ง 115 GB MaxClients/ServerLimitด้วยตัวเลขนี้และคุณจะได้รับ จากที่นี่คุณสามารถคำนวณตัวเลขอื่น ๆ เช่น

  • StartServers 30% ของ MaxClients
  • MinSpareServers 5% ของ MaxClients
  • MaxSpareServers 10% ของ MaxClients
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000 (ทางเลือกที่อนุรักษ์นิยมเพื่อแก้ไขปัญหาที่อาจเกิดขึ้นกับแอพหน่วยความจำรั่ว)

2
ฉันหวังว่าคนที่มีคะแนนตัวแทนมากกว่าฉันจะให้คะแนนกับคำตอบนี้ขอบคุณมาก!
ผู้ใช้ -N

2
สคริปต์การคำนวณของคุณให้ฉัน 842.13 MB นั่นเป็นเรื่องเกี่ยวกับลำดับความสำคัญเหนือสิ่งที่ฉันต้องการ (apache 2.2 บน CentOS 6.7)
Quinn Comendant

1
มันอยู่ในโหมด prefork นี่คือผลลัพธ์จาก/server-info: i.imgur.com/SS2gIXI.png
Quinn Comendant

1
@QuinnComendant เคล็ดลับที่ชั่วร้าย แต่ IfModule จะเป็นจริงถ้าโมดูล prefork พร้อมใช้งาน (ซึ่งก็คือ) และที่จริงทั้งสองตัวเลือกเป็นผู้ปฏิบัติงานที่มีอยู่และ MPM ... ฉันมีเซิร์ฟเวอร์ที่เหมือนกันและการใช้หน่วยความจำบนระบบของฉัน ไม่มีวิธี prefork สามารถใช้สำหรับกระบวนการ 1 800 MB ของหน่วยความจำ คุณเปลี่ยนบรรทัดในสคริปต์ที่อ้างอิงชื่อกระบวนการ apache2 เป็น httpd ใช่ไหม?
Hrvoje Špoljar

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