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


目录
相关文章
|
1月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
129 3
Linux系统禁用swap
|
1月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
172 3
|
2月前
|
Ubuntu Linux
计算机基础知识:linux系统怎么安装?
在虚拟机软件中创建一个新的虚拟机,并选择相应操作系统类型和硬盘空间大小等参数。将下载的 ISO 镜像文件加载到虚拟机中。启动虚拟机,进入安装界面,并按照步骤进行安装。安装完成后,可以在虚拟机中使用 Linux 系统。
|
2月前
|
存储 Ubuntu Linux
「正点原子Linux连载」第二章Ubuntu系统入门
在图2.8.2.4中,我们使用命令umount卸载了U盘,卸载以后当我们再去访问文件夹/mnt/tmp的时候发现里面没有任何文件了,说明我们卸载成功了。
|
24天前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
276 9
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
150 0
Linux系统初始化脚本
|
24天前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
119 2
|
2月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
150 18
|
1月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
146 1
|
1月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
605 1