监视Linux服务器的性能

重要性能监测工具:top、vmstat、w、uptime、ps、free、iostat、netstat、/proc等

需要监视Linux服务器的性能?大多数Linux发行版都集成了一些监视工具。这些工具可以获取有关系统活动的信息的详细指标。通过这些工具,你可以发现产生系统性能问题可能存在原因。下面讨论的是一些最基本的命令,它涉及到系统分析和调试服务器等一些问题,如:
1.    找出系统瓶颈问题.
2.    磁盘 (储存) 瓶颈问题.
3.    CPU和内存瓶颈问题.
4.    网络瓶颈问题.
# 1: top – 查看活动进程的命令########################################

TOP工具能够实时显示系统中各个进程的资源占用状况。默认情况下,它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU/内存的使用情况和执行时间对任务进行排序,并每五秒钟更新一次。

wKiom1ZmSIGDxVuKAAAzdkYSpFw715.png

常用的快捷键

Top命令为我们提供了很多有用的快捷键,如:

快捷键    用法

t           切换显示进程和CPU状态信息。

m           切换显示进程和CPU状态信息。

A           分类显示各种系统资源的消耗情况。可用于快速识别系统的性能要求极高的任务。

o           改变显示项目的顺序。

r     重新设置进程的优先级别。(系统提示用户输入需要改变的进程PID以及需要设置的优先级值。)

k            终止一个进程。(系统将提示用户输入需要终止的进程PID)

s            改变刷新的时间间隔。

u            查看指定用户的进程。


# 2: vmstat – 系统活动、硬件以及系统信息
这个命令用来报告关于内核线程、虚拟内存、磁盘、陷阱和CPU活动的统计信息。

1
2
3
4
5
6
7
8
9
10
11
# vmstat 3                                                           
输出样例:
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------           
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st            
0  0      0 2540988 522188 5130400    0    0     2    32    4    2  4  1 96  0  0          
1  0      0 2540988 522188 5130400    0    0     0   720 1199  665  1  0 99  0  0          
0  0      0 2540956 522188 5130400    0    0     0     0 1151 1569  4  1 95  0  0          
0  0      0 2540956 522188 5130500    0    0     0     6 1117  439  1  0 99  0  0          
0  0      0 2540940 522188 5130512    0    0     0   536 1189  932  1  0 98  0  0          
0  0      0 2538444 522188 5130588    0    0     0     0 1187 1417  4  1 96  0  0          
0  0      0 2490060 522188 5130640    0    0     0    18 1253 1123  5  1 94  0  0

显示内存使用情况:
# vmstat –m 

# 3: w – 找到已登陆的用户并且查看他们做了什么操作
W命令用来显示机器上最近登陆的用户信息以及他们的进程信息。

wKioL1ZmSbiAgiptAAARXC22ARE016.png

# 4: uptime – 系统已运行的时间
Uptime命令可以查看系统已经运行了多长时间。截止当前时间日期,系统已经运行了多长时间,当前登录的用户有哪些,已经在过去的1,5,15分钟,系统的平均负载值情况。

1
2
# uptime                                                             
18:02:41 up 41 days, 23:42,  1 user,  load average: 0.00, 0.00, 0.00

通常被认为是最佳的负载值。系统负载值根据系统的不同而不同。对於单CPU的系统,负载值在1-3为正常,SMP的系统,负载值在6-10之间也是可以接受的。

# 5: ps – 显示进程
ps命令用来报告当前进程的快照。要选择所有进程,使用-ef选项:

wKioL1ZmSm6T-YYaAAAtIpxeHpk719.png

只显示lighttpd的进程树:
# pgrep lighttpd                                                  
Or
# pgrep -u vivek php-cgi                                          
显示pid为55977的进程名:

# ps -p 55977 -o comm=   
                                         
找出最耗费内存的前10个进程:

# ps -auxf | sort -nr -k 4 | head -10                             
找出最耗费CPU的前10个进程:

# ps -auxf | sort -nr -k 3 | head -10

# 6: free – 查看内存的使用情况
free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区.

wKioL1ZmSxyw8XcvAAAKlZK6QaI294.png

free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free)。
第二行和第三行是比较让人迷惑的。这两行都是说明内存使用情况的。第一列是总量(total),第二列是使用量(used),第三列是可用量(free)。第一行的输出时从操作系统(OS)来看的。

