• หมวดหมู่

  • คลังเก็บ

  • @NattawutPor

  • Admin

ปัญหาเว็บช้า หรือเว็บล่มบ่อย

Database ตอบสนองช้า
มีสาเหตุหลายประการที่ Database จะตอบสนองได้ช้าครับ ปัญหาพวกนี้ไม่สามารถแก้ไขได้ด้วยการ upgrade server ตัวเดียวนอกจากแยก database ออกเป็นหลายเครื่อง ทำ Database Replication เท่านั้น หากคุณยังไม่มีกะตัง หรือไม่อยากแก้ปัญหาที่ปลายเหตุลองดูสาเหตุของปัญหาด้านล่างกันก่อนนะครับ มีสาเหตุหลักดังนี้
Database ไม่ได้ใส่ index key เอาไว้ – อันนี้เป็นปัญหา classic ครับ เป็นคอขวดอันแรกที่จะได้เจอ ส่วนวิธีใส่ index key ก็เข้า phpmyadmin คลิกที่ไอคอนสายฟ้าด้านหลัง field ที่มีการ query “WHERE xxx = ‘yyy’” อยู่บ่อยๆ เพียงเท่านี้การ query ในแต่ละครั้งก็จะเร็วขึ้นเป็นอย่างมากครับ สำหรับตัวช่วยพิจารณาเพิ่ม index ว่าจะเพิ่ม field ใดบ้าง ลองใช้ Mysql Slow Query log ช่วยได้ครับ อ่านวิธีเปิดใช้งาน หากคุณเช่า host อยู่ลองสอบถาม Host เค้าอาจจะมีเปิดให้อยู่แล้ว เพียงแต่สอบถาม path ที่เก็บ Log ตัวนี้เท่าน้้นก็ได้ครับ
จำนวน Query ต่อหน้ามีเยอะเกินไป – อันนี้อาจเกิดจากคุณใส่ query ไว้ใน loop หากแยกออกมา query อีกแบบ เพื่อให้ query ครั้งเดียว แล้วมาใช้ php หรือ server side script ช่วยกรองข้อมูลแทน จะช่วยได้ครับ หรืออาจเกิดจากคุณใช้ framework แล้วมี bug ของ framework ที่ทำให้เกิด query ที่ไม่จำเป็นจำนวนมากได้เช่นกัน ต้องลองตรวจสอบดูครับ
เว็บไซต์ของคุณไม่มีการใช้งาน Cache – อันนี้โดยเฉพาะอย่างยิ่ง Memcache ครับ เมื่อมีคนเข้าเว็บไซต์คุณมากๆ แล้ว memcache จะมีส่วนช่วยในการปรับปรุง performance ของคุณอย่างมาก เนื่องจากช่วยลดภาระการ query database ให้ไปเรียกใช้ข้อมูลจากใน memory (ซึ่งเร็วกว่าการ query database ซึ่งอ่านจาก disk มากกว่า 10 เท่า) ตัวนี้หากทาง host ของคุณไม่ได้ติดตั้งไว้ให้คงจะลำบากหน่อยครับ หรือหากใครมี server เป็นของตัวเองแนะนำให้ติดตั้งใช้งานเลยครับ โดยเราจะต้องเปลี่ยนพฤติกรรมการเขียน code ของเราใน php หรือ server side script อื่นๆ ด้วยเนื่องจากต้องสั่งให้ทดลองดึงจาก memcache ก่อน หากไม่มีค่าค่อยดึงจาก database โดยคุณจะต้องเป็นคนตัดสินใจเองว่าข้อมูลใดจะเก็บลง memcache อะไรจะไม่เก็บ
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 มากเกินไปมีดังนี้ครับ
Script php หรือ server side อื่นๆ ของคุณมีปัญหา – พูดง่ายๆ คือคุณเขียน code ห่วย ทำอะไรไม่เข้าท่าไว้นั่นเอง เช่นอาจมีการวนลูปเรียกคำสั่งบางอย่างซ้ำๆ กันมากเกินไป อันนี้คงต้องลองไล่หาดูเองละครับ
คุณมี Background Process บางอย่างเยอะ – เช่น เว็บของคุณมีการเรียกใช้งาน command บางอย่างที่ต้องเรียกโปรแกรมอื่นผ่าน shell ตัวโปรแกรมอื่นนี่แหละที่อาจจะเป็นสาเหตุทำให้ CPU ทำงานหนักก็เป็นได้ เช่น เว็บไซต์คุณเป็นเว็บแชร์วิดีโอ ต้องมีการใช้งาน ffmpeg เพื่อย่อขนาดวิดีโอ หรือเว็บไซต์คุณมีการใช้งาน resize หรือ operation อื่นๆ ที่เกี่ยวข้องกับการจัดการรูปภาพอยู่บ่อยๆ ตรงนี้ก็อาจเป็นสาเหตุประการสำคัญได้เช่นกัน

Memory ไม่พอ
เป็นอีกหนึ่งสาเหตุที่มักจะเกิด หลังจากผ่าน Database ช้าและ CPU ทำงานหนักมาแล้ว (แต่ทั้งนี้และทั้งนั้น มันอาจจะเกิดก่อนสองปัญหาใหญ่ด้านบนก็ได้ เพียงแต่โอกาสค่อนข้างน้อยกว่ามาก) มีสาเหตุดังนี้
Script php หรือ server side อื่นๆ ของคุณมีการบริโภค memory มหาศาล – เช่นมีการสร้าง object จาก class ที่ไม่จำเป็นอยู่ใน loop ตลอดเวลา ทางที่ดีหาก object ตัวไหนไม่มีการใช้งานแล้วก็ให้สั่ง destroy คือ memory หลังใช้งานเสร็จด้วยครับ ซึ่งตรงนี้ในแต่ละภาษาจะไม่เหมือนกันเลย ต้องศึกษาต่อเองครับ แต่สำหรับ php ก็เพียงสั่ง $var = null; เท่านั้นครับ
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 หัวข้อใหญ่ด้านบนอยู่ดีนะครับ นี่แค่ชั่วคราวเท่านั้น)
ลดค่า MaxClients ใน apache config ลง – MaxClients เป็นจำนวน process ที่ apache จะสร้าง ยิ่งเซ็ตเยอะ จะยิ่งรองรับคนปริมาณมากได้ดีขึ้น แต่ก็ใช้เซ็ตให้น้อยลงเพื่อป้องกัน server crash ได้เช่นกัน ค่าตัวนี้หากเซ็ตน้อยเกินไปเว็บจะช้ามากครับ แต่ก็ดีกว่า server crash ไม่ใช่เหรอครับ วิธีนี้ช่วยแก้ปัญหาที่เกิดจาก 3 ปัญหาใหญ่ได้ทั้งหมด แต่ก็แลกมากับความช้าของ server ระหว่างที่ server ทำงานช้า ก็รีบๆ หาตัวการที่แท้จริงให้ได้ไวๆ นะครับ 🙂
ตั้ง cron restart apache service – หากเว็บคุณล่มเนื่องจากใช้งานไปนานๆ แล้ว Memory ล้น เสมอๆ วิธีนี้ช่วยได้ครับ ความถี่ขึ้นกับว่า memory คุณหมดเร็วแค่ไหน และต้องการให้ล่มไม่เกินกี่นาที (ของผม 10 นาที) วิธีนี้ผมไม่แน่ใจว่ามีข้อเสียหรือเปล่า แต่เท่าที่ลองมายังไม่เกิดปัญหาอะไรครับ (แต่อย่าตั้ง cron restart mysql service เชียวนะ ผมไม่รับรองความปลอดภัย อาจทำให้ database บางส่วนไม่ update หรือหายบ่อยๆ ได้)
ตั้ง cron reboot เครื่อง – คล้ายกับข้อ 2 หาก memory ยังไม่เคลียร์ แต่อันนี้ reboot มันทั้งเครื่องเลย ปกติการ reboot จะใช้เวลากว่าเว็บจะกลับมาใช้งานได้ ดังนั้นอย่าตั้งถี่เกินไปนะครับอันนี้ไม่แนะนำให้ reboot เกินวันละครั้งถ้าอาการไม่หนักจริงๆ
เพิ่มค่า max_connections ใน mysql config (my.cnf) – ใช้กรณี Database ขึ้น too many connection บ่อยๆ เท่านั้นครับ ก็ลองเพิ่มค่านี้ดูครับ
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 ด้วยเช่นกัน

ที่มา:http://blog.levelup.in.th

้start/stop apache on freebsd

คำสั่ง start/stop apache on FreeBSD ดังนี้
/usr/local/etc/rc.d/apache22 start/stop

Restart Httpd Server

Restart Httpd Server
by VIVEK GITE on MARCH 18, 2008

