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

简介:

  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  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  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

wKiom1XaurSDzLBXAAMdO4UDpdI025.jpg

wKioL1XavNDz2ColAAKfiL9gQcY036.jpg

wKiom1XausWyO2gVAAFAY7EdoqI526.jpg

wKioL1XavOLSOWyMAAC8Xbwvrnc180.jpg

wKiom1XautjQWnVRAAD4ZKO60co516.jpg


wKiom1XauuGijj0hAAFHNT4ntPY686.jpg

wKioL1XavP_w4aoRAAKkhcqRrjA796.jpg

wKiom1XauvSTS6AXAAYZcjwUE-I338.jpg

wKioL1XavRPRRn_lAAEmDF96Tqk993.jpg


目录
相关文章
|
12天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
49 3
|
12天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
37 2
|
22天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
42 5
linux系统服务二!
|
22天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
41 3
linux系统服务!!!
|
6天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
14 3
|
30天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
249 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
1月前
|
运维 监控 Linux
Linux系统之部署Linux管理面板1Panel
【10月更文挑战第20天】Linux系统之部署Linux管理面板1Panel
91 3
Linux系统之部署Linux管理面板1Panel
|
12天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
44 3
|
15天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
34 6
|
15天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
49 6
下一篇
无影云桌面