# 7: iostat – 监视CPU平均负载值,I/O状态
该命令用于报告CPU和输入/输出设备,分区和网络文件系统(NFS)的详细统计数据。

wKiom1ZmS2Xyc14KAAASBH4v89A694.png

基本使用如下:

wKiom1ZmS7XjBcaUAAAetLrPGig481.png

参数 -d 表示,显示设备(磁盘)使用状态;-k某些使用block为单位的列强制使用Kilobytes为单位;1 10表示,数据显示每隔1秒刷新一次,共显示10次。

# 8: mpstat – 实时系统监视工具

mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。

下面只介绍mpstat与CPU相关的参数,mpstat的语法如下:

Usage: mpstat [ options... ] [ <interval> [ <count> ] ]           

Options are:                                                  

[ -P { <cpu> | ALL } ] [ -V ]                                     

显示每个进程对CPU的平均利用率:

# mpstat -P ALL

wKiom1ZmTFjguzluAAAawSA15bk972.png

#9: pmap – 查看进程使用内存的情况

pmap命令用来报告进程使用对于的相应内存的情况。使用下面命令可以查出某些内存瓶颈问题的原因。

# pmap -d PID                           

显示进程号为47394的进程所用内存的信息,最后一行非常重要。

# pmap -d 47394  

wKioL1ZmTbGxyNimAABUv5MOo2Y482.png#11 & #12 : netstat 和 ss – 查看网络情况

netstat命令显示网络连接,路由表,网络接口统计,伪装连接,组播成员身份。ss命令类似netstat命令的信息。            

#13: iptraf – 实时网络状况监视工具

iptraf是一款彩色的交互式的IP局域网监控工具。这是一个基于ncurses的IP LAN监视工具,它会统计网络中产生的各种数据,包括TCP信息,UDP连接数,ICMP和OSPF信息,以太网负载信息,节点统计,IP校验和错误,以及其他信息。并且提供:

Network traffic statistics by TCP connection

IP traffic statistics by network interface

Network traffic statistics by protocol

Network traffic statistics by TCP/UDP port and by packet size

Network traffic statistics by Layer2 address

#14: tcpdump – 网络状况分析工具

tcpdump用来抓包的一个的简单命令。但是,要使用该工具,你需熟悉TCP /IP协议。例如:显示网络中有关DNS的信息,请输入:

# tcpdump -i eth1 'udp port 53'     

                                   

显示去往202.54.1.5的所有ftp会话信息:

# tcpdump -i eth1 'dst 202.54.1.5 and (port 21 or 20'   


显示去往192.168.1.5的所有HTTP会话信息:

# tcpdump -ni eth0 'dst 192.168.1.5 and tcp and port http'                


使用Wireshark查看tcpdump抓包文件的详细信息,输入:

# tcpdump -n -i eth1 -s 0 -w output.txt src or dst port 80  

#15: strace – 系统调用工具

strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统呼叫及它所接收的系统信息。strace是一个有用的小工具,它可以通过跟踪系统调用来让你知道一个程序在后台所做的事情。Strace是一个基础的调试工具,在大多数 Linux系 统上默认已经安装;但是即便你不是在跟踪一个问题的时候它也是一个极好的软件。它能告诉你很多关于一个Linux程序怎样工作的信息。

#16: /Proc 文件系统
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。几个例子:

# cat /proc/cpuinfo                                                

# cat /proc/meminfo                                                

# cat /proc/zoneinfo                   

# cat /proc/mounts  

#17: Nagios – 服务器和网络信息监视工具
Nagios是一款很流行的开源系统和网络监控应用软件。你可以很轻松地用它监控所有的主机,网络设备和服务。在系统或服务状态异常时会第一时间通知网站运维人员(发出邮件或短信报警),在状态恢复正常后发出邮件或短信通知。
#18: Cacti -基于WEB的监视工具
Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数。它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善。界面友好。CACTI软件Cacti 的发展是基于让 RRDTool 使用者更方便使用该软件,除了基本的 Snmp 流量跟系统资讯监控外,Cacti 也可外挂 Scripts 及加上 Templates 来作出各式各样的监控图。
#19: KDE System Guard – 图形化的系统监视工具
KDE System Guard (KSysguard)是KDE的任务管理和性能监控工具。它采用client/server架构,可以监控本机也可以监控远端主机。
一篇51CTOblog博文,对KDE System Guard的介绍很详细:http://linuxshow.blog.51cto.com/1572053/371657 

