Diagnosticējiet Linux servera ielādes problēmas ar vienkāršu skriptu

Diagnosticējiet Linux servera ielādes problēmas ar vienkāršu skriptu
Diagnosticējiet Linux servera ielādes problēmas ar vienkāršu skriptu

Video: Diagnosticējiet Linux servera ielādes problēmas ar vienkāršu skriptu

Video: Diagnosticējiet Linux servera ielādes problēmas ar vienkāršu skriptu
Video: Gmail: Find messages using Gmail's search - YouTube 2024, Maijs
Anonim

Ja esat bijis administrators kādā laika periodā, jūs noteikti atklājat situācijas, kad serveris palielina CPU izmantojumu vai atmiņas izmantošanu un / vai slodzes līmeņus. Darbības "top" ne vienmēr dos jums atbildi, vai nu. Tātad, kā jūs atradīsiet tos sneaky procesus, kas izvārās jūsu sistēmas resursus, lai varētu tos nogalināt?

Šāds skripts varētu palīdzēt. Tas tika rakstīts tīmekļa serverim, tāpēc ir daži tā daļas, kas īpaši meklē httpd procesus un dažas daļas, kas nodarbojas ar MySQL. Atkarībā no servera izvietošanas vienkārši komentējiet / dzēsiet šīs sadaļas un pievienojiet citas. To vajadzētu izmantot sākuma punktam.

Šādas skripta versijas priekšnoteikumi ir daži bezmaksas rīki, kas tiek izplatīti saskaņā ar GNU Vispārējo publisko licenci, ko sauc par mytop (pieejams vietnē https://jeremy.zawodny.com/mysql/mytop/), kas ir fantastisks rīks, lai pārbaudītu, kā darbojas MySQL. Tas kļūst vecs, bet joprojām darbojas lieliski mūsu mērķiem šeit. Turklāt es izmantoju mutt kā mailer - iespējams, vēlēsities mainīt skriptu, lai vienkārši lietotu "mail" lietderībā izveidoto linux. Es to vadu caur cron katru stundu; pielāgojiet, kā redzat. Ak - un šim skriptam jārīkojas kā root, jo tas tiek lasīts no dažām aizsargātām servera vietām.

Tātad sāksim, vai mēs?

Vispirms iestatiet skripta mainīgos:

#!/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

Pēc tam pārbaudiet slodzes līmeni, lai noskaidrotu, vai skripts jāturpina:

# 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

Un turpini pārbaudes, rakstot rezultātus pagaidu failā. Šeit pievienojiet vai izdzēsiet vienumus, ja tie attiecas uz jūsu situāciju:

# 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

Paziņojums ar augšējo komandu, mēs rakstām uz diviem temp failiem. Viens ir par daudz mazāku ziņojumu mobilajam tālrunim. Ja jūs nevēlaties, lai brīdinājumi par mobilo telefonu būtu steidzami, trīs reizes no rīta, to var izdarīt (un vēlāk skriptā izņemiet otro pasta sūtīšanas rutīnu).

# 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

Vairāk pārbaudes:

# 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

Pēc tam rakstiet pagaidu faila saturu uz pastāvīgāku žurnālu failu un nosūtiet rezultātus attiecīgajām pusēm. Otrais pasta sūtījums ir noņemtie rezultāti, kas sastāv tikai no standarta no "top":

# 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

Un tad daži mājturības un izejas:

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

# exit 0

Cerams, ka tas palīdz kādam tur. Pilnībā samontēts skripts ir:

#!/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

Ieteicams: