22
2022
10
08:38:54

CPU平均负载过高检查(iowait负载高)

文章目录

CPU平均负载过高(iowait高)

1、故障现象

2、对CPU进行排查

3、高I/O Wait问题排障和解决

4、 IOwait高的解决方法(优化磁盘)

CPU平均负载过高(iowait高)

1、故障现象

直观上感受,以模拟器为例,明显的故障现象就是电脑散热风扇开到最大,cpu在一直计算会产生大量热量,风扇也会随之加大,当然也有监控平台,可以提前对服务器异常现象进行告警,如Nagios、Prometheus、Zabbix等。


引起cpu平均过高的因素有很多,简单举例如下:


CPU 处理多个进程,使用大量CPU处理会导致平均负载升高

I/O 进程进行大量读写,超过磁盘瓶颈,出现等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高

大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高

2、对CPU进行排查

先使用 top 命令,查看系统相关指标。


87c812f5e86210b18c6ff7f93c151e66_8094ff00fc3bb7a9cecbea1a19611858.png



主要判断指标:


%us 过高,则可以在对应服务的线程ID查看具体详情,是否存在死循环,或者长时间的阻塞调用。

%sy 过高,则先使用 strace 定位具体的系统调用,再定位是哪里的应用代码导致的。

%si 过高,则可能是网络问题导致软中断频率飙高。

%wa 过高,则是频繁读写磁盘导致的,可以通过iostat,iotop。

3、高I/O Wait问题排障和解决

首先确定故障点,比如文件读写变慢,可以使用常用的性能分析命令top

6d157877b8be4299fe3c3d0862e73020_c5d5bdb0cc36874554ed6bd28d94b85d.png



通过查看可以看到cpu平均负载明显过高(CPU为4核),再发现I/O等待明显很高,cpu进程等待就会很高。


然后通过iostat命令进行查看I/O状态信息。


iostat只要用于输出CPPU和磁盘IO的相关的统计信息

    格式: iostat 选项 时间间隔 次数

    -c 单独输出Device的信息不包括CPU信息

    -k/m:输出结果以kb或者是mb为单位,而不是以扇区数量为单位

    -x:输出更详细的磁盘io的信息

 输出结果的重点参数:

    iowait%:表示CPU等待的是io时间占用整个cpu周期的百分比。

    avgqu-sz表示的是磁盘io的队列长度,即io的等待个数

    await:表示的是io请求时间,等待时间和处理时间

    svctm:表示的是每次请求的处理的时间

    %util表示的是磁盘的忙碌情况,如果>80%就是磁盘可能处于忙碌状态


iostat-x 2 5 :输出更详细磁盘信息,间隔2s,输出5次

d47f3b91bd6b94302ce1f24c83eb68f0_9cdc4787a91c9c5847731e2460baaf39.png



通过iostat输出可以看到%util明显过高(99.85、99.60、100.05、100.2),并且avgrq-sz也有明显过高(495.68、816.67)。


并且通过输出信息可以确定异常的是sda磁盘。


再通过iotop查看io使用的进程有那些。


iotop是一款开源、免费的用来监控磁盘I/O使用状况的类似top命令的工具,iotop可以监控进程的I/O信息。它是Python语言编写的,与iostat工具比较,iostat是系统级别的IO监控,而iotop是进程级别IO监控。

    iotop

    -p 指定监控的进程

    -u 指定监控的进程用户

    -n 指定显示次数

f43a27f9d83a3f0e944a4cadc4afe08c_2ab38f42aceef46988a8d8c164f24398.png


通过iotop的显示可以看到bonnie++(磁盘性能测试工具)进程占用资源高,导致IO的等待变高。


由于确定了是IO导致的CPU平均负载变高,可以再进一步确定IO的操作,比如通过isof查看bonnie++进程在频繁的读写哪个文件。


lsof是一个列出当前系统打开文件的工具,在Linux下,任何事物都以文件的形式存在,通过文件不仅可以访问数据,还以访问网络连接和硬件。

    lsof 选项 参数

    -a 列出打开文件存在的进程

    -c 列出指定进程打开的文件

    -p 列出指定进程打开的文件

    -u 列出uid号进程详细

    +D 递归列出目录下被打开的文件

    -d 列出占用该文件的进程

9cdddc1e1c9798e6384a56834cdc34cb_bd0558188a4151c39c149e2f93d4e5c7.png


通过lsof的输出可以看到/tmp在被频繁的读写。


4、 IOwait高的解决方法(优化磁盘)

通过iostat的输出结果表面,是磁盘的性能达到瓶颈,可以通过优化磁盘降低IO等待时间。


更换高性能磁盘


最简单的方法就是将之前已经达到瓶颈的磁盘更换为新能更好的磁盘


使用外部平台cpu负载


可以使用esxi+vcenrter,通过在esxi主机绑定集群,创建资源池,限制虚拟机能获得的cpu/内存/线程/磁盘资源进行


当然单纯的cpu资源限制只是为了防止影响到其他的虚拟机,我们完整的方案其实还要对系统的内存等进行优化,此时Storage DRS它会为虚拟机提供建议机器磁盘放置和迁移以平衡空间和I / O资源,跨数据存储集群中的数据存储,如果大批量的数据或i/o的执行我们可以将VM的存储从一个数据存储迁移到另一个数据存储配置vSphere以执行负载平衡


组建RAID


通过组件RAID来提高磁盘的可靠性和读取数量的能力


对进程的资源进行限制


cgroup或cpulimit对进程进行限制。


Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)。

主要功能:

限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。

进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。

记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间

进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。

进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。


cpulimit是一款可以对CPU使用率进行控制的软件

    cpulimit 选项 参数

    -z 如果限制的进程不存在了,则退出

    -i 包括子进程

    -p 指定进程号

    -e 指定可执行程序

    -l 后面限制的cpu使用量,要根据实际的核心数量而成倍减少。40%的限制生效在1核服务器中,如果是双核服务器,则应该限制到20%,四核服务器限制到10%以此类推。

5f16cb62c3f0de98e2dd6c5558ac80c8_0d3a5972ba8746014a53ca23506b4307.png



bonnie++cpu利用率100%


52a723af4c14bd7bf62c436d23b9a9f3_85489deb48381cc31a44f54284980915.png


对该bonnie++进程进行限制cpu使用率在20%以保证设备的主要服务不能掉或者保证设备不会因为CPU高负载而挂掉

041e6cbb89eb33cd893cb5810eee1d5b_c08281160f1a033b554fba2ec7360188.png


们能看到/dev/sda2其实就是我们用来创建逻辑磁盘的具体磁盘。通过以上的信息我们可以放心的说lsof的结果就是我们要查找的文件




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/2808.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: