概述

我们原先在服务器上想分析性能指标,需要执行一系列的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)

脚本如下

#!/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 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
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 "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

运行效果如下

# sh show_sys_info.sh

1)cpu_load:分析cpu

util:cpu已使用百分比

user use:用户使用cpu百分比

system use:系统使用cpu百分比

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

三次刷新,间隔时间1s

2)disk_load 分析磁盘

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

3)disk_use 磁盘使用情况

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

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

5)mem_use  内存占用情况

Total:总内存

use:已使用内存

free:剩余内存

cache:缓存占用内存

6)tcp_status tcp状态 

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

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

9)traffic 查看网卡进出流量 

Shell脚本分析服务器性能的更多相关文章

  1. 使用shell脚本分析Nagios的status.dat文件

    前言 Nagios的安装和配置以及批量添加监控服务器在我前面的文章中已经讲的很详细了. 我们知道,Nagios的网页控制页面(一般为http://nagio.domain.com/nagios)里可以 ...

  2. shell 在手分析服务器日志【转】

    自己的小网站跑在阿里云的 ECS 上面, 偶尔也去分析分析自己网站服务器日志,看看网站的访问量.看看有没有黑阔搞破坏!于是收集,整理一些服务器日志分析命令,大家可以试试! awk '{print $1 ...

  3. shell脚本分析nginx日志

    shell脚本分析nginx日志: name=`awk -F ',' '{print $13":"$32}' $file | awk -F ':' '{print $4}'`ech ...

  4. Hadoop的shell脚本分析

    你会发现hadoop-daemon.sh用于启动单独的本机节点 而hadoop-daemons.sh 会批量的ssh到别的机器启动 前记: 这些天一直学习hadoop,学习中也遇到了许多的问题,主要是 ...

  5. 一段shell脚本分析

    工作中碰到这样的需求: 1.每天定时要执行python脚本生成excel 2.将生成的excel拷贝到特定目录下 3.通过python发送脚本发送给特定的接收者 因为之前没有接触过shell脚本,同事 ...

  6. shell脚本分析 nginx日志访问次数最多及最耗时的页面

    当服务器压力比较大,跑起来很费力时候.我们经常做站点页面优化,会去查找那些页面访问次数比较多,而且比较费时. 找到那些访问次数高,并且比较耗时的地址,就行相关优化,会取得立竿见影的效果的. 下面是我在 ...

  7. Linux shell脚本判断服务器网络是否可以上网

    Linux shell脚本判断网络畅通 介绍 在编写shell脚本时,有的功能需要确保服务器网络是可以上网才可以往下执行,那么此时就需要有个函数来判断服务器网络状态 我们可以通过curl来访问 www ...

  8. 利用shell命令分析服务器日志

      在没有专业日志分析系统的情况下,我们有时需要对日志进行简单的分析,下面列出一些常用的shell命令分析日志的方法,一定要收藏 1.查看有多少个ip访问 awk '{print $1}' log_f ...

  9. MySQL进阶篇(01):基于多个维度,分析服务器性能

    本文源码:GitHub·点这里 || GitEE·点这里 一.服务器性能简介 1.性能定义 服务器性能优化是一项非常艰巨的任务,当然也是很难处理的问题,在写这篇文章的时候,特意请教下运维大佬,硬件工程 ...

随机推荐

  1. 一文了解:Redis基础类型

    Redis基础类型 Redis特点 开源的,BSD许可高级的key-value存储系统 可以用来存储字符串,哈希结构,链表,集合 安装 windows:https://github.com/micro ...

  2. 第四次作业;创建raid5,源码编译安装;磁盘配额

    创建raid5 格式化 ext4 创建物理卷: 创建卷组: 创建逻辑卷: 格式化  ext4 挂载 开机自启动 创建raid配置文件 源码编译安装: 创建本地yum仓库 umount /dev/sr0 ...

  3. Danjgo学习笔记(一)

    ## 创建项目: 1. 通过命令行的方式:首先要进入到安装了django的虚拟环境中.然后执行命令: ``` django-admin startproject [项目的名称] ``` 这样就可以在当 ...

  4. vue过滤器的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. JavaScript数据结构——图的实现

    在计算机科学中,图是一种网络结构的抽象模型,它是一组由边连接的顶点组成.一个图G = (V, E)由以下元素组成: V:一组顶点 E:一组边,连接V中的顶点 下图表示了一个图的结构: 在介绍如何用Ja ...

  6. python调用支付宝支付接口

    python调用支付宝支付接口详细示例—附带Django demo代码   项目演示: 一.输入金额 二.跳转到支付宝付款 三.支付成功 四.跳转回自己网站 在使用支付宝接口的前期准备: 1.支付宝公 ...

  7. Netbeans courier new 乱码问题

    Netbeans 默认的字体 monospaced,显示英文的单引号及字体非常的不好看,在网上查了下资料可以变得很好看. 1.仍然保持默认字体 monospaced 2.在Netbeans 的安装目  ...

  8. Mysql优化(出自官方文档) - 第八篇(索引优化系列)

    目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...

  9. jquery validate常用方法及注意问题

    1. required: true 值是必须的.required: "#aa:checked" 表达式的值为真,则需要验证.required: function(){} 返回为真, ...

  10. Docker系列之镜像瘦身(五)

    前言 本节我们来讲讲在我们在构建镜像过程中不出问题,同时使得最后所构建的镜像文件大小尽可能最小,温馨提示:文中大图均可点击放大查看详细信息. 缓存(cache) Docker的优势之一在于提供了缓存, ...