ทำไมเว็บไซต์ของคุณช้า หรือล่มบ่อย? by

31
Jan
9

เคยไหมเว็บไซต์อยู่ๆ ก็ช้าลงอย่างไม่ทราบสาเหตุ upgrade server เป็นตัวใหม่ก็ยังไม่หาย ล่มแล้วล่มอีกทุกวี่ทุกวัน หาสาเหตุไม่เจอ มืด 8 ด้านไปหลายวัน Marketing ก็เร่งให้หาสาเหตุให้เจอไวๆ ไม่งั้นลง ads เพิ่มคนเข้าไม่ได้ นั่นคือสิ่งที่ผมพึ่งเจอมาครับ ฮ่าๆ

ช่วงนี้ทางเกมของผมประสบปัญหากับ performance อย่างหนักทุกเกมเลยครับ ช่วงนี้เลยต้องศึกษาเรื่อง performance อย่างเต็มที่ ลองมาดูสาเหตุหลักๆ ที่ทำให้เว็บไซต์ของคุณช้ากันครับ

Database ตอบสนองช้า

มีสาเหตุหลายประการที่ Database จะตอบสนองได้ช้าครับ ปัญหาพวกนี้ไม่สามารถแก้ไขได้ด้วยการ upgrade server ตัวเดียวนอกจากแยก database ออกเป็นหลายเครื่อง ทำ Database Replication เท่านั้น หากคุณยังไม่มีกะตัง หรือไม่อยากแก้ปัญหาที่ปลายเหตุลองดูสาเหตุของปัญหาด้านล่างกันก่อนนะครับ มีสาเหตุหลักดังนี้

  1. Database ไม่ได้ใส่ index key เอาไว้ - อันนี้เป็นปัญหา classic ครับ เป็นคอขวดอันแรกที่จะได้เจอ ส่วนวิธีใส่ index key ก็เข้า phpmyadmin คลิกที่ไอคอนสายฟ้าด้านหลัง field ที่มีการ query “WHERE xxx = ‘yyy’” อยู่บ่อยๆ เพียงเท่านี้การ query ในแต่ละครั้งก็จะเร็วขึ้นเป็นอย่างมากครับ สำหรับตัวช่วยพิจารณาเพิ่ม index ว่าจะเพิ่ม field ใดบ้าง ลองใช้ Mysql Slow Query log ช่วยได้ครับ อ่านวิธีเปิดใช้งาน หากคุณเช่า host อยู่ลองสอบถาม Host เค้าอาจจะมีเปิดให้อยู่แล้ว เพียงแต่สอบถาม path ที่เก็บ Log ตัวนี้เท่าน้้นก็ได้ครับ
  2. จำนวน Query ต่อหน้ามีเยอะเกินไป – อันนี้อาจเกิดจากคุณใส่ query ไว้ใน loop หากแยกออกมา query อีกแบบ เพื่อให้ query ครั้งเดียว แล้วมาใช้ php หรือ server side script ช่วยกรองข้อมูลแทน จะช่วยได้ครับ หรืออาจเกิดจากคุณใช้ framework แล้วมี bug ของ framework ที่ทำให้เกิด query ที่ไม่จำเป็นจำนวนมากได้เช่นกัน ต้องลองตรวจสอบดูครับ
  3. เว็บไซต์ของคุณไม่มีการใช้งาน Cache - อันนี้โดยเฉพาะอย่างยิ่ง Memcache ครับ เมื่อมีคนเข้าเว็บไซต์คุณมากๆ แล้ว  memcache จะมีส่วนช่วยในการปรับปรุง performance ของคุณอย่างมาก เนื่องจากช่วยลดภาระการ query database ให้ไปเรียกใช้ข้อมูลจากใน memory (ซึ่งเร็วกว่าการ query database ซึ่งอ่านจาก disk มากกว่า 10 เท่า) ตัวนี้หากทาง host ของคุณไม่ได้ติดตั้งไว้ให้คงจะลำบากหน่อยครับ หรือหากใครมี server เป็นของตัวเองแนะนำให้ติดตั้งใช้งานเลยครับ โดยเราจะต้องเปลี่ยนพฤติกรรมการเขียน code ของเราใน php หรือ server side script อื่นๆ ด้วยเนื่องจากต้องสั่งให้ทดลองดึงจาก memcache ก่อน หากไม่มีค่าค่อยดึงจาก database โดยคุณจะต้องเป็นคนตัดสินใจเองว่าข้อมูลใดจะเก็บลง memcache อะไรจะไม่เก็บ
  4. Table ถูก Lock บ่อย – ปัญหานี้ควรแก้ไขปัญหาในข้อ 1-3 มาก่อนแล้ว เนื่องจากปัญหานี้จะเกิดขึ้นเมื่อมีผู้ใช้งานเยอะมากจริงๆ แล้วเท่านั้น ปัญหานี้เกิดจากปกติแล้วหาก Table มีการ update หรือ Insert ตัว Table จะถูก Lock ไม่ให้อ่านหรือเขียนข้อมูลในขณะนั้น และหากมีเหตุการณ์เช่นนี้เกิดขึ้น ต่อมาให้พิจารณาลด Query จำพวก update, insert ที่กระทำกับ Table ที่ถูก Lock ที่ไม่จำเป็นลงให้มากที่สุด และสุดท้ายคือหากคุณสามารถเปลี่ยน Database Engine เป็น InnoDB ที่ Table นั้นๆ ได้ (Default ทั่วไปมักเป็น MyISAM) ก็ให้ทำไปเลยครับเนื่องจาก InnoDB จะ Lock แค่ row ที่ถูก update หรือ Insert ไม่ Lock ทั้ง table จึงช่วยเรื่องนี้ได้มาก แต่ทั้งนี้และทั้งนั้นการแปลงจาก MyISAM มาเป็น InnoDB จะมีข้อจำกัดบางเรื่องอยู่เช่นมีการจำกัดขนาดความจุสูงสุดต่อ row ควรศึกษาข้อมูลดีๆ ก่อนเปลี่ยนครับ

