linux服务器维护load average、wait、IO中kswapd0过高以及使用iostat和iotop命令排查原因的过程

一、服务器load average很高,wait接近100%,IO中kswapd0接近100%的问题

    昨天在服务器上安装了jenkins,但每次启动不多久就发现jenkins自动挂了,非常纳闷。后来才发现服务器的load average已经很高,基本都在1(单核CPU),而每次jenkins一启动后,load average一路上升,基本到达4了。而CPU中数据显示wait等待输入输出的CPU时间百分比基本在98%。如下图:

服务器load average很高,wait接近100%,IO中kswapd0接近100%的问题

    图中可看出,CPU的使用率并不高,说明不是CPU的瓶颈,wait值很大,说明内存与硬盘之间的数据输入输出很多在等待,推测是IO很大,通过iotop查看IO的情况如下:

服务器load average很高,wait接近100%,IO中kswapd0接近100%的问题

    IO情况中可以看到:kswapd0占比快达到100%,kswapd0为何物呢?

Linux uses kswapd for virtual memory management such that pages that have been recently accessed are kept in memory and less active pages are paged out to disk.(what is a page?)…Linux uses manages memory in units called pages.So,the kswapd process regularly decreases the ages of unreferenced pages…and at the end they are paged out(moved out) to disk。

    kswapd0是虚拟内存管理中,负责换页的,操作系统每过一定时间就会唤醒kswapd ,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有2 个阀值,pages_hige 和 pages_low,当空闲内存页的数量低于 pages_low 的时候,kswapd进程就会扫描内存并且每次释放出32 个free pages,直到 free page 的数量到达pages_high。

    可见kswapd0这么忙,是内存出现了问题,可top命令里显示内存还剩余了几百M。不可能出现这样的情况啊,突然一想到前两天我想测试服务器的内存阀值的事情,可能是因为内存阀值设置太高,而kswapd0认为内存阀值里的内存不能使用,于是启动起来频繁扫描内存并释放,从而占用了大量的IO。我之前把服务器的内存阀值改成了500M:命令查看,

    cat /proc/sys/vm/min_free_kbytes   显示:524288,于是立即使用命令:

[root@kermit ~]# echo 51200 > /proc/sys/vm/min_free_kbytes    
[root@kermit ~]# cat /proc/sys/vm/min_free_kbytes         
51200

    然后开始观察load average和cpu wait数量,果不其然都在开始下降,由此可见,kswapd0是当可用内存不足时便启动,并且这个可用内存是free中的可用内存减掉 /proc/sys/vm/min_free_kbytes 配置值后的数据,同时/proc/sys/vm/min_free_kbytes 值也不能配置太高。调个几百M即可(视物理内存大小而定)。

publish:July 18, 2016 -Monday

二、linux下wa过高时使用iostat和iotop命令排查原因

    linux下wa过高时表示,表示I/O等待时间所占CPU时间的比重很高,wa即wait的时间。之前有过一篇相关的文章,不过那时未提及iostat,先制作一个wa非常高的现场吧。把内存阈值设置得比较大,比如内存的50%,这个当然视你的服务器当前情况而定。命令:echo 524200 > /proc/sys/vm/min_free_kbytes 执行完后我服务器的IO就上到91了(内存1G)。截图如下:

    当面对这样一个高烧的服务器时,首先要检查的就是机器是否正在大量使用交换空间,因为硬盘操作的速度远远低于RAM,当系统内存耗尽,开始使用交换空间(使用swap性能会受到严重影响)。如果还有大量可用的内存,则需要明确那个进程占用了大部分I/O操作。

    第一:使用iostat排查是在哪个分区上进行了大量的I/O操作

    安装iostat:不能使用yum install iostat.因为包名不是叫iostat,而是sysstat。介绍:sysstat.x86_64 : The sar and iostat system monitoring commands。通过yum install sysstat安装完成之后。使用iostat查看如下:

[root@kermit ~]# iostat
Linux 2.6.32-431.23.3.el6.x86_64 (kermit)       10/28/2016      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.54    0.00    0.18    0.34    0.00   98.94

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
xvda              2.70        18.20        37.59 1064816412 2199369704

    因为服务器只有一个分区,所以就只看到这个分区的IO操作特别高,如果分区很多。而通过此命令发现某个分区IO特别高时,可以再使用df查看这个分区挂载了哪些文件,从而排查哪些地方在操作这些文件。比如一直在往哪里写日志。iostat命令后面带上数字参数表示隔几秒刷新一次。上面的结果中几个比较重要的数据意义:

avg-cpu:
%user: 在用户级别运行所使用的CPU的百分比
%nice: nice操作所使用的CPU的百分比
%system: 在系统级别(kernel)运行所使用CPU的百分比
%iowait: CPU等待硬件I/O时,所占用CPU百分比
%idle: CPU空闲时间的百分比
Device:
sda:设备名
tps: 每秒钟发送到的I/O请求数.
Blk_read /s: 每秒读取的数据量
Blk_wrtn/s: 每秒写入的数据量.
Blk_read:   读入的总的数据量
Blk_wrtn:  写入的总的数据量

    第二:可以使用iotop查看哪个进程的IO最高。

    同样也以yum方式安装iotop: yum search iotop。我之前安装了iotop,此次启动时碰到问题:No module named iotop.ui To run an uninstalled copy of iotop, launch iotop.py in the top directory,此错误是因为python的版本问题。我原centos下是python2.6版本,后来升级安装了python2.7版本,而iotop是在python2.6版本时安装的(yum安装的库就会在python2.6下),并且已经重新更新了/usr/sbin/python的软链接,而在/usr/sbin/iotop命令文件中使用的是:#!/usr/bin/python (第一行),直接导致此错误。解决起来也简单,修改/usr/sbin/python的第一行:

    完成之后开始使用iotop,iotop和top命令有点类似,都通过-d参数指定刷新秒数,执行命令:iotop -d 5 默认结果会按照我们想要的以IO排序,结果如下图:

    此时我们能看到kswapd0的IO操作最高,iotop命令支持键盘快捷键:左右箭头改变排序方式,默认是按IO排序,r键是反向排序,o键是只显示有IO输出的进程,和top一样以q键退出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值