เพิ่มประสิทธิภาพ apache / php / mysql ที่รันบน VPS สำหรับการโหลดจำนวนมาก


17

คำถามเกี่ยวกับการปรับเซิร์ฟเวอร์ apache / mysql ให้เหมาะสมบน VPS ที่มี RAM 512m ภายใต้การโหลดปกติทุกอย่างทำงานได้อย่างรวดเร็วไม่มีการเชื่อมต่อที่ล่าช้า อย่างไรก็ตามเมื่อเราได้รับการเข้าชมจำนวนมาก (50k + การเข้าชม) ไซต์จะทำการรวบรวมข้อมูลและใช้เวลา 30 วินาที + เพื่อรับเนื้อหากลับจาก apache

ไซต์ทำงานบน Expression Engine (CMS) (ใน PHP) และฉันได้ปฏิบัติตามคำแนะนำในการเพิ่มประสิทธิภาพแบบหนักแล้ว ฉัน googled และตามมาไม่กี่อย่างสำหรับอาปาเช่ด้วยโชคบางอย่างไปถึงที่ตอนนี้ แต่ฉันต้องได้รับการตอบสนองอย่างต่อเนื่อง

ฉันคิดว่าสิ่งนี้แตกต่างจากคำถาม 'ปรับให้เหมาะสมสำหรับหน่วยความจำต่ำ' ที่นี่เนื่องจากฉันมี RAM เพียงพอ (สำหรับสิ่งที่ฉันพยายามจะทำ) ฉันแค่ต้องการให้เซิร์ฟเวอร์ไม่สำลักภายใต้ภาระหนัก

มีคำแนะนำอะไรบ้าง?


1
เพียงแค่ติดตาม - เปลี่ยนเป็น Lighttpd แล้วความแตกต่างก็น่าทึ่งจัดการกับโหลดได้ดีกว่ามาก การเพิ่มประสิทธิภาพมากขึ้นที่จะมาฉันแน่ใจ แต่นั่นช่วยได้มาก และฉันใช้ eaccelerator ซึ่งฉันเลือกผ่าน APC เนื่องจากถูกถาม
นกแก้ว

คำตอบ:


18

สำหรับ PHP มี 2 สิ่งสำคัญที่จะเพิ่มความจุ:

  1. Advanced PHP Caching (APC) ตามที่ได้กล่าวไว้ นี่คือสิ่งที่เราใช้ที่ Yahoo! มีโครงการที่คล้ายกันอื่น ๆ แต่อันนี้เป็นที่รักของราสมุส
  2. FastCGIแทน mod_php มีการถกเถียงกันในเรื่องนี้เนื่องจาก mod_php มักจะเร็วที่สุด อย่างไรก็ตามฉันคิดว่าคุณมีเซิร์ฟเวอร์ Apache ตัวเดียวที่ให้ทั้งเนื้อหา PHP แบบไดนามิกและสินทรัพย์คงที่ (JS, CSS, แฟลช, รูปภาพ, PDF, ฯลฯ ) การร้องขอสำหรับสินทรัพย์สแตติกเหล่านั้นไม่จำเป็นต้องใช้หน่วยความจำมาก แต่เนื่องจาก PHP เป็นโมดูลมันจึงอยู่ในทุกเธรดของ Apache

สำหรับ Apache:

  1. ใช้MPM ของผู้ปฏิบัติงาน
  2. เปิดใช้งานKeepAlive

นอกจากนี้คุณยังอาจจะไปให้ไกลที่สุดเท่าที่จะต้องพิจารณาเปลี่ยนจาก Apache เพื่อLighttpdหรือNginx ฉันรักอาปาเช่ ฉันใช้คนโง่จากคุณสมบัติขั้นสูงหลายอย่าง ฉันยอมรับค่าใช้จ่ายเพราะฉันต้องการสิ่งที่เสนอ สำหรับ LAMP stack ทั่วไปจำเป็นต้องมีมากกว่าและสิ้นเปลืองทรัพยากร

