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

1,linux服务器敲命令反应慢,网站访问慢,到底什么情况?根据本人的经验,主要原因可能是系统资源到达瓶颈,已经无法处理更多请求。在有监控系统情况下,可以直接通过WEB页面可视化看出是CPU瓶颈?硬盘瓶颈?还是网络瓶颈?如果公司服务器较少或者云服务器,就有可能没有一套监控系统,这时就要登陆到服务器,一条一条的敲命令,查找分析性能瓶颈。很费劲,所以借鉴下大神写的脚本与大家分享。

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

3,脚本功能:
3.1,查看CPU利用率与负载(top、vmstat、sar)

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

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

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

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

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

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

4,脚本如下:
#cat show_sys_info.sh
#!/bin/sh
os_check(){
if [ -e /etc/redhat-release ];then
REDHAT=cat /etc/redhat-release|cut -d' ' -f1
else
DEBIAN =cat /etc/issue|cut -d' ' -f 1
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 "-----------------------install the vmstat---------------------------------------"
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 "-------------------------install the iostat--------------------------------------"
fi

while true;do
select input in cup_load disk_load disk_use disk_inode mem_use tcp_status cup_top10 mem_top10 traffic quit;do
case $input in
cup_load)
#cup利用率与负载
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 "---------------vmstat test----------------------------------------"
break
;;
disk_load)
#硬盘I/O负载
echo "-------------------------I/O------------------------------"
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 "-----------------------I/O test----------------------------"
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 -e "Disk use rate \033[32m no than 90% \033[0m 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 -e "Inode use rate \033[32m no than 90% \033[0m 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 "---------------------------------------"
;;
cup_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 "\&lt;$eth\&gt;" -eq 1 ]]; then
if [ ifconfig |grep -c "\&lt;$eth\&gt;" -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

5,运行效果如下
使用Shell脚本查看linux系统性能瓶颈

转载于:https://blog.51cto.com/13718210/2149400

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值