Linux命令之系统五大负载(监控脚本及问题详解)

x33g5p2x  于2021-10-25 转载在 Linux  
字(7.9k)|赞(0)|评价(0)|浏览(216)

一、I/O

iostat
iotop

1.监控脚本

#!/bin/bash
echo "指定设备(/dev/sda)的统计信息"

# 每秒向设备发起的读请求次数

disk_sda_rs=`iostat -kx | grep sda| awk '{print $4}'`

echo "每秒向设备发起的读请求次数:"$disk_sda_rs


# 每秒向设备发起的写请求次数

disk_sda_ws=`iostat -kx | grep sda| awk '{print $5}'`

echo "每秒向设备发起的写请求次数:"$disk_sda_ws


# 向设备发起的I/O请求队列长度平均值

disk_sda_avgqu_sz=`iostat -kx | grep sda| awk '{print $9}'`

echo "向设备发起的I/O请求队列长度平均值"$disk_sda_avgqu_sz


# 每次向设备发起的I/O请求平均时间

disk_sda_await=`iostat -kx | grep sda| awk '{print $10}'`

echo "每次向设备发起的I/O请求平均时间:"$disk_sda_await


# 向设备发起的I/O服务时间均值

disk_sda_svctm=`iostat -kx | grep sda| awk '{print $11}'`

echo "向设备发起的I/O服务时间均值:"$disk_sda_svctm


# 向设备发起I/O请求的CPU时间百分占比

disk_sda_util=`iostat -kx | grep sda| awk '{print $12}'`

echo "向设备发起I/O请求的CPU时间百分占比:"$disk_sda_util

2.I/O过高异常如何解决

①IO使用情况定位

②top查询wa(i/o)的使用情况,查看io占用cpu是否较高。

③iostat -x 2 5查看各磁盘的%util情况,越高说明磁盘对应的io越高。

④iotop直接查看IO较高的进程号,当iotop命令不可以用时使用for x in seq 1 1 10; do ps -eo state,pid,cmd | grep “^D”; echo “----”; sleep 5; done查询IO等待的对应进程

⑤cat /proc/pid/io查看对应进程使用的io情况

⑥lsof -p pid 或 ls /proc/pid/fd查看对应的应用目录

⑦fd /tmp查看对应的卷名

⑧是fdisk -l 或pvdisplay 查看对应的磁盘,来确认是否与io高的磁盘一致。

二、网络流量

1.监控脚本

#!/bin/bash
read -p '请输入网络接口: ' INTER    #(使用read交互,请输入网络接口)
ifconfig $INTER &> /dev/null     #(查看网络接口信息,将标准输出、标准错误的内容保存到黑洞里面)
if [ $? -ne 0 ];then     #(当返回值不等于0时)
   echo "此网络接口不存在!"
   exit     #(退出)
fi

while true     #(使用while语句,反复执行)
do
   RX_before=`ifconfig $INTER | awk 'NR==5{print $5}'`     #(定义1秒前的下行流量,在ens33的第5行第5列)
   TX_before=`ifconfig $INTER | awk 'NR==7{print $5}'`     #(定义1秒前的上行流量,在ens33的第7行第5列)
   sleep 1     #(间隔时间1秒)
   RX_after=`ifconfig $INTER | awk 'NR==5{print $5}'`      #(定义1秒后的下行流量,在ens33的第5行第5列)
   TX_after=`ifconfig $INTER | awk 'NR==7{print $5}'`      #(定义1秒后的上行流量,在ens33的第7行第5列)
   RX=$((RX_after-RX_before))     #(定义下载速度:1秒后的下行流量”减去“1秒前的下行流量)
   TX=$((TX_after-TX_before))     #(定义上传速度:1秒后的上行流量”减去“1秒前的上行流量)
   clear     #(清理)
   echo -e "网络监测时间:`date +%Y年%m月%d日%T`"     #(echo网络监测时间)

   if [ $RX -le 1024 ];then     #(当下载速度小于1024B,执行以下命令)
      echo "下载速度为:$[$RX]B/s"
   elif [[ $RX -ge 1024 && $RX -lt 1048576 ]];then     #(当下载速度大于等于1KB且小于1M,执行以下命令)
      echo "下载速度为:$[$RX/1024]KB/s"
   elif [[ $RX -ge 1048576 && $RX -lt 20971520 ]];then     #(当下载速度大于等于1M且小于20M,执行以下命令)
      echo "下载速度为:$[$RX/1048576]MB/s"
   else     #(下载速度大于等于20M,并警告,执行以下命令)
      echo "警告:下载速度过大,存在恶意攻击!" >> /home/WL.txt
   fi
   if [ $TX -lt 1024 ];then     #(当上传速度小于1024B,执行以下命令)
      echo "上传速度为:$[$TX]B/s"
   elif [[ $TX -ge 1024 && $TX -lt 1048576 ]];then     #(当上传速度大于等于1KB且小于1M,执行以下命令)
      echo "上传速度为:$[$TX/1024]KB/s"
   elif [[ $RX -ge 1048576 && $RX -lt 10485760 ]];then     #(当下载速度大于等于1M且小于10M,执行以下命令)
      echo "上传速度为:$[$RX/1048576]MB/s"
   else     #(上传速度大于等于10M,并警告,执行以下命令)
      echo "警告:上传速度过大,存在恶意攻击!" >> /home/WL.txt
    fi