CPU Server ขึ้นสูง

โดยปกติแล้ว CPU Server หากเป็นเว็บไซต์ธรรมดาทั่วไปโอกาสที่จะขึ้นสูงถึงเกือบ 100% มีต่ำมากครับ ขนาดเว็บเกมของผมเองส่วนใหญ่ยังขึ้นไม่ค่อยเกิน 20% เลยครับ ยกเว็นเป็นเว็บไซต์เฉพาะทางจริงๆ สาเหตุของการใช้งาน CPU มากเกินไปมีดังนี้ครับ

  1. Script php หรือ server side อื่นๆ ของคุณมีปัญหา – พูดง่ายๆ คือคุณเขียน code ห่วย ทำอะไรไม่เข้าท่าไว้นั่นเอง เช่นอาจมีการวนลูปเรียกคำสั่งบางอย่างซ้ำๆ กันมากเกินไป อันนี้คงต้องลองไล่หาดูเองละครับ
  2. คุณมี Background Process บางอย่างเยอะ – เช่น เว็บของคุณมีการเรียกใช้งาน command บางอย่างที่ต้องเรียกโปรแกรมอื่นผ่าน shell ตัวโปรแกรมอื่นนี่แหละที่อาจจะเป็นสาเหตุทำให้ CPU ทำงานหนักก็เป็นได้ เช่น เว็บไซต์คุณเป็นเว็บแชร์วิดีโอ ต้องมีการใช้งาน ffmpeg เพื่อย่อขนาดวิดีโอ หรือเว็บไซต์คุณมีการใช้งาน resize หรือ operation อื่นๆ ที่เกี่ยวข้องกับการจัดการรูปภาพอยู่บ่อยๆ ตรงนี้ก็อาจเป็นสาเหตุประการสำคัญได้เช่นกัน

Memory ไม่พอ