สำหรับ MySQL:

  1. ความพยายามเพิ่มประสิทธิภาพของคุณจะจ่ายผลตอบแทน 10 เท่าเมื่อใช้เวลาวิเคราะห์และแก้ไขข้อความค้นหาแทนที่จะปรับค่า my.cnf ของคุณ ฉันไม่ได้บอกว่ามันไม่สำคัญที่จะได้รับการเชื่อมต่อแคช ฯลฯ ถูกต้อง ... แต่สำหรับคนส่วนใหญ่มันเป็นเพียง 9% ของปัญหา
  2. ระหว่าง QA ของคุณเปิดบันทึกการสืบค้นทั่วไปบน staging / dev mysqld ของคุณเพื่อบันทึกการสืบค้นทั้งหมดที่ส่ง (อย่าทำอย่างนั้นบนเซิร์ฟเวอร์ mysql ที่คุณผลิต!)
  3. ใช้อธิบายเพื่อวิเคราะห์แบบสอบถาม โดยเฉพาะอย่างยิ่งถ้าคุณกำลังใช้เฟรมเวิร์กที่มี ORM (ย่อส่วนฐานและทำให้คุณไม่สามารถเขียน SQL ของตัวเองได้) คุณจะต้องล้างค่า JOIN ที่ไม่เกี่ยวข้อง, SELECTs โดยไม่มีส่วนคำสั่ง WHERE, ORDER BYs ที่ไม่ใช้ดัชนี
  4. หากคุณกำลังใช้ MySQL 5.1 ใช้ประโยชน์จาก Profiler

เครื่องมืออื่น ๆ ที่ควรค่าแก่การพิจารณาคือmk-visual-อธิบาย

ฉันอ้างแหล่งอ้างอิงที่ยอดเยี่ยม 10 ข้อ สิ่งเหล่านี้ควรจะทำให้คุณฮัมเพลง โปรดแจ้งให้เราทราบว่ามันเป็นอย่างไร


6

ย้ายไฟล์เซสชัน PHP ของคุณไปที่tmpfsใช้ APC (หรืออื่น ๆ ) และลบโมดูล PHP ทั้งหมดที่คุณไม่ต้องการ ลบโมดูล Apache ทั้งหมดที่คุณไม่ต้องการ / ใช้

เพื่อสร้าง tmpfs (ไดเรกทอรีใน RAM!)

mkdir /tmpfs; chmod 777 /tmpfs
mount -t tmpfs -o size=256M tmpfs /tmpfs

ใน/ etc / fstabเพิ่มบรรทัดด้านล่างเพื่อสร้างเมื่อรีบูต!

tmpfs     /tmpfs    tmpfs   size=256m,mode=0777    0       0

ใน/etc/apache2/php.iniปรับเพื่อเก็บเซสชันของคุณใน RAM (tmpfs)!

session.save_handler = files
session.save_path = "/tmpfs"

หมายเหตุ: ด้วยไฟล์ PHP และไฟล์เซสชันของคุณใน RAM คุณแทบจะไม่ต้องแตะดิสก์เลย!

ใช้expires_moduleใน apache ดังนั้นเบราว์เซอร์จะแคชเกือบทุกอย่าง

ExpiresActive On
ExpiresDefault "access plus 90 days"
ExpiresByType image/gif "access plus 90 days"
ExpiresByType image/ico "access plus 90 days"
ExpiresByType image/png "access plus 90 days"
ExpiresByType image/jpeg "access plus 90 days"
ExpiresByType image/x-icon "access plus 90 days"
ExpiresByType text/css "Access plus 90 days"
ExpiresByType text/html "Access plus 90 days"
ExpiresByType application/x-shockwave-flash "Access plus 90 days"
ExpiresByType application/x-javascript "Access plus 90 days"

อย่าใช้ไฟล์. htaccess ! แต่ให้รหัสยากในไฟล์ vhost config แทน! จะกำจัด / ลดการตรวจสอบดิสก์อย่างรุนแรงต่อคำขอ http ทั้งหมด ... มันเพิ่มขึ้นอย่างแท้จริง

Options FollowSymLinks 
AllowOverride None

