เวลารอนานก่อนการตอบสนองของเซิร์ฟเวอร์ Apache 2.2 (Gentoo LAMP)


9

ฉันเพิ่งย้ายเว็บไซต์ของลูกค้า (ใช้ CMS คอนกรีต 5) ไปยัง VPS ที่รัน Gentoo, Apache 2.2, PHP5 และ MySQL 5 และฉันสังเกตเห็นว่าเวลาตอบสนอง Apache ค่อนข้างแย่ (มันเหมือนกันบนเซิร์ฟเวอร์เก่า) บางครั้งอาจสูงถึง 8-9 วินาที แต่บ่อยครั้งระหว่าง 300ms ถึง 3 วินาที (ต่อ 300 มิลลิวินาทีฉันไม่สนใจ) ฉันรู้ว่ามันไม่ใช่เวลาแฝงเครือข่ายเนื่องจากเซิร์ฟเวอร์มี ping (จากตำแหน่งของฉัน) ประมาณ 30ms

นี่คือตัวอย่างของเวลา (คุณสามารถเห็นว่ามันเร็วหลังจากการรอครั้งแรก):

ไทม์ไลน์ของ Firebug Net

ฉันใช้ APC (แม้ว่าฉันไม่แน่ใจว่าทำงานได้ดี ... ) และ SuExec โมดูล Apache คือ:

 core_module (static)
 authn_file_module (static)
 authn_default_module (static)
 authz_host_module (static)
 authz_groupfile_module (static)
 authz_user_module (static)
 authz_default_module (static)
 auth_basic_module (static)
 include_module (static)
 filter_module (static)
 deflate_module (static)
 log_config_module (static)
 env_module (static)
 expires_module (static)
 headers_module (static)
 setenvif_module (static)
 version_module (static)
 ssl_module (static)
 mpm_prefork_module (static)
 http_module (static)
 mime_module (static)
 status_module (static)
 autoindex_module (static)
 asis_module (static)
 info_module (static)
 suexec_module (static)
 cgi_module (static)
 negotiation_module (static)
 dir_module (static)
 actions_module (static)
 userdir_module (static)
 alias_module (static)
 rewrite_module (static)
 so_module (static)
 suphp_module (shared)

และโมดูล PHP คือ:

bcmath
calendar
ctype
curl
db
dbase
domxml
exif
ftp
gd
gettext
iconv
imap
mbstring
mcrypt
mime_magic
mysql
openssl
overload
pcre
posix
session
standard
sysvsem
sysvshm
tokenizer
xml
xslt
zlib

ฉันเปิดใช้งาน gzip กับไฟล์ที่เกี่ยวข้องทั้งหมดแล้ว

Apache กำลังทำงานโดยใช้ prefork และการตั้งค่าใน httpd.conf คือ:

<IfModule prefork.c>
StartServers         10
MinSpareServers      10
MaxSpareServers      20
MaxClients           250
MaxRequestsPerChild  4000
</IfModule>

HostnameLookups Off

ฉันสังเกตเห็นว่าหน้าเว็บที่ (ซึ่งฉันคิดว่า) เป็นฐานข้อมูลหนักเช่นแดชบอร์ดของ CMS มักจะช้ากว่าปกติ ฉันคิดว่านี่อาจหมายความว่า MySQL สามารถปรับให้เหมาะสม ฉันยังสงสัยเกี่ยวกับโมดูล Apache - ฉันสับสนระหว่าง mod_php5, mod_cgi, mod_fastcgi ฯลฯ และอื่น ๆ - มีคำแนะนำที่ขัดแย้งกันทั่วเน็ตว่าดีที่สุดสำหรับการใช้งาน