เป็นอีกหนึ่งสาเหตุที่มักจะเกิด หลังจากผ่าน Database ช้าและ CPU ทำงานหนักมาแล้ว (แต่ทั้งนี้และทั้งนั้น มันอาจจะเกิดก่อนสองปัญหาใหญ่ด้านบนก็ได้ เพียงแต่โอกาสค่อนข้างน้อยกว่ามาก) มีสาเหตุดังนี้

  1. Script  php หรือ server side อื่นๆ  ของคุณมีการบริโภค memory มหาศาล – เช่นมีการสร้าง object จาก class ที่ไม่จำเป็นอยู่ใน loop ตลอดเวลา ทางที่ดีหาก object ตัวไหนไม่มีการใช้งานแล้วก็ให้สั่ง destroy คือ memory หลังใช้งานเสร็จด้วยครับ ซึ่งตรงนี้ในแต่ละภาษาจะไม่เหมือนกันเลย ต้องศึกษาต่อเองครับ แต่สำหรับ php ก็เพียงสั่ง $var = null; เท่านั้นครับ
  2. Process Apache ของคุณแต่ละ process กิน memory มากเกินไป – อันนี้เป็นผลสืบเนื่องมาจากข้อ 1 ครับคือมี script บางส่วนที่กิน memory เยอะ จึงส่งผลมายัง Apache ด้วย โดยจะมีวิธีแก้ปัญหาเฉพาะหน้าอยู่ช่วยให้เรามาแก้ที่ server แบบชั่วคราวไปก่อนระหว่างที่ไปไล่หาตัวการที่แท้จริงใน script โดยการไปแก้ไข apache config ในส่วนของ MaxRequestsPerChild หากเป็น 0 อยู่แสดงว่าเป็น unlimit ครับ ไม่ดีแน่ ทิ้งไว้นานๆ memory ของเราจะถูกสูบจนหมด ให้เซ็ตค่าในช่วงราวๆ 50-200 ก็พอครับ ทั้งนี้และทั้งนั้นขึ้นกับประเภทการใช้งานเว็บไซต์ของคุณเองอยู่ดีว่าค่าไหนที่เหมาะสมที่สุดอยู่ดี อย่ายึดติดกับเลขที่ผมเสนอมากเกินไป สรุปง่ายๆ ว่าเซ็ตเป็นอะไรแล้วรัน server ไปนานๆ memory ของแต่ละ process ไม่พุ่งเพิ่มจากตอนพึ่งเริ่ม start apache มากนักก็ค่านั้นแหละครับ หากเซ็ตค่านี้น้อยเกินไปอาจจะทำให้ server ช้าแทนได้

Server crash บ่อย