#sar - 收集和报告系统状态信息

使用 sar -d 可以得到当天磁盘活动的情况汇总

sar -n  DEV 则能给出网络接口的统计信息

sar -A 可以报告所有的信息

sar 适用于快速粗略了解历史信息。

sar 命令行的常用格式: sar [options] [-o file] t [n]

options 为命令行选项,sar命令的选项很多,下面只列出常用选项: 

-A:所有报告的总和。        

-u:CPU利用率        

-v:进程、I节点、文件和锁表状态。        

-d:硬盘使用报告。        

-r:没有使用的内存页面和硬盘块。        

-g:串口I/O的情况。 

-b:缓冲区使用情况。 

-a:文件读写情况。 

-c:系统调用情况。 

-R:进程的活动情况。 

-y:终端设备活动情况。 

-w:系统交换活动。 

可以参考http://linuxtools-rst.readthedocs.org/zh_CN/latest/tool/sar.html 


其他工具:

nmap – 扫描主机的端口开放情况.

lsof - 列出系统当前打开的文件,网络连接以及更多信息。

ntop web based tool – Ntop是一款监控网络流量工具,它显示的网络状况更加直观、详细。Ntop甚至可以列出每个节点计算机的网络带宽利用率。它是一个灵活的、功能齐全的,用来监控和解决局域网问题的工具;可以自动从网络中识别有用的信息;将截获的数据包转换成易于识别的格式;对网络环境中通信失败的情况进行分析;探测网络通信的时间和过程等。

Conky - Conky是x-window下,一款免费的,轻量级系统监控的工具。它能够监控许多系统环境的状态,其中包括的CPU,内存,交换空间,磁盘存储,温度,进程,网络接口,电池电量,系统消息,电子邮件收件箱等。

GKrellM – 它来用于监测CPU状态,内存,硬盘,网络接口,本地和远程邮箱,以及其他的东西等。

vnstat – vnstat是一个基于控制台的网络流量监控软件,它会保持每月,每天,每小时,监视并记录所选定网络接口的网络通信状况。

htop – htop是一个增强版本的top,同时也是一个交互式进程查看器,它可以以树状结构来显示进程列表。

mtr – mtr在单一的网络诊断工具上,结合了traceroute和ping程序的功能。






性能监控脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@testredis scripts]# cat performance.sh 
#!/bin/bash
 
#监控cpu系统负载
IP=`ifconfig eth0 | grep "inet addr" cut -f 2 -d ":" cut -f 1 -d " "
cpu_num=`grep -c 'model name' /proc/cpuinfo`
count_uptime=`uptime |wc -w`
load_15=`uptime | awk '{print $'$count_uptime'}'`
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" bc`  
average_int=`echo $average_load | cut -f 1 -d "."`  
load_warn=0.70  
if [ $average_int -gt 0 ]
then
echo "$IP服务器单个核心15分钟的平均负载为$average_load,超过警戒值1.0,请立即处理!!!$(date +%Y%m%d/%H:%M:%S)" >>/usr/monitor/performance/performance_$(date +%Y%m%d).log
echo "$IP服务器单个核心15分钟的平均负载为$average_load,超过警戒值1.0,请立即处理!!!$(date +%Y%m%d/%H:%M:%S)" | mail -s "$IP服务器系统负载严重告警" [email protected] 
else
echo "$IP服务器单个核心15分钟的平均负载值为$average_load,负载正常   $(date +%Y%m%d/%H:%M:%S)">>/usr/monitor/performance/performance_$(date +%Y%m%d).log
fi
 
#监控cpu使用率
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' cut -f 1 -d "."`  
if [ $cpu_idle -lt 20 ]
then
 
echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。">>/usr/monitor/performance/performance_$(date +%Y%m%d).log
 
echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理!!!" | mail -s "$IP服务器cpu告警" [email protected] 
else
 
echo
"$IP服务器cpu剩余$cpu_idle%,使用率正常">>/usr/monitor/performance/performance_$(date +%Y%m%d).log
fi

进程监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@testredis scripts]# cat process.sh 
#!/bin/bash
IP=`ifconfig eth0 | grep "inet addr" cut -f 2 -d ":" cut -f 1 -d " "`
 