นี่คือผลลัพธ์ของMySQLTuner :

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.44-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated -InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 35M (Tables: 161)
[!!] Total fragmented tables: 15

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 3d 21h 44m 16s (293K q [0.868 qps], 1K conn, TX: 135M, RX: 90M)
[--] Reads / Writes: 99% / 1%
[--] Total buffers: 58.0M global + 1.6M per thread (100 max threads)
[!!] Maximum possible memory usage: 219.7M (93% of installed RAM)
[OK] Slow queries: 0% (0/293K)
[OK] Highest usage of available connections: 2% (2/100)
[OK] Key buffer size / total MyISAM indexes: 16.0M/20.9M
[OK] Key buffer hit rate: 99.6% (5M cached / 21K reads)
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 3K sorts)
[!!] Temporary tables created on disk: 47% (2K on disk / 5K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 6% (64 open / 1K opened)
[OK] Open file limit used: 12% (128/1K)
[OK] Table locks acquired immediately: 100% (356K immediate / 356K locks)

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Reduce your overall MySQL memory footprint for system stability
    Enable the slow query log to troubleshoot bad queries
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Set thread_cache_size to 4 as a starting value
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
    query_cache_size (>= 8M)
    tmp_table_size (> 32M)
    max_heap_table_size (> 16M)
    thread_cache_size (start at 4)
    table_cache (> 64)

ฉันสังเกตว่าเมื่อมีการโหลดหน้า DB-heavy การใช้งาน CPU ได้รับการอัปเดตที่ 57% (โดยใช้ด้านบน) - สำหรับฉันซึ่งแสดงให้เห็นว่ามีบางสิ่งที่ MySQL ที่ได้รับการปรับปรุงไม่ดีหรือแคชมีความจำเป็นอย่างยิ่ง

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก!


2
แค่คิด: HostnameLookupเปิดใช้งานการกำหนดค่าบันทึกหรือไม่ ถ้าเป็นเช่นนั้นการค้นหา DNS ของไคลเอนต์ที่ร้องขอที่จะเพิ่มลงในบันทึกการเข้าถึงอาจช้ามาก (หรือเซิร์ฟเวอร์ DNS เครื่องแรกหมดเวลา) ซึ่งอาจทำให้การร้องขอเสร็จสมบูรณ์ช้าลง
jCoder

มันถูกปิดการใช้งาน - ฉันจะเพิ่มไปยังโพสต์ดั้งเดิม
melat0nin

ถ้าเป็นเพียงคำขอที่เกี่ยวข้องกับ PHP ตรวจสอบการแยกส่วนใน APC คุณควรตรวจสอบการใช้ทรัพยากรอย่างใกล้ชิด เซิร์ฟเวอร์ใช้ทรัพยากรทั้งหมดหรือเปล่าหรือเปล่า?
Kvisle

เป็นอยู่แล้ว (ดู OP) :)
melat0nin

ขออภัยที่ :) - อัปเดตความคิดเห็นของฉัน; คุณตรวจสอบแล้วว่าเป็นเพียงคำขอ PHP หรือคำขออื่นด้วยหรือไม่ เซิร์ฟเวอร์ว่างหรือไม่ว่าง APC มีการแยกส่วนหรือไม่ หน่วยความจำมีจำนวนเท่าใดเมื่อเปรียบเทียบกับแคชอื่น ๆ
Kvisle

คำตอบ:


14

คุณรู้หรือไม่ว่ากระบวนการของผู้ปฏิบัติงาน apache กำลังถูกแขวนอยู่บนอะไร? ลองใช้วิธีนี้ดู:

mkdir /strace; ps auxw | grep httpd | awk '{print"-p " $2}' | xargs strace -o /strace/strace.log -ff -s4096 -r

โหลดหน้าใหม่ (เช่นไม่ใช่แคชในเครื่อง) ในเบราว์เซอร์ของคุณ CTRL + C เพื่อหยุด strace จากนั้นเรียงลำดับ strace.logs ตามเวลาที่ใช้ในการโทรแต่ละครั้ง:

for i in `ls /strace/*`; do echo $i; cat $i | cut -c11-17 | sort -rn | head; done

ดู strace.logs ใด ๆ ที่มีการโทรมากกว่า 1.0 วินาทีและค้นหาตามเวลาจากเอาต์พุตของคำสั่งก่อนหน้า สิ่งนี้จะนำคุณไปสู่ขั้นตอนที่แน่นอนที่พวกเขาจะถูกแขวนไว้

