โฮมเพจ » ทำอย่างไร » วินิจฉัยปัญหาการโหลดเซิร์ฟเวอร์ Linux ด้วยสคริปต์อย่างง่าย

    วินิจฉัยปัญหาการโหลดเซิร์ฟเวอร์ 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