Shell脚本分析服务器性能

不念不忘少年蓝@ 2023-06-05 08:57 109阅读 0赞

概述

我们原先在服务器上想分析性能指标,需要执行一系列的linux命令。对于linux命令不熟悉的人来说,比较困难

现在有一套集成的shell脚本,把常用的linux命令都包含在里面,一键式分析性能瓶颈

脚本功能

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)

脚本如下

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

运行效果如下

# sh show_sys_info.sh

946454-20190909140701230-1832808051.png

1)cpu_load:分析cpu

946454-20190909140831492-1522186282.png

util:cpu已使用百分比

user use:用户使用cpu百分比

system use:系统使用cpu百分比

I/O wait:I/O等待百分比

三次刷新,间隔时间1s

2)disk_load 分析磁盘

946454-20190909141513698-920660452.png

Util:每秒磁盘处理的百分比
vda:
I/O Wait:IO等待时间
Read/s:每秒磁盘读数据量
vda:
Write/s:每秒磁盘写数据量
vda:

3)disk_use 磁盘使用情况

946454-20190909142645636-147744309.png

disk total:打印磁盘数量和磁盘分区使用情况

4)disk_inode 如果有磁盘inodo超过90%,这里会打印出来

5)mem_use 内存占用情况

946454-20190909143354116-117122201.png

Total:总内存

use:已使用内存

free:剩余内存

cache:缓存占用内存

6)tcp_status tcp状态

946454-20190909144403480-753849126.png

7)cpu_top10 占用cpu最大的十个进程

8)mem_top10 占用内存最大的十个进程

9)traffic 查看网卡进出流量

946454-20190909144959556-2088249271.png

转载于:https://www.cnblogs.com/Zfc-Cjk/p/11490648.html

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读