tomcat_dir="/opt/apache-tomcat-7.0.8"
mysql_dir="/usr/local/mysql/bin/mysqld_safe"
vsftp_dir="/usr/sbin/vsftpd"
ssh_dir="/usr/sbin/sshd"
 
for dir in $tomcat_dir $mysql_dir $vsftp_dir  $ssh_dir 
do
process_count=$(ps -ef | grep "$dir" grep -v grep wc -l)
 
        for service in tomcat mysql vsftp ssh 
        do
                echo "$dir" |grep -q "$service"
                if [ $? -eq 0 ]
                then
                        if [ $process_count -eq 0 ]
                        then
                            echo "$service is down at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log
                            echo "$service is down at $(date +%Y%m%d%H:%M:%S)" | mail -s "$IP服务器 $service服务关闭告警" [email protected] 
                        else
                            echo "$service is running at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log
                        fi
                else
                        continue
                fi
        done
done

流量监控

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
#
R1=`cat /sys/class/net/eth0/statistics/rx_bytes`
T1=`cat /sys/class/net/eth0/statistics/tx_bytes`
sleep 1
R2=`cat /sys/class/net/eth0/statistics/rx_bytes`
T2=`cat /sys/class/net/eth0/statistics/tx_bytes`
TBPS=`expr $T2 - $T1`
RBPS=`expr $R2 - $R1`
TKBPS=`expr $TBPS / 1024`
RKBPS=`expr $RBPS / 1024`
echo "上传速率 eth0: $TKBPS kb/s 下载速率 eth0: $RKBPS kb/s at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/network/network_$(date +%Y%m%d).log

流量分析统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@testredis scripts]# cat tongji.sh 
#!/bin/bash
TX=0;
RX=0;
MAX_TX=0;
MAX_RX=0;
while read line
do
        a=`echo $line | grep "eth0" |awk '{print $3}'`
if [ $a -ge 0 ]
then
        TX=$a
        if [ $TX -ge $MAX_TX ]
        then
                MAX_TX=$TX
        fi
fi
        b=`echo $line | grep "eth0" |awk '{print $7}'`
if [ $b -ge 0 ]
then
        RX=$b
        if [ $RX -ge $MAX_RX ]
        then
                MAX_RX=$RX
        fi
fi
done /usr/monitor/network/network_$(date +%Y%m%d).log 
echo "最高上传速度为 $MAX_TX kb/s at $(date +%Y%m%d)">>/usr/monitor/network/tongji.log
echo "最高下载速度为 $MAX_RX kb/s at $(date +%Y%m%d)">>/usr/monitor/network/tongji.log

内存硬盘登录用户数监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
[root@Test scripts]# cat sys-warning.sh 
#!/bin/bash
#监控系统负载与CPU、内存、硬盘、登录用户数,超出警戒值则发邮件告警。
 
#提取本服务器的IP地址信息
IP=`ifconfig eth0 | grep "inter addr" cut -f 2 -d ":" cut -f 1 -d " "`
 
 
 
# 1、监控系统负载的变化情况,超出时发邮件告警:
 
#抓取cpu的总核数
cpu_num=`cat /proc/cpuinfo grep -c "model name"`
 
#抓取当前系统15分钟的平均负载值
load_15=`uptime | awk '{print $12}'`
 
#计算当前系统单个核心15分钟的平均负载值,结果小于1.0时前面个位数补0。
average_load=`echo "scale=2;a=$load_15/$cpu_num;if(length(a)==scale(a)) print 0;print a" bc`
 
#取上面平均负载值的个位整数
average_int=`echo $average_load | cut -f 1 -d "."`
 
#设置系统单个核心15分钟的平均负载的告警值为0.70(即使用超过70%的时候告警)。
load_warn=0.70
 
#当单个核心15分钟的平均负载值大于等于1.0(即个位整数大于0) ,直接发邮件告警;如果小于1.0则进行二次比较
if [ $average_int > 0 ]; then
echo "$IP服务器单个核心15分钟的系统平均负载为$average_load,超过警戒值1.0,请立即处理." | mutt -s "$IP 服务器系统负载严重告警." [email protected]
else
 
#当前系统15分钟平均负载值与告警值进行比较(当大于告警值0.70时会返回1,小于时会返回0)
load_now=`expr $average_load \> $load_warn`
 
