分析系统资源性能瓶颈
脚本功能:
- 查看CPU利用率与负载( top、vmstat、sar )
- 查看磁盘、Inode利用率与I/O负载( df 、iostat、iotop、sar、dstat )
- 查看内存利用率( free、vmstat )
- 查看TCP连接状态( netstat、ss )
- 查看CPU与内存占用最高的10个进程( top、ps )
- 查看网络流量( ifconfig、iftop、iptraf )
先来看一下select循环
快速生成一个菜单
#!/usr/bin/bash
PS3="Your choice is [4 for quit]: "
select choice in disk file cpu_load quit
do
case "$choice" in
disk)
fdisk -l
;;
file)
df -h
;;
cpu_load)
uptime
;;
quit)
exit
;;
esac
done
# 效果
[root@server4 ~]# ./select.sh
1) disk
2) file
3) cpu_load
4) quit # $PS3
Your choice is [4 for quit]:
[root@server4 ~]# echo $PS1
[\u@\h \W]\$
[root@server4 ~]# echo $PS2
>
[root@server4 ~]# echo $PS3
# PS3 The value of this parameter is used as the prompt for the select command
脚本代码:
#!/usr/bin/bash
# show system information
# by racon 2022-04-30
# os_check() { } 等待完善......
PS3="Your choice is: "
# 验证操作用户是否为root
if [ $LOGNAME != root ];then
echo "Please use the root account opearation."
exit 1
fi
if ! which vmstat &> /dev/null; then
echo "vmstat command not found, now the install."
sleep 1
yum -y install procps
echo "-----------------------------------------------------------------------------------------------------------"
fi
which iostat &> /dev/null
if [ $? -ne 0 ];then
echo "iostat command not found, now the install."
sleep 1
yum -y install sysstat
echo "-----------------------------------------------------------------------------------------------------------"
fi
# CPU利用率与负载
show_cpu_load (){
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"
let i++
sleep 1
done
echo "---------------------------------------"
}
# 磁盘I/O负载
show_disk_load (){
echo "-------------------------------------"
i=1
while [ $i -le 3 ];
do
echo -e "\033[32m 参考值${i}\033[0m"
UTIL=`iostat -x -k|awk '/^[vs]/{OFS=": ";print $1,$NF"%"}'`
READ=`iostat -x -k|awk '/^[vs]/{OFS=": ";print $1,$6"KB"}'`
WRITE=`iostat -x -k|awk '/^[vs]/{OFS=": ";print $1,$7"KB"}'`
IOWAIT=`vmstat |awk '{if(NR==3){print $16"%"}}'`
echo "Util: "
echo "$UTIL"
echo "I/O Wait: $IOWAIT"
echo -e "Read/s: \n$READ"
echo -e "Write/s: \n$WRITE"
let i++
sleep 1
done
}
# 硬盘利用率
show_disk_use() {
DISK_LOG=/tmp/disk_use.tmp
DISK_TOTAL=`fdisk -l| awk -F"[ :]" '/GB/&&/\/dev/{printf $2" ";printf "%dGB\n",$3}'`
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
}
# 硬盘inode利用率
show_disk_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 "-------------------------------------------"
cat $INODE_LOG
rm -f $INODE_LOG
else
echo "-------------------------------------------"
echo "Inode use rate no than 90% of the partition"
echo "-------------------------------------------"
fi
}
# 内存使用情况
show_mem_use() {
echo "-------------------------------------"
MEM_TOTAL=`free -m |awk '{if(NR==2){printf "%.2fG\n", $2/1024}}'`
USE=`free -m |awk '{if(NR==2){printf "%.2fG\n", $3/1024}}'`
FREE=`free -m |awk '{if(NR==2){printf "%.2fG\n", $4/1024}}'`
CACHE=`free -m |awk '{if(NR==2){printf "%.2fG\n", $6/1024}}'`
echo "Total: $MEM_TOTAL"
echo "Use: $USE"
echo "Free: $FREE"
echo -e "Cache: $CACHE"
echo "-------------------------------------"
break
}
# 网络连接状态
show_tcp_status() {
echo "-------------------------------"
COUNT=`ss -ant |awk '!/State/{status[$1]++}END{for (i in status){print i,status[i]}}'`
echo -e "TCP connection status:\n$COUNT"
echo "-------------------------------"
}
# 占用CPU高的前10个进程
show_cpu_top10() {
echo "--------------------------------"
CPU_LOG=/tmp/cpu_top.tmp
i=1
while [ $i -le 3 ]
do
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
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
let i++
sleep 1
done
echo "--------------------------------"
}
# 占用内存高的前10个进程
show_mem_top10() {
echo "--------------------------------"
MEM_LOG=/tmp/mem_top.tmp
i=1
while [ $i -le 3 ]
do
ps aux |awk '{if ($4>0.1){{printf "PID: "$2" Memory: "$4"% --> "}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
let i++
sleep 1
done
echo "--------------------------------"
}
# 查看网络流量
show_traffic() {
which ifconfig &> /dev/null
if [ $? -ne 0 ];then
yum -y install net-tools
fi
while true
do
read -p "Please enter the network card name(ens[0-9] or eth[0-9] or em[0-9]): " eth
if [ `ifconfig | grep -c "\<ens33\>"` -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 -F"[: ]+" '/bytes/{if(NR==8)print $4;else if(NR==5)print$6}'`
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 "%.2f\n",'$(($NEW_IN-$OLD_IN))/1024/128'}'`
OUT=`awk 'BEGIN{printf "%.2f\n",'$(($NEW_OUT-$OLD_OUT))/1024/128'}'`
echo "${IN}MB/s ${OUT}MB/s"
let i++
done
echo "---------------------------------"
}
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)
show_cpu_load
break
;;
disk_load)
show_disk_load
break
;;
disk_use)
show_disk_use
break
;;
disk_inode)
show_disk_inode
break
;;
mem_use)
show_mem_use
break
;;
tcp_status)
show_tcp_status
break
;;
cpu_top10)
show_cpu_top10
break
;;
mem_top10)
show_mem_top10
break
;;
traffic)
show_traffic
break
;;
quit)
exit 0
;;
*)
echo "-------------------------------------"
echo "Please enter the number."
echo "-------------------------------------"
break
;;
esac
done
done