ตัวอย่างของ. htaccess ที่ใช้ในไฟล์ vhost.conf ของคุณ ...

<Directory /home/user/www/site.com/secure>
    Order Allow,Deny
    Deny from All
</Directory>

5

สองสิ่งที่อยู่ในใจ

แคช Opcode เป็นความคิดที่ดีเสมอ ฉันชอบhttp://eaccelerator.net/มากกว่า APC หากคุณยังไม่ได้พัฒนากับ APC ตลอดทางที่พยายามจะเพิ่มเข้าไปมันก็มักจะเจ็บปวดอยู่เสมอ ตัวเร่งความเร็วในขณะที่ไม่แฟนซีเพียง แต่ดูเหมือนว่าจะทำงาน

พร็อกซีย้อนกลับยังเป็นความคิดที่ดี แต่คุณต้องดูการใช้ RAM ฉันพบ Apache 2.2 ที่มี mpm-workers เพื่อใช้ RAM ในปริมาณที่พอใช้ ในกรณีของคุณฉันจะแนะนำบางอย่างที่เบากว่าเช่น Nginx และเรียกใช้ Apache กับ PHP เป็น FASTCGI หรือเพียงแค่ปล่อยไว้ตามกระบวนการ แนวคิดเกี่ยวกับการใช้ Varnish, Squid, Nginx และอื่น ๆ คือการให้บริการเนื้อหาแบบคงที่จัดการกับการเชื่อมต่อผู้ใช้และส่งผ่านคำขอ PHP ไปยัง Apache ซึ่งคุณถือว่าเป็นเซิร์ฟเวอร์แอปพลิเคชันเท่านั้น

หากคุณกำลังใช้งาน Mysql 5.1 รุ่นล่าสุดอยู่เช่นอย่างน้อย 5.1.24 ตอนนี้คุณสามารถเข้าถึงบันทึกที่ช้าเป็นวินาทีได้แล้ว ฉันจะเริ่ม long_query_time ที่ 1 หรือ 2 แล้วนำมาลงที่ 0.5 ในขณะที่คุณได้รับการจัดการกับคนที่ยาวจริงๆ นอกจากนี้ยังมีข้อมูลการปรับจูนทั่วไปมากมายบนเน็ตสำหรับ Mysql แต่คุณไม่มี RAM ให้ทำอะไรมากมาย คุณเพิ่มการตั้งค่าใด ๆ จากค่าเริ่มต้นหรือไม่ ไฟล์ my.cnf เริ่มต้นส่วนใหญ่ได้รับการกำหนดค่าให้ใช้ RAM ประมาณ 64MB อย่างน้อยที่สุดฉันจะเพิ่ม key_buffer จาก 16MB เป็น 64MB

นอกจากนี้คุณใช้ตาราง Myisam หรือ Innodb อยู่หรือไม่ หากคุณเก็บเซสชั่นไว้ในฐานข้อมูลคุณจะต้องเปลี่ยนตารางเซสชั่นเป็น Innodb (หรือทำให้เป็นคุกกี้แทน) แทนที่จะปล่อยให้ตาราง Mysiam ซึ่งล็อคระดับตารางแทนที่จะล็อคระดับแถว โดยทั่วไปตารางใด ๆ ที่มากกว่า 20% เขียนถึง 80% อ่านเป็นผู้สมัครสำหรับการย้ายไป Innodb โปรดจำไว้ว่าคุณจะต้องสมดุลจำนวน RAM ระหว่างตาราง Myisam และตาราง Innodb เนื่องจากบัฟเฟอร์สำหรับแต่ละรายการได้รับการกำหนดค่าแยกกัน

และสุดท้ายอีก RAM ขนาด 512MB จะไปได้ไกลในการตั้งค่าของคุณหรือแม้แต่ 512MB VPS อื่น ๆ เพื่อเรียกใช้ Mysql ถ้ามันถูกกว่าหรือราคาเดียวกัน ฉันจะเอนตัวไปที่อินสแตนซ์ที่สองเพราะนั่นจะเพิ่มดิสก์ IO ที่มีอยู่เป็นสองเท่า ปัญหาอย่างหนึ่งของเซิร์ฟเวอร์ VPS ก็คือ IO ของคุณไม่ได้รับการปกป้องจากบุคคลอื่นบนเซิร์ฟเวอร์จริง

