จากที่ส่งมาให้ดู
1) เครื่องนี้ไม่โดน DDOS ประเมิณคร่าวๆเท่าที่พิมพ์มาให้ดู
2) my.cnf ควรปรับใหม่
ปรับค่าไม่สมดุลกับ Hardware spec ที่มีอยู่
ตามที่ให้มาปรับไม่เหมราะกัยเครื่องไป 60% ผมจะไม่กล่าวรายละเอียดมากเพราะว่าต้องพิมพ์เยอะ
ปรับ buffer เยอะเกินไป
และ max_connection สูงไป ถ้าวิ่งจริงๆ server จะล่มไปก่อน เนื่องจาก Ram ไม่พอ
นอกจากว่า จะใช้ mysql persident connection เพื่อ performance และมี ram มากพอ
ถ้าเว็บขนาดใหญ่ มีการ write เยอะๆ ถ้าเปลี่ยน mysql engine เป็น innodb ก็จะดี เพื่อเว็บไหลคล่องไม่ให้เหกิดปัญหา table lockและไม่ต้อง คอย repair db
3)ปรับ Apache ไม่สมดุลกับ Hardware ที่มีอยู่
ต้อง tune ใหม่ ควรปรับใหม่ ค่าต่างๆสูงเกินไป hardware รับไม่ไหว จะทำให้ server hang หรือมี process เยอะเกินไปรอคิวการประมวลผล
เช่น
ServerLimit 4096
MaxClients 4096
โดยทั่วไปเว็บที่ใช้ php มี 4 แสนกว่า page views ก็ปรับค่าไม่ถึงนี้
สองค่าด้านบน จะทำให้ให้ server ล่มไปก่อน เนื่องจาก ram มีเพียง 12 GB เมื่อ ram ใช้หมดไปต่อไปจะใช้ Swap แทนใน HDD
พอใช้ Swap เว็บจะเริ่มช้า พอ SWAP เต็ม หลังจากนั้น CPU avg load จะขึ้นเป็นหลักร้อย ทำให้ Sever Hang ในที่สุด
สูตรคำนวณ ServerLimit and MaxClients ที่ทำงานได้ดี server ไม่ล่ม
( Total Ram - Mysql Ram - OS - OS Cache) / apache per connect = max client
ค่าต่างๆดูจาก top และ atop
เช่นมี total Ram = 12 GB ,ใช้ mysql 2GB, OS =1GB, OS cache =3GB, Apache per connection = 16MB
(12 - 2 - 1 -3 )0.016 = 375 Max_Clients
375 สามารถขยับได้ขึ้นอีก แล้วรอดูผลการโหลด เช่น ขยับไป 400 500 700
ปรับขึ้นได้เนื่องการโหลดแต่ละชุุด Apache per connection อาจจะใช้น้อย ส่งผลให้ใช้ ram น้อย
ผลข้างเคียงเมื่อปรับสูงมากไป พอไปเจอช่วง แต่ละ connection ใช้ ram สูงๆพอรวมกันมากๆ server จะค้าง และโหลดสุงลิ่ว
KeepAliveTimeout ควรลดลงมา 2-3
4)RAM ไม่พอ ดูจาก TOP ที่ส่งมาให้ดู แนะให้เพิ่ม RAM อีก 12 GB รวมเป็น 24GB
ดูจาก Top เห็น 58.0%wa เกิดจาก Ram หมด แล้วมันไปใช้ disk IO wait สูง.
Ram 66,648k free พอมันจะหมดมันจะไปใช้ Swap แทน
Swap ถูกใช้ไป 1,694,908k used
1.6 GB ถูกใช้ใน Swap เขียนและอ่านใน HDD จะทำให้เกิด Disk IO ทำให้เว็บโหลดช้า ถ้า Swap เครื่องจะ Hang
Loadavg โหลดขึ้นไป 100 -1000 เลยทีเดียว
5) มี Apache = 1004 process
นี่คือปัญหาใหญ่ process เยอะมาก ผิดปกติ ทั้งที่ Avg Load ไม่สูง และ mysql ก็ใช้ cpu & ram ไม่มาก แถมยัง mysql connection ยังสูงมากเหลือเฟือ
ปัญหาไม่น่าจะใช่ mysql
ถ้า run mysqladmin process ได้ผลมาว่าออกมาไม่มีคิวรอมาก ก็ใช่เลยไม่ใช่เกิดจาก mysql
Server spec นี้ ram ขนาดนี้ แล้วมี 1004 process ขนาดนี้ ถ้ามันทำงานปกติถ้า avg load จะสูงกว่า
ที่มี process จำนวณมาก ต้องสืบดูเชิงลึกว่าเกิดจากอะไร
ยกตัวอย่างกรณีหนึ่งที่ปํญหาคล้ายๆกัน
มี Web server ตัวหนึ่ง run apache and php อย่างเดียว แล้วเรียกรูปจาก อีก server ผ่าน NFS
อยู่มาวันหนึ่ง NFS server มีปัญหา ทำให้ web server เรียกรูปไม่ได้ พอไปดูที่ web server ปราฏกว่า process มากผิดปกติ เพราะว่าการทำงานแต่ละ process ไม่สิ้นสุด เลยมี process เพิ่มขึ้นเรื่อยๆ แล้ว apache connection ก็เต็มคนเข้าเว็บต่อไปอีกไม่ได้
เว็บเขียนเองควรต้องกลับไปดู code ใหม่ และใช้ PHP Performance Optimization
และ อาจจะต้องใช้ Ram based Caching เข้ามาช่วย ตรงส่วนของ web server
-----------------------
สิ่งที่ควรปรับปรุง
1)Tune Apache and MySql ใหม่
2)เพิ่ม Ram
3)PHP Performance Optimization
4)อาจจะต้อง แยก sub domain ไปโฮสอีกเครืองรันคู่ขนานกันไป เพื่อให้ process ของเครื่องหลักลดลงและเพิ่มการโหลดที่เร็ว ลดการทำงานของ main server ยืดอายุการใช้งาน
-----------------------
เกี่ยวกับ Performance จะทำเองก็ได้แต่อาจจะใช้เวลานานในการลองผิดถูกและสืบและแก้ไขปัญหา โดยเฉลี่ยไปกว่าจะเก่ง เรียนจบมาแล้วไปทำงานสายตรงแลมีประสบการณ์ทำงานกับเว็บขนาดใหญ่ใช้เวลาประมาณ 10ปีขึ้นไป
ถ้าต้องการไม่ให้เวลานานมากก็หาคนที่ความสามารถทางด้านนี้มาช่วย.
-----------------------
พอดีเมื่อวานได้พบพี่ต่อ tdelphi มาทักทาง msn และได้คุยกับ พี่ต่อและคุณ ronin2000 ทาง msn เว็บนี้คนเข้า 9 หมื่นกว่าคนต่อวัน และเขาได้ทำการ tune เครืองกันใหม่ น่าจะได้ผลดีในเร็ววัน.
1) เครื่องนี้ไม่โดน DDOS ประเมิณคร่าวๆเท่าที่พิมพ์มาให้ดู
2) my.cnf ควรปรับใหม่
ปรับค่าไม่สมดุลกับ Hardware spec ที่มีอยู่
ตามที่ให้มาปรับไม่เหมราะกัยเครื่องไป 60% ผมจะไม่กล่าวรายละเอียดมากเพราะว่าต้องพิมพ์เยอะ
ปรับ buffer เยอะเกินไป
และ max_connection สูงไป ถ้าวิ่งจริงๆ server จะล่มไปก่อน เนื่องจาก Ram ไม่พอ
นอกจากว่า จะใช้ mysql persident connection เพื่อ performance และมี ram มากพอ
ถ้าเว็บขนาดใหญ่ มีการ write เยอะๆ ถ้าเปลี่ยน mysql engine เป็น innodb ก็จะดี เพื่อเว็บไหลคล่องไม่ให้เหกิดปัญหา table lockและไม่ต้อง คอย repair db
3)ปรับ Apache ไม่สมดุลกับ Hardware ที่มีอยู่
ต้อง tune ใหม่ ควรปรับใหม่ ค่าต่างๆสูงเกินไป hardware รับไม่ไหว จะทำให้ server hang หรือมี process เยอะเกินไปรอคิวการประมวลผล
เช่น
ServerLimit 4096
MaxClients 4096
โดยทั่วไปเว็บที่ใช้ php มี 4 แสนกว่า page views ก็ปรับค่าไม่ถึงนี้
สองค่าด้านบน จะทำให้ให้ server ล่มไปก่อน เนื่องจาก ram มีเพียง 12 GB เมื่อ ram ใช้หมดไปต่อไปจะใช้ Swap แทนใน HDD
พอใช้ Swap เว็บจะเริ่มช้า พอ SWAP เต็ม หลังจากนั้น CPU avg load จะขึ้นเป็นหลักร้อย ทำให้ Sever Hang ในที่สุด
สูตรคำนวณ ServerLimit and MaxClients ที่ทำงานได้ดี server ไม่ล่ม
( Total Ram - Mysql Ram - OS - OS Cache) / apache per connect = max client
ค่าต่างๆดูจาก top และ atop
เช่นมี total Ram = 12 GB ,ใช้ mysql 2GB, OS =1GB, OS cache =3GB, Apache per connection = 16MB
(12 - 2 - 1 -3 )0.016 = 375 Max_Clients
375 สามารถขยับได้ขึ้นอีก แล้วรอดูผลการโหลด เช่น ขยับไป 400 500 700
ปรับขึ้นได้เนื่องการโหลดแต่ละชุุด Apache per connection อาจจะใช้น้อย ส่งผลให้ใช้ ram น้อย
ผลข้างเคียงเมื่อปรับสูงมากไป พอไปเจอช่วง แต่ละ connection ใช้ ram สูงๆพอรวมกันมากๆ server จะค้าง และโหลดสุงลิ่ว
KeepAliveTimeout ควรลดลงมา 2-3
4)RAM ไม่พอ ดูจาก TOP ที่ส่งมาให้ดู แนะให้เพิ่ม RAM อีก 12 GB รวมเป็น 24GB
ดูจาก Top เห็น 58.0%wa เกิดจาก Ram หมด แล้วมันไปใช้ disk IO wait สูง.
Ram 66,648k free พอมันจะหมดมันจะไปใช้ Swap แทน
Swap ถูกใช้ไป 1,694,908k used
1.6 GB ถูกใช้ใน Swap เขียนและอ่านใน HDD จะทำให้เกิด Disk IO ทำให้เว็บโหลดช้า ถ้า Swap เครื่องจะ Hang
Loadavg โหลดขึ้นไป 100 -1000 เลยทีเดียว
5) มี Apache = 1004 process
นี่คือปัญหาใหญ่ process เยอะมาก ผิดปกติ ทั้งที่ Avg Load ไม่สูง และ mysql ก็ใช้ cpu & ram ไม่มาก แถมยัง mysql connection ยังสูงมากเหลือเฟือ
ปัญหาไม่น่าจะใช่ mysql
ถ้า run mysqladmin process ได้ผลมาว่าออกมาไม่มีคิวรอมาก ก็ใช่เลยไม่ใช่เกิดจาก mysql
Server spec นี้ ram ขนาดนี้ แล้วมี 1004 process ขนาดนี้ ถ้ามันทำงานปกติถ้า avg load จะสูงกว่า
ที่มี process จำนวณมาก ต้องสืบดูเชิงลึกว่าเกิดจากอะไร
ยกตัวอย่างกรณีหนึ่งที่ปํญหาคล้ายๆกัน
มี Web server ตัวหนึ่ง run apache and php อย่างเดียว แล้วเรียกรูปจาก อีก server ผ่าน NFS
อยู่มาวันหนึ่ง NFS server มีปัญหา ทำให้ web server เรียกรูปไม่ได้ พอไปดูที่ web server ปราฏกว่า process มากผิดปกติ เพราะว่าการทำงานแต่ละ process ไม่สิ้นสุด เลยมี process เพิ่มขึ้นเรื่อยๆ แล้ว apache connection ก็เต็มคนเข้าเว็บต่อไปอีกไม่ได้
เว็บเขียนเองควรต้องกลับไปดู code ใหม่ และใช้ PHP Performance Optimization
และ อาจจะต้องใช้ Ram based Caching เข้ามาช่วย ตรงส่วนของ web server
-----------------------
สิ่งที่ควรปรับปรุง
1)Tune Apache and MySql ใหม่
2)เพิ่ม Ram
3)PHP Performance Optimization
4)อาจจะต้อง แยก sub domain ไปโฮสอีกเครืองรันคู่ขนานกันไป เพื่อให้ process ของเครื่องหลักลดลงและเพิ่มการโหลดที่เร็ว ลดการทำงานของ main server ยืดอายุการใช้งาน
-----------------------
เกี่ยวกับ Performance จะทำเองก็ได้แต่อาจจะใช้เวลานานในการลองผิดถูกและสืบและแก้ไขปัญหา โดยเฉลี่ยไปกว่าจะเก่ง เรียนจบมาแล้วไปทำงานสายตรงแลมีประสบการณ์ทำงานกับเว็บขนาดใหญ่ใช้เวลาประมาณ 10ปีขึ้นไป
ถ้าต้องการไม่ให้เวลานานมากก็หาคนที่ความสามารถทางด้านนี้มาช่วย.
-----------------------
พอดีเมื่อวานได้พบพี่ต่อ tdelphi มาทักทาง msn และได้คุยกับ พี่ต่อและคุณ ronin2000 ทาง msn เว็บนี้คนเข้า 9 หมื่นกว่าคนต่อวัน และเขาได้ทำการ tune เครืองกันใหม่ น่าจะได้ผลดีในเร็ววัน.