done

2.网络流量异常如何解决

Linux下使用iftop工具结合iptables服务来解决带宽资源被恶意请求满的问题,主要通过2个步骤来实现;

  1. 使用iftop工具查出来是哪些个在请求主机的带宽资源,找出耗带宽的元凶
  2. 找出耗带宽的或者段,分析是out方向还是in方向,使用iptables规则来进行控制

具体的详细操作方法如下;

一但出现带宽被恶意请求,在带宽被请满的情况下基本上很难通过网络登入到服务器上进行操作跟维护,这时我们需要通过提供的“连接管理终端”服务来登入系统
*
一般建议在主机正常的时候直接在服务器内部安装好iftop工具,这样出现恶意请求的时候直接可以使用该工具来进行排查,下面介绍下iftop的2中安装方法
*
1.使用yum 安装iftop工具
使用yum安装的话比较简单,只要直接执行 yum install iftop –y命令即可,如果没问题的话系统就会自动执行安装,但是有使用yum可能安装不了,这时就需要使用编译安装了
*
2.编译安装iftop工具
①下载iftop工具的源码包;

②CentOS下安装所需的依赖包
yum install flex byacc libpcap ncursesncurses-devel libpcap-devel
③下载的iftop文件
tarzxvf iftop-0.17.tar.gz
④进入到解压的的iftop目录中
cdiftop-0.17
配置并制定安装目录为/usr/local/iftop目录下
⑤/configure –prefix=/usr/local/iftop
⑥编译并安装
make && make install
安装完成以后直接使用/usr/local/iftop/sbin/iftop 启动iftop程序查看流量使用情况,如果想使用iftop的方式直接开启程序,需要将iftop的程序添加到中即可
结合使用iptables服务来限制恶意请求的流量;
iftop –i eth1 查看eth1这块外网网卡的流量使用情况
*
通过查看很清楚的看到,121.199这台服务器一直往192.230.123.101 这个地址发送流量,而且出去产生的流量相当大,几乎把整个出网带宽都给耗尽了
*
查到了恶意请求的原因跟目标主机以后,我们就可以使用iptables服务来对这种恶意行为进行限制了,因为从查看到的数据看主要的流量是从out方向出去的,那就直接在OUT方向设置策略
*
Iptables -A OUTPUT -d 192.230.123.101 –j REJECT
这里可能还会发现一个情况就是禁用了这个1个IP以后可能这个段的其它都有可能马上就接上继续请求,那就可以针对一个段来进行限制
*
iptables-A OUTPUT -d 192.230.0.0/16 -j REJECT
策略加上以后可以再使用iftop –i eth1 来查看流量的请求情况;
*
可以查看到流量已经恢复了正常,之前的恶意请求的地址都已经被防火墙给屏蔽了,效果比较好
另外iftop还有很多的参数可以实现比较多的功能,有时间的话可以研究研究,对排查///*以及掌控流量使用很有帮助的

三、硬盘

1.监控脚本

#!/bin/bash
dis=$(df -h|awk -F '[ %]+' '/\/$/{print $5}')
 
check(){
    if [ $dis -ge 80 ];then
       echo "磁盘使用率超过80%,请注意!"
    else [ $dis -lt 80 ]
 echo "磁盘使用率未超过80%,运行正常"
    fi
}
 
check

2.硬盘满了如何解决df -h

①确定是不是真的是磁盘空间不足

输入命令:df –lh 查看磁盘信息

很明显:Filesystem下的挂载点 /dev/xvda1 下的40G容量已经耗尽

既然问题已经确定了,接下来就是处理了

处理方法也很简单,就是删文件

问:删除什么文件?

答:删除占用磁盘空间大,但又无用的文件

问:什么是无用的文件?

答:如果对系统不熟悉的话,日志可能是你第一的下手目标

②如何定位最大文件目录

输入命令: cd / 进入根目录

输入命令:du -h --max-depth=1 寻找当前目录,哪个文件夹占用空间最大

以上两个命令之后,可以看到 /usr 此路径占用较大磁盘空间,占用了21G。眼尖的同学可能看到了最后一项显示24G,它表示当前目录所有文件占用磁盘空间总和容量是24G

如法炮制,几番判断后,定位到tomcat的日志文件

③如何定位最大文件

输入命令:ls –lhS 将文件以从大到小顺序展现

最终定位文件为:catalina.out 这个日志文件

④确认文件未被占用

删除文件谁都会:rm –f catalina.out 但是,最好确认下是否要下载下来让开发人员分析日志

辛苦一阵找到文件,删除了很开心,输入命令:df –lh 发现磁盘空间仍是满的状态。跟开始完全没有区别。难道说是需要重启系统吗?linux会这么不友好么?

在Linux或者Unix系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。