อันนี้เป็นผลที่เกิดจาก Database รับ Load ไม่ไหวจริงๆ, CPU ทะลุ 100%, ใช้งาน Memory เกินกว่าที่มี ทำให้ต้องไปใช้ swap แทน ฯลฯ หรือก็คือปัญหา 3 หัวข้อใหญ่ด้านบนมันดำเนินมาถึงขั้นเลวร้ายแล้วนั่นเอง มีวิธีแก้ไขปัญหาเฉพาะหน้าดังนี้ (สุดท้ายต้องไปแก้ที่ 3 หัวข้อใหญ่ด้านบนอยู่ดีนะครับ นี่แค่ชั่วคราวเท่านั้น)

  1. ลดค่า MaxClients ใน apache config ลง – MaxClients เป็นจำนวน process ที่ apache จะสร้าง ยิ่งเซ็ตเยอะ จะยิ่งรองรับคนปริมาณมากได้ดีขึ้น แต่ก็ใช้เซ็ตให้น้อยลงเพื่อป้องกัน server crash ได้เช่นกัน ค่าตัวนี้หากเซ็ตน้อยเกินไปเว็บจะช้ามากครับ แต่ก็ดีกว่า server crash ไม่ใช่เหรอครับ วิธีนี้ช่วยแก้ปัญหาที่เกิดจาก 3 ปัญหาใหญ่ได้ทั้งหมด แต่ก็แลกมากับความช้าของ server ระหว่างที่ server ทำงานช้า ก็รีบๆ หาตัวการที่แท้จริงให้ได้ไวๆ นะครับ :)
  2. ตั้ง cron restart apache service – หากเว็บคุณล่มเนื่องจากใช้งานไปนานๆ แล้ว Memory ล้น เสมอๆ วิธีนี้ช่วยได้ครับ ความถี่ขึ้นกับว่า memory คุณหมดเร็วแค่ไหน และต้องการให้ล่มไม่เกินกี่นาที (ของผม 10 นาที) วิธีนี้ผมไม่แน่ใจว่ามีข้อเสียหรือเปล่า แต่เท่าที่ลองมายังไม่เกิดปัญหาอะไรครับ (แต่อย่าตั้ง cron restart mysql service เชียวนะ ผมไม่รับรองความปลอดภัย อาจทำให้ database บางส่วนไม่ update หรือหายบ่อยๆ ได้)
  3. ตั้ง cron reboot เครื่อง – คล้ายกับข้อ 2 หาก memory ยังไม่เคลียร์ แต่อันนี้ reboot มันทั้งเครื่องเลย ปกติการ reboot จะใช้เวลากว่าเว็บจะกลับมาใช้งานได้ ดังนั้นอย่าตั้งถี่เกินไปนะครับอันนี้ไม่แนะนำให้ reboot เกินวันละครั้งถ้าอาการไม่หนักจริงๆ
  4. เพิ่มค่า max_connections ใน mysql config (my.cnf) – ใช้กรณี Database ขึ้น too many connection บ่อยๆ เท่านั้นครับ ก็ลองเพิ่มค่านี้ดูครับ
  5. upgrade server - option นี้สำหรับคนมีตัง และต้องการความรวดเร็วในการแก้ปัญหาครับ 555 หรือว่าแก้ตามที่ผมบอกทุกอย่างแล้วแต่ไม่ช่วยให้อะไรดีขึ้น แต่ทั้งนี้และทั้งนั้นควร upgrade ให้ถูกส่วนนะครับ ดังนี้
    • Database ตอบสนองช้า – ในขั้นต้นคือแยกเครื่องที่รัน script ออกจากเครื่องที่รัน Database ก่อนครับ ไม่ให้รันอยู่เครื่องเดียวกัน หากทำแล้วยังไม่ช่วยต้องเพิ่มเครื่อง Database เข้าไปอีก และกรณีมี Database มากกว่า 1 เครื่องต้องทำ Database Replication ด้วยเพื่อให้ database แต่ละเครื่องมีข้อมูลที่เหมือนๆ กันตลอด 24 ชั่วโมง
    • CPU Server ขึ้นสูง – เปลี่ยน CPU ครับ ตรงๆ ตัว
    • Memory ไม่พอ – ตรงนี้อาจเกิดจาก script กับ Database ใช้ RAM ร่วมกันจึง Memory ไม่พอด้วย นอกจากเพิ่ม RAM แล้วก็ควรจะแยกเครื่องที่รัน script ออกจาก Database ด้วยเช่นกัน

เอาละครับ นี่เป็นปัญหาที่ผมสรุปมาทั้งหมด หลังงมมาเป็นเดือน คิดว่าคงเป็นประโยชน์ต่อคนทั่วไปมากครับ :)

Enjoy this article?

Consider subscribing to our RSS feed!

9 ความเห็น

  1. มือใหม่
    00:59 on June 27th, 2011

    ขอบคุณมากครับ เป็นแนวทางที่ดีมากเลย
    ผมจะลองเอาไปใช้งานนะครับ

  2. กอล์ฟ
    10:38 on August 11th, 2011

    บทความนี้เป็นประโยชน์มากครับ ได้ความรู้เยอะเลย

  3. itallnews
    01:53 on March 9th, 2012

    เวปผมล่มบ่อยมากเลยอะครับ มันมาจาก RSS Feed หรือป่าวก็ไม่รู้

  4. zagina
    15:54 on January 21st, 2013

    ข้อมูลเยี่ยมมากครับ ได้ความรู้เพิ่มเลย ^^

  5. MxcX
    23:58 on November 19th, 2013

    ขอบคุณครับ มีประโยชน์มาก กำลังนั่งงมอยู่เลย

  6. nine
    10:58 on March 13th, 2016

    พอดีต้องการมี เว็บไซต์ e-commerse เป็นของตนเองอยู่แล้ว แต่เว็บโหลดได้ช้า ประมาณ 17-22 วินาที ควรเริ่มแก้ไขจากตรงใหนคับ

ใส่ความเห็น

RSS feed for comments on this post