คุณเปลี่ยนมาใช้ไฟร์วอลล์แบบ CSF หรือไม่ ฉันเห็นปัญหาเดียวกันนี้ใน VPS เมื่อทำการดีบักกระบวนการ httpd ด้วย strace จะใช้เวลาสูงสุด 5 วินาทีหรือมากกว่าในการโทร gettimeofday แปลกฉันแคบลงนี้เพื่อ CSF ซึ่งพยายามกรอง Venet0 interface, loopback interface ใน OpenVZ หรือ Virtuozzo คอนเทนเนอร์ การตั้งค่าพารามิเตอร์นี้ใน /etc/csf/csf.conf ส่วนใหญ่จะแก้ไขให้ฉัน:

"ETH_DEVICE_SKIP = "venet0,lo"

ฉันพูดเป็นส่วนใหญ่เพราะบางครั้งยังมี 500-1000ms รอการเชื่อมต่อเพื่อสร้าง แต่มันเป็นการปรับปรุงที่ดีจาก 5,000+


1
ขอบคุณสำหรับคำตอบ! ในตอนท้ายสิ่งต่าง ๆ ดูเหมือนจะเรียงลำดับเมื่อฉันได้รับ APC ทำงานอย่างถูกต้อง - ตอนนี้ไซต์ค่อนข้างเร็ว +1 สำหรับคำแนะนำที่ดี แต่ฉันจะสังเกตพวกเขาในกรณีที่ฉันเจออะไรแบบนี้อีกครั้ง
melat0nin

3

นี่คือไพรเมอร์ / walktthrough ที่ยอดเยี่ยมสำหรับการแก้ไขปัญหาประเภทนี้โดยใช้ strace

Maximum possible memory usage: 219.7M (93% of installed RAM)

นี่ต้องเป็นกล่อง VPS แบบโลว์เอนด์ใช่ไหม

  • คุณอาจต้องกดการตั้งค่า MySQL ของคุณ
  • ปรับแต่ง Apache เพื่อลดจำนวน httpd forks
  • ตรวจสอบว่าคุณสามารถเปิดใช้งานการแลกเปลี่ยน
  • APC ถูกตั้งค่าให้แคช opcodes โดยอัตโนมัติหรือไม่ ตรวจสอบการใช้สคริปต์ 'apc.php' แจกจ่ายด้วย apc

3

คุณต้องแยกเครือข่าย apache, mysql และ php ออกจากกัน

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

หากคุณสามารถดึงหน้าเว็บที่มีเพียงคำสั่ง phpinfo () แล้ว PHP ปกติก็โอเค (อาจต้องปรับแต่งเล็กน้อย)

หากคุณเขียนการทดสอบการเชื่อมต่อฐานข้อมูลอย่างง่ายและรวดเร็วชั้นนั้นก็มักจะใช้ได้เช่นกัน

สุดท้ายดึงหน้าแอปพลิเคชัน หากช้าแสดงว่าปัญหาอยู่ภายในการประมวลผลแอปพลิเคชัน ในขณะที่การปรับจูนอาจช่วยได้นี่เป็นเรื่องยากที่จะแก้ไข

หากไม่มีการทำโปรไฟล์แอปพลิเคชันอาจเป็นการยากที่จะค้นหาปัญหา เครื่องมืออย่าง NewRelic สามารถช่วยแก้ปัญหานี้ได้ แต่ไม่ใช่วิธีแก้

แอปของคุณมีการดีบักภายในประเภทใดเพื่อแสดงเวลาที่ใช้ไปหรือไม่


0

ฉันแนะนำให้เพิ่มการวัดเวลาการเรนเดอร์และตรวจสอบระยะเวลาที่เซิร์ฟเวอร์ใช้ในการเรนเดอร์เพจ HTML เพียว แล้วคุณจะรู้ว่ามันอยู่ใน CMS หรือที่อื่น ๆ ฉันเดิมพัน 2cent ไม่ใช่เซิร์ฟเวอร์ของคุณ / Maddin


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