อืมโพสต์ของฉันกระจายไปทั่วกระจัดกระจาย แต่ให้สถานที่มากมายให้ดู โชคดี.



1

ในสถานการณ์ที่หน่วยความจำเหลือน้อย (512Mb ต่ำสำหรับเซิร์ฟเวอร์ที่มีปริมาณการใช้งานสูง) คุณควรพิจารณาเว็บเซิร์ฟเวอร์และเอ็นจิ้น DB

Lighttp เบากว่าแกะกล่องมากกว่าปกติ Apache สามารถทำได้หลังจากปรับแต่งมากและมีตัวเลือกที่เบากว่านั้น แน่นอนว่าเป็นไปไม่ได้หากมีคุณสมบัติ Apache ที่คุณพึ่งพาซึ่งไม่สนับสนุนในเซิร์ฟเวอร์อื่น

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

ตัวเลือกอื่น ๆ คือตัวเลือกที่ง่ายคือรับ RAM มากขึ้นใน VM หากคุณสามารถซื้อได้


1

นอกเหนือจากคำแนะนำที่ดีที่นี่ควรสังเกตว่า VPS ทั้งหมดไม่ได้ถูกสร้างขึ้นอย่างเท่าเทียมกัน จากประสบการณ์ของฉัน PHP กลายเป็น CPU หนัก

เกณฑ์มาตรฐานของ Wordpress AB (ab -n 500 -c 25 http://domain.com/index.php ) จาก nginx / apc / phpfpm / mysql (ท้องถิ่น) บน EC2 ส่งผลให้ ~ 2 คำขอ / วินาทีในระดับรายการ "2GB เซิร์ฟเวอร์หน่วยประมวลผล RAM / 1 "

เกณฑ์มาตรฐานเดียวกันทำงานกับสแต็กที่แน่นอนเดียวกัน (ปรับใช้โดยสคริปต์ไปยังระบบปฏิบัติการที่เหมือนกัน) ใน 512MB Rackspace Cloudserver ส่งกลับ ~ 80 req / วินาที ดังนั้น 4x ram น้อยลงประสิทธิภาพ 40x ในการทดลองขั้นพื้นฐานนี้

การดูด้านบนระหว่าง AB คุณจะเห็นว่า EC2 ไม่สามารถจัดการกับภาวะพร้อมกันได้และจะกดโหลด CPU และล็อคทันที 100% การดูอันดับสูงสุดบนเซิร์ฟเวอร์ 512MB (ซีพียูแบบคอร์คอร์เสมือนจริง) ทำให้มาตรฐานเดียวกันเป็นสองเท่าแกนจะถูกโหลด ~ 60% และจัดการมาตรฐานอย่างราบรื่น

VPS นั้นง่ายมากที่จะหมุนและปิดโดยไม่มีข้อผูกมัดมันไม่เจ็บเลยที่จะนำโครงสร้างพื้นฐาน VM / VPS ที่อยู่ในการทดสอบ!

แก้ไข 1: นอกจากนี้อินสแตนซ์ขนาดเล็ก "High CPU" ของ EC2 สามารถให้ผลตอบแทนได้เพียง 10 / req วินาทีเท่านั้นโดยที่ CPU ยังคงเป็นคอขวด ข้อสรุปของฉันคือคุณเสียสละประสิทธิภาพเพื่อความมั่นคง / ความทนทานกับ EC2 และแน่นอนว่ามีหลายกรณีการใช้งานที่เรียกร้องให้มีสภาพแวดล้อมเช่นนั้น


ยังพิจารณา nginx (v.1 ปล่อยตัววันนี้) wordpress.com เปลี่ยนการกำหนดค่า litespeed ด้วย nginx ดังนั้นจึงเป็นเว็บเซิร์ฟเวอร์ที่มีความสามารถอย่างชัดเจน
iainlbc

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