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

先来看一下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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值