输入命令:/usr/sbin/lsof|grep deleted 确认删除文件是否被占用

确实被占用,根据第二列提供的pid,输入命令:kill -9 13117 杀掉进程。

再次输入命令:df –lh

⑤硬盘空间满,删除了大文件之后空间没有释放

①使用lsof | grep deleted查看,发现被删除文件仍在占用着
②使用kill -9 41895终止以上进程,再用df -h检查空间情况,发现空间已经完全被释放

四、cpu

1.监控脚本

#!/bin/bash
x=$(top -b -n 1 | grep Cpu | awk -F ',' '{print $4}' | awk '{print $1*10}')
init(){
    if [ $x -le 200 ];then
         echo "当前CPU使用率超过80%请注意"
  else [ $x -ge 200 ]
         echo "当前CPU使用率未超过80%运行正常"
    fi
 
}
 
init

2.cpu满了如何解决

使用top命令查询cpu的使用情况,同时用P按使用cpu排序
1.
ps -aux查看cpu使用
1.
使用lsof -p对应进程号或者-i对应端口号,查看使cpu过高的文件情况
1.
kill 杀死没有用的进程

情况二

查看是否有ddos攻击或者dns欺骗攻击

五、内存

1.监控脚本

#!/bin/bash
#name:mem.sh
#Desc:检测系统内存使用情况,超过80%就报警给管理员

total=$(free -m |awk 'NR==2{print $2}')
used=$(free -m |awk 'NR==2{print $3}')
syl=$[$used*100/$total]

if [ $syl -gt 80 ];then
        SUBJECT="ATTENTION: Memory Utilization is High on $(hostname) at $(date)"
        MESSAGE="/tmp/Mail.out"
        TO="1335811080@qq.com"
        echo "Memory Current Usage is: $syl%" >> $MESSAGE
        echo "" >> $MESSAGE
        echo "------------------------------------------------------------------" >> $MESSAGE
        echo "Top Memory Consuming Process Using top command" >> $MESSAGE
        echo "------------------------------------------------------------------" >> $MESSAGE
        echo "$(top -b -o +%MEM | head -n 20)" >> $MESSAGE
        echo "" >> $MESSAGE
        echo "------------------------------------------------------------------" >> $MESSAGE
        echo "Top Memory Consuming Process Using ps command" >> $MESSAGE
        echo "------------------------------------------------------------------" >> $MESSAGE
        echo "$(ps -eo pid,ppid,%mem,%Memory,cmd --sort=-%mem | head)" >> $MESSAGE
        mail -s "$SUBJECT" "$TO" < $MESSAGE
else
        echo "ATTENTION: Memory Utilization is ok on $(hostname) at $(date)" 
fi

2.内存满了如何解决free -m

使用shell脚本 监控内存使用情况,发送邮件告警

yum -y install mailx
vim /etc/mail.rc /#添加配置
set from=418044336@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=418044336@qq.com
set smtp-auth-password=dkgcnzaeqmhmbjdi
set smtp-auth=login vim gaojing.sh
/#!/bin/bash
/#邮箱自己定义
a=418044336@qq.com
memin=cat /proc/meminfo | grep "MenFree" | awk '{print $2}'
if $memin -ge 0 ;then
echo “内存使用率超过百分之90!” | mail -s “内存” $a
else
echo “ok”
fi
/#因为测试 我参数设置成了0

在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了
*
要达到释放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:

0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存
*
知道了参数后,我们就可以根据我们的需要,使用下面的指令来进行操作
*
首先我们需要使用sync指令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件
*
/#sync
*
接下来,我们需要将需要的参数写进/proc/sys/vm/drop_caches文件中,比如我们需要释放所有缓存,就输入下面的命令:

/#echo 3 > /proc/sys/vm/drop_caches

此指令输入后会立即生效,可以查询现在的可用内存明显的变多了。

要查询当前缓存释放的参数,可以输入下面的指令:

/#cat /proc/sys/vm/drop_caches

1.清理前内存使用情况
free -m

2.开始清理
echo 1 > /proc/sys/vm/drop_caches

3.清理后内存使用情况
free -m

4.完成!

查看内存条数命令:

dmidecode | grep -A16 “Memory Device$”

六、常用的查看系统硬件资源命令

场景:我会在巡检的时候使用到以上的命令,检测出系统/服务器的负载量,并输出到文档中,便于我平时的巡检检测

1.磁盘占用:df -hT
内存信息:free -m或cat /proc/meminfo
CPU信息:cat /proc/cpuinfo
I/O信息: iostat iotop

2.ss:获取socket 统计信息,与netstat类似
能够显示更多更详细的有关TCP和连接状态的信息,比netstat更快速更高效
netstat -nautp | grep […]
ss -nautp | grep […] '//可检测端口占用

3.iotop:是一个用来监视磁盘I/O使用状况的 top 类工具
可监测到哪一个程序使用的磁盘IO的信息(yum -y install iotop)

4.lsof:用于查看进程打开的文件,打开文件的进程,进程打开的端口(TCP/UDP)
是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行

相关文章