#如果系统单个核心15分钟的平均负载值大于告警值0.70(返回值为1),则发邮件给管理员
if [ $load_now == 1 ]; then
echo "$IP服务器单个核心15分钟的系统平均负载为$average_load,超过警戒值0.70,请及时处理." | mutt -s "$IP 服务器系统负载告警" [email protected]
fi
fi
 
 
 
 
# 2、监控系统cpu的情况,当使用超过80%的时候发告警邮件:
 
#取当前空闲cpu百份比值(只取整数部分)
cpu_idle=`top -b -n 1 | grep Cpu | awk '{print $5}' cut -f 1 -d "."`
 
#设置空闲cpu的告警值为20%,如果当前cpu使用超过80%(即剩余小于20%),立即发邮件告警
if (($cpu_idle < 20)); then
echo "$IP服务器cpu剩余$cpu_idle%,使用率已经超过80%,请及时处理。" | mutt -s "$IP服务器CPU告警" [email protected]
fi
 
 
 
 
 
# 3、监控系统交换分区swap的情况,当使用超过80%的时候发告警邮件:
 
#系统分配的交换分区总量
swap_total=`free -m | grep Swap | awk '{print $2}'`
 
#当前剩余的交换分区free大小
swap_free=`free -m | grep Swap | awk '{print $4}'`
 
#当前已使用的交换分区used大小
swap_used=`free -m | grep Swap | awk '{print $3}'`
 
if (($swap_used != 0)); then
#如果交换分区已被使用,则计算当前剩余交换分区free所占总量的百分比,用小数来表示,要在小数点前面补一个整数位0
swap_per=0`echo "scale=2;$swap_free/$swap_total" bc`
 
#设置交换分区的告警值为20%(即使用超过80%的时候告警)。
swap_warn=0.20
 
#当前剩余交换分区百分比与告警值进行比较(当大于告警值(即剩余20%以上)时会返回1,小于(即剩余不足20%)时会返回0 )
swap_now=`expr $swap_per \> $swap_warn`
 
#如果当前交换分区使用超过80%(即剩余小于20%,上面的返回值等于0),立即发邮件告警
if (($swap_now == 0)); then
echo "$IP服务器swap交换分区只剩下 $swap_free M 未使用,剩余不足20%,使用率已经超过80%,请及时处理。" | mutt -s "$IP 服务器内存告警" [email protected]
fi
fi
 
 
 
 
# 4、监控系统硬盘根分区使用的情况,当使用超过80%的时候发告警邮件:
 
#取当前根分区(/dev/sda3)已用的百份比值(只取整数部分)
disk_sda3=`df -h | grep /dev/sda3 awk '{print $5}' cut -f 1 -d "%"`
 
#设置空闲硬盘容量的告警值为80%,如果当前硬盘使用超过80%,立即发邮件告警
if (($disk_sda3 > 80)); then
echo "$IP 服务器 /根分区 使用率已经超过80%,请及时处理." | mutt -s "$IP 服务器硬盘告警" [email protected]
fi
 
 
 
 
 
#5、监控系统用户登录的情况,当用户数超过3个的时候发告警邮件:
 
#取当前用户登录数(只取数值部分)
users=`uptime | awk '{print $6}'`
 
#设置登录用户数的告警值为3个,如果当前用户数超过3个,立即发邮件告警
if (($users >= 3)); then
echo "$IP 服务器用户数已经达到$users个,请及时处理。" | mutt -s "$IP 服务器用户数告警" [email protected]
fi



系统初始化脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
[root@Test scripts]# cat check_linux.sh 
#!/bin/bash
 
os_check() {
        if [ -e /etc/redhat-release ]; then
                REDHAT=`cat /etc/redhat-release |cut -d' '  -f1`
        else
                DEBIAN=`cat /etc/issue |cut -d' ' -f1`
        fi
 
        if "$REDHAT" == "CentOS" -o "$REDHAT" == "Red" ]; then
                P_M=yum
        elif "$DEBIAN" == "Ubuntu" -o "$DEBIAN" == "ubutnu" ]; then
                P_M=apt-get
        else
                Operating system does not support.
                exit 1
        fi
}
 
if [ $LOGNAME != root ]; then
    echo "Please use the root account operation."
    exit 1
fi
 
