用一个简单的脚本诊断linux服务器负载问题

如果您已经做过任何一段时间的管理员,您肯定会发现服务器在CPU使用率或内存利用率和/或负载水平上出现峰值的情况。跑'top'也不会总是给你答案。那么,如何找到那些正在吞噬系统资源以杀死它们的秘密进程呢?...

如果您已经做过任何一段时间的管理员,您肯定会发现服务器在CPU使用率或内存利用率和/或负载水平上出现峰值的情况。跑'top'也不会总是给你答案。那么,如何找到那些正在吞噬系统资源以杀死它们的秘密进程呢?

下面的脚本可能会有所帮助。它是为一个web服务器编写的,因此它的一些部分专门寻找httpd进程,还有一些部分处理MySQL。根据您的服务器部署,只需注释/删除这些部分并添加其他部分。它应该作为一个起点。

此版本脚本的先决条件是在GNU通用公共许可证mytop下发布的一些免费软件(可在http://jeremy.zawodny.com/mysql/mytop/)这是一个检查MySQL执行情况的极好工具。它正在变老,但对我们的目的来说仍然很有用这里。另外,我使用mutt作为mailer–您可能需要将脚本更改为只使用linux内置的“mail”实用程序。我每小时通过cron运行一次;根据需要进行调整。哦–这个脚本需要以root身份运行,因为它确实从服务器的某些受保护区域读取数据。

我们开始吧,好吗?

首先,设置脚本变量:

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

注意,使用top命令,我们正在写入两个临时文件。一种是把小得多的信息传送到**上。如果你不想在凌晨三点收到紧急的**警报,你可以去掉这个(在脚本后面的第二个邮件例程中去掉)。

# 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 connecti***: 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

然后将临时文件内容写入一个更永久的日志文件,并将结果通过电子邮件发送给相关方。第二封邮件是精简后的结果,仅由“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 >$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 connecti***: 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 >$logfile

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

# exit 0

  • 发表于 2021-04-13 10:01
  • 阅读 ( 79 )
  • 分类:互联网

你可能感兴趣的文章

什么是shell脚本,为什么要使用它

shell是Linux或Unix操作系统中的一个程序,它允许您输入命令供系统执行。当在linux计算机上打开终端窗口时,它启动shell程序,该程序提供一个输入命令的界面。此接口称为命令行接口。输入命令后,shell将执行该命令,并在屏幕...

  • 发布于 2021-03-13 04:53
  • 阅读 ( 249 )

linux终端的5个联网命令

... 如果要释放IP地址并从DHCP服务器获得新的IP地址,可以使用dhclient: ...

  • 发布于 2021-03-13 15:30
  • 阅读 ( 223 )

这就是软件安装程序在windows、macos和linux上的工作方式

...要一些额外的调整。 安装程序包——找到一个安装程序文件并(双击)开始安装。 软件经理/商店——从一个漂亮的界面上选择应用程序,然后点击一个大的“安装”按钮。太神奇了! ...

  • 发布于 2021-03-14 18:20
  • 阅读 ( 268 )

使用linux进行编程的7个绝佳理由

...使用Linux是一种很有市场的技能。无论你是在管理公司的服务器,还是在帮助构建客户越来越依赖的云服务,雇主都希望有人知道如何使用Linux。 ...

  • 发布于 2021-03-14 19:41
  • 阅读 ( 225 )

口袋里的电脑维修工具包:U盘上的引导cd

在技师可以使用的所有工具中,有一个是最重要的。在我的技师工具箱里,我保存着一个USB闪存驱动器,里面装载着这个星球上最神奇的工具:我的电脑维修工具箱。 ...

  • 发布于 2021-03-16 01:24
  • 阅读 ( 234 )

如何在一个小时内安装一台linux媒体服务器

为您的电视和电影收藏设计终极媒体服务器可能是一项挑战。你应该使用什么硬件,你应该安装什么操作系统,你应该运行什么样的软件? ...

  • 发布于 2021-03-21 20:50
  • 阅读 ( 323 )

如何通过五个简单步骤创建批处理(bat)文件

... ping:ping一个IP地址,通过服务器路由发送数据包来测量它们的位置和延迟(响应时间)。 ...

  • 发布于 2021-03-23 08:09
  • 阅读 ( 250 )

如何在linux上使用at和batch来调度命令

如果您想安排一个只发生一次的Linux作业,cron就太过了。at系列的命令是你所需要的!如果只想在系统有空闲资源时运行进程,可以使用批处理。 如何安排linux作业 cron守护进程维护它在特定时间运行的作业列表。这些任务和程...

  • 发布于 2021-04-02 18:33
  • 阅读 ( 187 )

linux上的stdin、stdout和stderr是什么?

...,该数据是文本。 数据流和水流一样,有两端。它们有一个来源和一个流出。无论您使用哪个Linux命令,都会提供每个流的一端。另一端由启动命令的shell决定。根据启动命令的命令行,该端将连接到终端窗口、连接到管道或重...

  • 发布于 2021-04-03 06:21
  • 阅读 ( 241 )

如何在linux上使用yes命令

...码由kenthompson编写,总共只有六行代码。 但不要因为它是一个简单的小命令就把它一笔勾销。它可以用在一些有趣和有用的方式。 是做什么的? 在没有任何命令行参数的情况下使用yes命令,其行为就像您键入“y”并反复(反复...

  • 发布于 2021-04-03 13:30
  • 阅读 ( 168 )
香菜-不香
香菜-不香

0 篇文章

相关推荐