Q. I’m using CentOS / RHEL / Fedora Linux server and I’d like to restart my httpd server after making some changes to httpd.conf file. How do I restart httpd?

A. You can use service command to restart httpd. Another option is use /etc/init.d/httpd service script.

Login as root user and type the following commands:

Task: Start httpd server:

# service httpd start

Task: Restart httpd server:

# service httpd restart

Task: Stop httpd server:

# service httpd stop

Please note that restart option is a shorthand way of stopping and then starting the Apache HTTPd Server. You need to restart server whenever you make changes to httpd.conf file. It is also good idea to check configuration error before typing restart option:
# httpd -t
# httpd -t -D DUMP_VHOSTS

Sample output:

Syntax OK
Now restart httpd server:
# service httpd restart

Where,

-t : Run syntax check for config files
-t -D DUMP_VHOSTS : Run syntax check for config files and show parsed settings only for vhost.
/etc/init.d/httpd script
You can also use following command:
# /etc/init.d/httpd restart
# /etc/init.d/httpd start
# /etc/init.d/httpd stop

A note about Debian / Ubuntu Linux

Type the following command under Debian / Ubuntu Linux:
# /etc/init.d/apache2 restart
# /etc/init.d/apache2 stop
# /etc/init.d/apache2 start

You can also use service command under Debian / Ubuntu Linux:
# service apache2 restart
# service apache2 stop
# service apache2 start

ที่มา: http://www.cyberciti.biz/faq/restart-httpd/

how to config root login over ssh on freeBSD

How to enable root login over SSH on FreeBSD 8.2

Unline many linux distrubutions FreeBSD by default disables ‘root’ login over SSH (at least it does with FreeBSD 8.2), If you do need to enable remote root logins over SSH this simple blog post will show you what you need to do; the more secure way of gaining remote admin access to your server would ideally be logging in as an alternative user and then using SUDO to perform any administrative tasks.

Firstly, You will need to edit the SSH daemon configuration file to enable this like so..

ee /etc/ssh/sshd_config

Find this line:

#PermitRootLogin no

and change it to:

PermitRootLogin yes

Basically you should have removed the hash ‘#’ from the start of the line (uncomment the line basically) and then change ‘no’ to ‘yes’, save the file and then restart the SSH daemon like so..

/etc/rc.d/sshd restart

…and your done, you should now be able to login as ‘root’ over SSH on your FreeBSD server!

ที่มา : http://blog.bobbyallen.me/2011/07/22/how-to-enable-root-login-over-ssh-on-freebsd-8-2/

การกำหนด user quota ใน freebsd

สำหรับ Freebsd หลังจากติดตั้ง disk quotaแล้ว สามารถกำหนด quota ให้กับ user ที่สร้างใหม่ได้ โดยใช้คำสั่ง

$edquota -u username

หลังจากนั้น แก้ไข ตามต้องการ soft คือแจ้งเตือนเมื่อถึงค่านี้ hard ค่อโควต้าสูงสุดที่กำหนดให้ เป็น kbyte

Quotas for user sake:
/home: kbytes in use: 151602, limits (soft = 512000, hard = 614000)
inodes in use: 9404, limits (soft = 512000, hard = 614000)

ในกรณีที่ user quota นั้น มีค่าเหมือนกับ เราสามารถกำหนดโดยคัดลอกจากที่มีอยู่แล้วเช่น

#edquota -p user0 user1 user2 user3

จะทำการคัดลอกค่า quota user0 ไปยัง user1 user2 user3

สามารถตรวจสอบ ค่าที่ตั้งไว้ได้ เช่น

#quota -v user

Disk quotas for user sake (uid 1608):
Filesystem usage quota limit grace files quota limit grace
/home 151602 512000 614000 9404 512000 614000

ถ้าตรวจสอบของตนเอง

$quota

Disk quotas for user sake (uid 1608):
Filesystem usage quota limit grace files quota limit grace
/home 151602 512000 614000 9404 512000 614000

ที่มา: http://sake.in.th/blog เมื่อ 03/04/2014

ส่ง URL บล็อกนักเรียนโครงงานหุ่นยนต์ ม.5

นักเรียน ม.5 โครงงานหุ่นยนต์ให้ส่ง URL Blog ที่นี่

ระบบเครือข่ายคอมพิวเตอร์ไร้สาย

ตรวจสอบผลการส่งงานวิชาระบบเครือข่ายคอมพิวเตอร์ ม.6