if which vmstat &>/dev/nullthen
        echo "vmstat command not found, now the install."
        sleep 1
        os_check
        $P_M install procps -y
        echo "-----------------------------------------------------------------------"
fi
 
if which iostat &>/dev/nullthen
        echo "iostat command not found, now the install."
        sleep 1
        os_check
        $P_M install sysstat -y
        echo "-----------------------------------------------------------------------"
fi
 
  
 
while truedo
    select input in cpu_load disk_load disk_use disk_inode mem_use tcp_status cpu_top10 mem_top10 traffic quit; do
        case $input in
            cpu_load)
                #CPU利用率与负载
                echo "---------------------------------------"
                i=1
                while [[ $i -le 3 ]]; do
                    echo -e "\033[32m  参考值${i}\033[0m"
                    UTIL=`vmstat |awk '{if(NR==3)print 100-$15"%"}'`
                    USER=`vmstat |awk '{if(NR==3)print $13"%"}'`
                    SYS=`vmstat |awk '{if(NR==3)print $14"%"}'`
                    IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`
                    echo "Util: $UTIL"
                    echo "User use: $USER"
                    echo "System use: $SYS"
                    echo "I/O wait: $IOWAIT"
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;
 
            disk_load)
                #硬盘I/O负载
                echo "---------------------------------------"
                i=1
                while [[ $i -le 3 ]]; do
                    echo -e "\033[32m  参考值${i}\033[0m"
                    UTIL=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$NF"%"}'`
                    READ=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$6"KB"}'`
                    WRITE=`iostat -x -k |awk '/^[v|s]/{OFS=": ";print $1,$7"KB"}'`
                    IOWAIT=`vmstat |awk '{if(NR==3)print $16"%"}'`
                    echo -e "Util:"
                    echo -e "${UTIL}"
                    echo -e "I/O Wait: $IOWAIT"
                    echo -e "Read/s:\n$READ"
                    echo -e "Write/s:\n$WRITE"
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;
 
            disk_use)
                #硬盘利用率
                DISK_LOG=/tmp/disk_use.tmp
                DISK_TOTAL=`fdisk -l |awk '/^Disk.*bytes/&&/\/dev/{printf $2" ";printf "%d",$3;print "GB"}'`
                USE_RATE=`df -h |awk '/^\/dev/{print int($5)}'`
                for in $USE_RATE; do
                    if [ $i -gt 90 ];then
                        PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`
                        echo "$PART = ${i}%" >> $DISK_LOG
                    fi
                done
                echo "---------------------------------------"
                echo -e "Disk total:\n${DISK_TOTAL}"
                if [ -f $DISK_LOG ]; then
                    echo "---------------------------------------"
                    cat $DISK_LOG
                    echo "---------------------------------------"
                    rm -f $DISK_LOG
                else
                    echo "---------------------------------------"
                    echo "Disk use rate no than 90% of the partition."
                    echo "---------------------------------------"
                fi
                break
                ;;
 
            disk_inode)
                #硬盘inode利用率
                INODE_LOG=/tmp/inode_use.tmp
                INODE_USE=`df -i |awk '/^\/dev/{print int($5)}'`
                for in $INODE_USE; do
                    if [ $i -gt 90 ]; then
                        PART=`df -h |awk '{if(int($5)=='''$i''') print $6}'`
                        echo "$PART = ${i}%" >> $INODE_LOG
                    fi
                done
                if [ -f $INODE_LOG ]; then
                    echo "---------------------------------------"
                    rm -f $INODE_LOG
                else
                    echo "---------------------------------------"
                    echo "Inode use rate no than 90% of the partition."
                    echo "---------------------------------------"
                fi
                break
                ;;
 
            mem_use)
                #内存利用率
                echo "---------------------------------------"
                MEM_TOTAL=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}END{print "G"}'`
                USE=`free -m |awk '{if(NR==3) printf "%.1f",$3/1024}END{print "G"}'`
                FREE=`free -m |awk '{if(NR==3) printf "%.1f",$4/1024}END{print "G"}'`
                CACHE=`free -m |awk '{if(NR==2) printf "%.1f",($6+$7)/1024}END{print "G"}'`
                echo -e "Total: $MEM_TOTAL"
                echo -e "Use: $USE"
                echo -e "Free: $FREE"
                echo -e "Cache: $CACHE"
                echo "---------------------------------------"
                break
                ;;
 
            tcp_status)
                #网络连接状态
                echo "---------------------------------------"
                COUNT=`netstat -antp |awk '{status[$6]++}END{for(i in status) print i,status[i]}'`
                echo -e "TCP connection status:\n$COUNT"
                echo "---------------------------------------"
                ;;
 
            cpu_top10)
                #占用CPU高的前10个进程
                echo "---------------------------------------"
                CPU_LOG=/tmp/cpu_top.tmp
                i=1
                while [[ $i -le 3 ]]; do
                    #ps aux |awk '{if($3>0.1)print "CPU: "$3"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $CPU_LOG
                    ps aux |awk '{if($3>0.1){{printf "PID: "$2" CPU: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' |sort -k4 -nr |head -10 > $CPU_LOG
                    #循环从11列(进程名)开始打印,如果i等于最后一行,就打印i的列并换行,否则就打印i的列
                    if [[ -n `cat $CPU_LOG` ]]; then
                       echo -e "\033[32m  参考值${i}\033[0m"
                       cat $CPU_LOG
                       > $CPU_LOG
                    else
                        echo "No process using the CPU." 
                        break
                    fi
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;
 
            mem_top10)
                #占用内存高的前10个进程
                echo "---------------------------------------"
                MEM_LOG=/tmp/mem_top.tmp
                i=1
                while [[ $i -le 3 ]]; do
                    #ps aux |awk '{if($4>0.1)print "Memory: "$4"% -->",$11,$12,$13,$14,$15,$16,"(PID:"$2")" |"sort -k2 -nr |head -n 10"}' > $MEM_LOG
                    ps aux |awk '{if($4>0.1){{printf "PID: "$2" Memory: "$3"% --> "}for(i=11;i<=NF;i++)if(i==NF)printf $i"\n";else printf $i}}' |sort -k4 -nr |head -10 > $MEM_LOG
                    if [[ -n `cat $MEM_LOG` ]]; then
                        echo -e "\033[32m  参考值${i}\033[0m"
                        cat $MEM_LOG
                        > $MEM_LOG
                    else
                        echo "No process using the Memory."
                        break
                    fi
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;
 
            traffic)
                #查看网络流量
                while truedo
                    read -p "Please enter the network card name(eth[0-9] or em[0-9]): " eth
                    #if [[ $eth =~ ^eth[0-9]$ ]] || [[ $eth =~ ^em[0-9]$ ]] && [[ `ifconfig |grep -c "\<$eth\>"` -eq 1 ]]; then
                    if [ `ifconfig |grep -c "\<$eth\>"` -eq 1 ]; then
                        break
                    else
                        echo "Input format error or Don't have the card name, please input again."
                    fi
                done
                echo "---------------------------------------"
                echo -e " In ------ Out"
                i=1
                while [[ $i -le 3 ]]; do
                    #OLD_IN=`ifconfig $eth |awk '/RX bytes/{print $2}' |cut -d: -f2`
                    #OLD_OUT=`ifconfig $eth |awk '/RX bytes/{print $6}' |cut -d: -f2`
                    OLD_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`
                    #CentOS6和CentOS7 ifconfig输出进出流量信息位置不同,CentOS6中RX与TX行号等于8,CentOS7中RX行号是5,TX行号是5,所以就做了个判断.       
 
                    OLD_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`
                    sleep 1
                    NEW_IN=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $4;else if(NR==5)print $6}'`
                    NEW_OUT=`ifconfig $eth |awk -F'[: ]+' '/bytes/{if(NR==8)print $9;else if(NR==7)print $6}'`
                    IN=`awk 'BEGIN{printf "%.1f\n",'$((${NEW_IN}-${OLD_IN}))'/1024/128}'`
                    OUT=`awk 'BEGIN{printf "%.1f\n",'$((${NEW_OUT}-${OLD_OUT}))'/1024/128}'`
                    echo "${IN}MB/s ${OUT}MB/s"
                    i=$(($i+1))
                    sleep 1
                done
                echo "---------------------------------------"
                break
                ;;
                        quit)
                                exit 0
                                ;;
               *)
                    echo "---------------------------------------"
                    echo "Please enter the number." 
                    echo "---------------------------------------"
                    break
                    ;;
        esac
    done
done
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章