Shell脚本查看linux系统性能瓶颈

作者:佚名 上传时间:2019-05-28 版权申诉

linux服务器敲命令反应慢,网站访问慢,到底什么情况?根据本人的经验,主要原因可能是系统资源到达瓶颈,已经无法处理更多请求。在有监控系统情况下,可以直接通过WEB页面可视化看出是CPU瓶颈?硬盘瓶颈?还是网络瓶颈?如果公司服务器较少或者云服务器,就有可能没有一套监控系统,这时就要登陆到服务器,一条一条的敲命令,查找分析性能瓶颈。命令这么多,咋记得住啊!就算记得住,输入也费劲,于是就有了这个脚本,为了以后自己使用,另外也想分享给博友,学shell朋友能从中得到一丢丢启发。写的比较仓促,内容有点粗略,还望君见谅!

脚本目的: 分析系统资源性能瓶颈

脚本功能:

1、查看CPU利用率与负载(top、vmstat、sar)

2、查看磁盘、Inode利用率与I/O负载(df、iostat、iotop、sar、dstat)

3、查看内存利用率(free、vmstat)

4、查看TCP连接状态(netstat、ss)

5、查看CPU与内存占用最高的10个进程(top、ps)

6、查看网络流量(ifconfig、iftop、iptraf)

脚本说明: 通过一些常用的性能分析工具,计算出我们想知道的信息。

脚本如下:

# cat show_sys_info.sh

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
#!/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/null ; then
echo "vmstat command not found, now the install."
sleep 1
os_check
$P_M install procps -y
echo "-----------------------------------------------------------------------"
fi
if ! which iostat &> /dev/null ; then
echo "iostat command not found, now the install."
sleep 1
os_check
$P_M install sysstat -y
echo "-----------------------------------------------------------------------"
fi
while true ; do
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 i 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 i 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 true ; do
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


注意:在原来基础上增加了退出选项,同时也更新了一些小bug,以下图片没有显示。

运行效果如下:

# sh show_sys_info.sh

Shell脚本查看linux系统性能瓶颈

Shell脚本查看linux系统性能瓶颈

Shell脚本查看linux系统性能瓶颈

Shell脚本查看linux系统性能瓶颈

Shell脚本查看linux系统性能瓶颈


Shell脚本查看linux系统性能瓶颈

Shell脚本查看linux系统性能瓶颈

Shell脚本查看linux系统性能瓶颈

Shell脚本查看linux系统性能瓶颈



本文转自 李振良OK 51CTO博客,原文链接:http://blog.51cto.com/lizhenliang/1687612,如需转载请自行联系原作者

免责申明:文章和图片全部来源于公开网络,如有侵权,请通知删除 server@dude6.com

用户评论
相关推荐
Shell脚本查看linux系统性能瓶颈
linux服务器敲命令反应慢,网站访问慢,到底什么情况?根据本人的经验,主要原因可能是系统资源到达瓶颈,已经无法处理更多请求。在有监控系统情况下,可以直接通过WEB页面可视化看出是C
Shell脚本查看linux系统性能瓶颈
linux服务器敲命令反应慢,网站访问慢,到底什么情况?根据本人的经验,主要原因可能是系统资源到达瓶颈,已经无法处理更多请求。在有监控系统情况下,可以直接通过WEB页面可视化看出是C
linux性能查看脚本
linux性能查看脚本:可远程查看linux服务器的性能
SH
0B
2020-05-04 07:17
Linux系统CPU性能测试Shell脚本
如果您想要测试Linux系统的CPU性能,可以使用一个简单的Shell脚本。这个脚本使用了一些常见的命令,包括cat、grep、wc和sysbench,可以帮助您测试CPU的各项指标,例如处理器的速度
pdf
122.28KB
2023-03-04 12:53
Linux Shell脚本查看NUMA信息
主要介绍了Linux Shell脚本查看NUMA信息,本文直接给出脚本实现代码,需要的朋友可以参考下
PDF
28KB
2020-09-21 15:13
如何编写Linux系统硬盘性能测试shell脚本
在Linux系统中,硬盘性能测试对于评估系统性能非常重要。编写一个shell脚本可以自动化硬盘性能测试,并且可以在不同的系统上运行。该脚本可以测试硬盘的写入性能、读取性能、块访问性能和Seek性能,帮
pdf
126.1KB
2023-03-04 12:41
如何使用Shell脚本测试Linux系统内存性能
想要测试Linux系统的内存性能,可以使用Shell脚本来完成。这里介绍一个使用dd命令和proc sys vm drop caches文件的脚本,它可以测试内存的读写速度和带宽。首先,需要创建一个S
pdf
237.38KB
2023-03-04 12:46
查看系统进程的shell脚本
查看系统进程的shell脚本 比较简单,但是包含程序的各种元素,可以作为初学者的例子。中的例子
SH
2KB
2020-09-12 02:33
shell脚本查看系统基础信息
#!/bin/bash #日期:2020-2-19 #描述:系统基础信息 mkdir /var/log/everyone &>/dev/null system_status=/var/l
PDF
37KB
2021-01-16 11:11
通过AIX日志文件查看系统性能瓶颈
通过查看AIX日志文件来识别系统性能瓶颈,提高系统响应速度和可用性。本示例代码展示了如何使用AIX日志文件和相关命令来诊断系统中的异常。#!/bin/ksh# Collect system lo
AIX 7.2
AIX系统命令行工具
2023-04-20 16:35