एक सरल स्क्रिप्ट के साथ लिनक्स सर्वर लोड समस्याओं का निदान करें

एक सरल स्क्रिप्ट के साथ लिनक्स सर्वर लोड समस्याओं का निदान करें
एक सरल स्क्रिप्ट के साथ लिनक्स सर्वर लोड समस्याओं का निदान करें
Anonim

यदि आप किसी भी समय के लिए व्यवस्थापक रहे हैं, तो आपने निश्चित रूप से ऐसी स्थितियों की खोज की है जहां एक सर्वर CPU उपयोग या स्मृति उपयोग और / या लोड स्तर में स्पाइक करता है। 'शीर्ष' चलाना हमेशा आपको जवाब नहीं देगा, या तो। तो आप उन चुस्त प्रक्रियाओं को कैसे ढूंढते हैं जो आपके सिस्टम संसाधनों को चबाते हैं ताकि उन्हें मारने में सक्षम हो सके?

निम्नलिखित स्क्रिप्ट मदद करने में सक्षम हो सकता है। यह एक वेब सर्वर के लिए लिखा गया था, इसलिए इसके कुछ हिस्सों में विशेष रूप से httpd प्रक्रियाओं और कुछ हिस्सों की तलाश है जो MySQL से निपटते हैं। अपने सर्वर परिनियोजन के आधार पर, बस उन अनुभागों को टिप्पणी / हटाएं और दूसरों को जोड़ें। यह एक शुरुआती बिंदु के लिए इस्तेमाल किया जाना चाहिए।

स्क्रिप्ट के इस संस्करण के लिए पूर्वापेक्षाएँ जीएनयू जनरल पब्लिक लाइसेंस के तहत जारी किए गए कुछ फ्रीवेयर हैं जिन्हें Mytop (https://jeremy.zawodny.com/mysql/mytop/ पर उपलब्ध) कहा जाता है, यह जांचने के लिए एक शानदार टूल है कि MySQL कैसे प्रदर्शन कर रहा है। यह पुराना हो रहा है, लेकिन यहां हमारे उद्देश्यों के लिए अभी भी बहुत अच्छा काम करता है। इसके अतिरिक्त, मैं म्यूट को मेलर के रूप में उपयोग करता हूं - आप स्क्रिप्ट को 'मेल` उपयोगिता में बनाए गए लिनक्स का उपयोग करने के लिए बदल सकते हैं। मैं इसे हर घंटे क्रॉन के माध्यम से चलाता हूं; फिट बैठते समय समायोजित करें। ओह - और इस स्क्रिप्ट को रूट के रूप में चलाने की आवश्यकता है क्योंकि यह सर्वर के कुछ संरक्षित क्षेत्रों से पढ़ता है।

तो चलो शुरू करें, क्या हम?

सबसे पहले, अपनी स्क्रिप्ट चर सेट करें:

#!/bin/bash # # Script to check system load average levels to try to determine # what processes are taking it overly high… # # 07Jul2010 tjones # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10

इसके बाद, स्क्रिप्ट जारी रखना चाहिए या नहीं, यह देखने के लिए अपने लोड स्तर की जांच करें:

# Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

और चेक के माध्यम से जारी रखें, परिणामों को अस्थायी फ़ाइल में लिखना। यहां से आइटम जोड़ें या हटाएं जहां आपकी स्थिति पर लागू होता है:

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

शीर्ष आदेश के साथ नोटिस, हम दो अस्थायी फ़ाइलों को लिख रहे हैं। एक सेल फोन के लिए बहुत छोटे संदेश के लिए है। यदि आप सुबह तीन बजे सेल फोन अलर्ट की तात्कालिकता नहीं चाहते हैं, तो आप इसे बाहर ले जा सकते हैं (और बाद में दूसरी मेलिंग दिनचर्या को स्क्रिप्ट में ले लें)।

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

अधिक चेक:

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

फिर अस्थायी फ़ाइल सामग्री को अधिक स्थायी लॉग फ़ाइल में लिखें और परिणाम उचित पार्टियों को ईमेल करें। दूसरी मेलिंग केवल नीचे के मानक से बाहर मानक शामिल हैं:

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

और फिर कुछ हाउसकीपिंग और बाहर निकलें:

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

उम्मीद है कि यह किसी को वहां मदद करता है। पूरी तरह से इकट्ठा लिपि है:

#!/bin/bash # # Script to check system load average levels to try to determine what processes are # taking it overly high… # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10 # Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

सिफारिश की: