วินิจฉัยปัญหาการโหลดเซิร์ฟเวอร์ Linux ด้วยสคริปต์อย่างง่าย
หากคุณเป็นผู้ดูแลระบบมาเป็นระยะเวลาหนึ่งคุณจะได้ค้นพบสถานการณ์ที่เซิร์ฟเวอร์ spikes ในการใช้งาน CPU หรือการใช้งานหน่วยความจำและ / หรือระดับการโหลด การเรียกใช้ 'บนสุด' จะไม่ให้คำตอบกับคุณเสมอไป ดังนั้นคุณจะพบกระบวนการลับ ๆ ล่อๆที่เคี้ยวทรัพยากรระบบของคุณเพื่อให้สามารถฆ่า 'em ได้อย่างไร?
สคริปต์ต่อไปนี้อาจช่วยได้ มันถูกเขียนขึ้นสำหรับเว็บเซิร์ฟเวอร์ดังนั้นจึงมีบางส่วนที่กำลังมองหากระบวนการ httpd โดยเฉพาะและบางส่วนที่จัดการกับ MySQL ขึ้นอยู่กับการปรับใช้เซิร์ฟเวอร์ของคุณเพียงแค่แสดงความคิดเห็น / ลบส่วนเหล่านั้นและเพิ่มส่วนอื่น ๆ มันควรจะใช้สำหรับจุดเริ่มต้น.
ข้อกำหนดเบื้องต้นสำหรับสคริปต์รุ่นนี้คือฟรีแวร์บางตัวที่เผยแพร่ภายใต้สัญญาอนุญาตสาธารณะทั่วไปของ GNU ที่เรียกว่า mytop (มีให้ที่ http://jeremy.zawodny.com/mysql/mytop/) ซึ่งเป็นเครื่องมือที่ยอดเยี่ยมในการตรวจสอบว่า MySQL ทำงานอย่างไร มันเริ่มเก่าแล้ว แต่ก็ยังใช้ได้ดีสำหรับจุดประสงค์ของเราที่นี่.
นอกจากนี้ฉันใช้ mutt เป็น mailer - คุณอาจต้องการเปลี่ยนสคริปต์เพื่อใช้เพียงลินุกซ์ในตัวยูทิลิตี้ 'mail' ฉันวิ่งผ่าน cron ทุกชั่วโมง ปรับตามที่เห็นสมควร โอ้ - และสคริปต์นี้ต้องทำงานเป็นรูทเนื่องจากอ่านจากพื้นที่ที่ได้รับการป้องกันของเซิร์ฟเวอร์.
ดังนั้นเรามาเริ่มกันเลยดีกว่า?
ก่อนอื่นให้ตั้งค่าตัวแปรสคริปต์ของคุณ:
#! / bin / ทุบตี
#
# สคริปต์เพื่อตรวจสอบระดับเฉลี่ยของโหลดระบบเพื่อลองตรวจสอบ
# กระบวนการใดที่ทำให้มันสูงเกินไป ...
#
# 07Jul2010 tjones
#
# ชุดสภาพแวดล้อม
dt = "วันที่ +% d% b% Y-% X"
# ชัดเจนเปลี่ยนไดเรกทอรีต่อไปนี้เป็นที่เก็บไฟล์บันทึกของคุณ
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / ข้อความ"
mysqlLog = "/ var / log / mysqld.log"
# mailstop แรกคืออีเมลมาตรฐานสำหรับรายงาน ที่สองคือสำหรับโทรศัพท์มือถือ (พร้อมรายงานลง)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
เครื่อง = "ชื่อโฮสต์"
# สามข้อต่อไปนี้สำหรับการใช้งาน mytop - ใช้ผู้ใช้ db ที่มีสิทธิ์ดี
dbusr = "ชื่อผู้ใช้"
dbpw = "รหัสผ่าน"
DB = "yourdatabasename"
# ต่อไปนี้เป็นระดับโหลดเพื่อตรวจสอบ - 10 สูงมากดังนั้นคุณอาจต้องการลดระดับ.
levelToCheck = 10
จากนั้นตรวจสอบระดับโหลดของคุณเพื่อดูว่าสคริปต์ควรทำต่อไปหรือไม่:
# ตั้งค่าตัวแปรจากระบบ:
loadLevel = "cat / proc / loadavg | awk" พิมพ์ $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# หากระดับการโหลดสูงกว่าที่คุณต้องการให้เริ่มกระบวนการสคริปต์ มิฉะนั้นให้ออกจาก 0
ถ้า [$ loadLevel -gt $ levelToCheck]; แล้วก็
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "วันที่: $ dt" >> $ tmpfile
echo "ตรวจสอบโหลดระบบและกระบวนการ" >> $ tmpfile
echo "**************************************" >> $ tmpfile
และดำเนินการต่อผ่านการตรวจสอบการเขียนผลลัพธ์ไปยังไฟล์ชั่วคราว เพิ่มหรือลบรายการจากที่นี่ซึ่งเกี่ยวข้องกับสถานการณ์ของคุณ:
# รับตัวแปรเพิ่มเติมจากระบบ:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# แสดงระดับโหลดปัจจุบัน:
echo "ระดับการโหลดคือ: $ loadLevel" >> $ tmpfile
echo "************************************************** * ">> $ tmpfile# แสดงจำนวนกระบวนการ httpd ที่ทำงานอยู่ในขณะนี้ (ไม่รวมลูก ๆ ):
echo "จำนวนกระบวนการ httpd ตอนนี้: $ httpdProcesses" >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# แสดงรายการกระบวนการ:
echo "กระบวนการกำลังทำงาน:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# แสดงข้อมูล MySQL ปัจจุบัน:
echo "ผลลัพธ์จาก mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
แจ้งให้ทราบด้วยคำสั่งด้านบนเราเขียนถึงสองไฟล์ชั่วคราว หนึ่งคือข้อความที่มีขนาดเล็กมากไปยังโทรศัพท์มือถือ หากคุณไม่ต้องการความเร่งด่วนของการแจ้งเตือนโทรศัพท์มือถือเวลาสามนาฬิกาในตอนเช้าคุณสามารถนำสิ่งนี้ออก (และนำกิจวัตรการส่งจดหมายครั้งที่สองออกมาในสคริปต์).
# แสดงยอดนิยมปัจจุบัน:
echo "top จะแสดง:" >> $ tmpfile
echo "top จะแสดง:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
ตรวจสอบเพิ่มเติม:
# แสดงการเชื่อมต่อปัจจุบัน:
echo "netstat ตอนนี้แสดง:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# ตรวจสอบพื้นที่ดิสก์
echo "พื้นที่ดิสก์:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile
จากนั้นเขียนเนื้อหาไฟล์ชั่วคราวไปยังไฟล์บันทึกถาวรมากขึ้นและส่งผลลัพธ์ทางอีเมลไปยังฝ่ายที่เหมาะสม การส่งจดหมายครั้งที่สองนั้นเป็นผลลัพธ์ที่ไม่ได้รับการสรุปซึ่งประกอบด้วยมาตรฐานจาก 'top':
# ส่งผลลัพธ์ไปยังล็อกไฟล์:
/ bin / cat $ tmpfile >> $ logfile# และส่งอีเมลผลลัพธ์ไปยังระบบดูแลระบบ:
/ usr / bin / mutt -s "$ machine มีระดับการโหลดสูง! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
จากนั้นดูแลทำความสะอาดและออก:
# จากนั้นลบไฟล์ temp:
rm $ tmpfile
rm $ topfile
Fi#
ออก 0
หวังว่านี่จะช่วยให้ใครบางคนที่นั่น สคริปต์ที่ประกอบอย่างสมบูรณ์คือ:
#! / bin / ทุบตี
#
# สคริปต์เพื่อตรวจสอบระดับค่าเฉลี่ยของโหลดระบบเพื่อพยายามกำหนดว่ากระบวนการใดเป็น
# ทำให้สูงเกินไป ...
#
# ชุดสภาพแวดล้อม
dt = "วันที่ +% d% b% Y-% X"
# ชัดเจนเปลี่ยนไดเรกทอรีต่อไปนี้เป็นที่เก็บไฟล์บันทึกของคุณ
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / ข้อความ"
mysqlLog = "/ var / log / mysqld.log"
# mailstop แรกคืออีเมลมาตรฐานสำหรับรายงาน ที่สองคือสำหรับโทรศัพท์มือถือ (พร้อมรายงานลง)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
เครื่อง = "ชื่อโฮสต์"
# สามข้อต่อไปนี้สำหรับการใช้งาน mytop - ใช้ผู้ใช้ db ที่มีสิทธิ์ดี
dbusr = "ชื่อผู้ใช้"
dbpw = "รหัสผ่าน"
DB = "yourdatabasename"
# ต่อไปนี้เป็นระดับโหลดเพื่อตรวจสอบ - 10 สูงมากดังนั้นคุณอาจต้องการลดระดับ.
levelToCheck = 10
# ตั้งค่าตัวแปรจากระบบ:
loadLevel = "cat / proc / loadavg | awk" พิมพ์ $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# หากระดับการโหลดสูงกว่าที่คุณต้องการให้เริ่มกระบวนการสคริปต์ มิฉะนั้นให้ออกจาก 0
ถ้า [$ loadLevel -gt $ levelToCheck]; แล้วก็
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "วันที่: $ dt" >> $ tmpfile
echo "ตรวจสอบโหลดระบบและกระบวนการ" >> $ tmpfile
echo "**************************************" >> $ tmpfile# รับตัวแปรเพิ่มเติมจากระบบ:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# แสดงระดับโหลดปัจจุบัน:
echo "ระดับการโหลดคือ: $ loadLevel" >> $ tmpfile
echo "************************************************** * ">> $ tmpfile# แสดงจำนวนกระบวนการ httpd ที่ทำงานอยู่ในขณะนี้ (ไม่รวมลูก ๆ ):
echo "จำนวนกระบวนการ httpd ตอนนี้: $ httpdProcesses" >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# แสดงรายการกระบวนการ:
echo "กระบวนการกำลังทำงาน:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# แสดงข้อมูล MySQL ปัจจุบัน:
echo "ผลลัพธ์จาก mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# แสดงยอดนิยมปัจจุบัน:
echo "top จะแสดง:" >> $ tmpfile
echo "top จะแสดง:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# แสดงการเชื่อมต่อปัจจุบัน:
echo "netstat ตอนนี้แสดง:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# ตรวจสอบพื้นที่ดิสก์
echo "พื้นที่ดิสก์:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************** * ">> $ tmpfile
echo "" >> $ tmpfile# ส่งผลลัพธ์ไปยังล็อกไฟล์:
/ bin / cat $ tmpfile >> $ logfile# และส่งอีเมลผลลัพธ์ไปยังระบบดูแลระบบ:
/ usr / bin / mutt -s "$ machine มีระดับการโหลดสูง! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# จากนั้นลบไฟล์ temp:
rm $ tmpfile
rm $ topfile
Fi#
ออก 0