处理linux服务器cpu的wa%值过高

本文记录了一次解决MongoDB性能问题的过程,通过一系列排查手段,最终定位到特定集合的写入磁盘时间过长,并采取措施优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时近中午醒来,看了一下新闻,做了十几分钟的室内运动,洗澡之后发现脖子有点疼,可能昨晚睡觉给扭到了。下班街头看美女都不好扭脖子。现在项目急,每天更新,然后修bug.。出问题的风险也越来越高,7号公司网站就出现,响应很慢的情况,最后排除发现是机房出口带宽不够用了。囧,今天写周报,发现数据库服务器CPU的wa%值增加的很快,排查了一下,发现是mongodb的一个集合写入磁盘时间太慢,而且并发也挺高才导致的。

所以这篇日志是用来记录处理过程的。

 

1)Top命令查看一下,确认情况。

top

CPU1跟CPU8两个wa%值很高。

2)iotop –o 查看那些进程正在读写磁盘。

iotop

观察了一段时间发现读写数据量不大但是很频繁。

3)观察一下mongodb的日志看看是不是有类似mysql的慢查询操作

祭出强大的awk筛选出操作时间超过一秒的记录

1
#awk '!/authenticate/&&!/connection/{gsub(/ms/,"",$NF);if($NF>=1000){print$0}}' /var/log/mongdb.log

log

满屏幕的update操作,来自db_imaibo_live库下面的cs_combination_stock_log集合而且操作基本都在四秒以上。

4)上报朝廷。。。。跟开发工程师反应之后,了解到这个集合一天生成3万多的记录,现在总记录已经有280多万了,每次update都要先扫描整个集合,好悲伤的感觉。

5)商讨之后,备份集合,清理数据,调整业务逻辑,收工!

 

转载:http://blog.cxzlm.org/?p=478

### Linux 中 `wa%` 的含义 在 Linux 系统监控工具(如 top 或 vmstat)中,`wa%` 表示 CPU 花费在等待 I/O 操作完成上的时间比例。具体来说,当某个进程发起 I/O 请求后进入等待状态时,这段时间会被计入 `wa%`[^3]。如果系统的 `wa%` 较,则表明存在大量的磁盘或其他外部设备的读写请求未被及时处理。 通常情况下,较的 `wa%` 可能由以下几个原因引起: - **硬盘性能瓶颈**:存储介质的速度不足以满足当前的工作负载需求。 - **I/O 队列过长**:大量并发的 I/O 请求堆积,导致延迟增加。 - **文件系统配置不当**:不合适的缓存策略或日志模式可能导致额外开销。 - **网络存储延迟**:对于依赖远程存储(如 NFS 或 iSCSI),网络带宽不足会显著影响 I/O 性能。 --- ### 如何降低 `wa%` #### 优化硬件资源 可以通过升级物理硬件来缓解 I/O 压力: - 使用更快的 SSD 替代传统 HDD 来提升随机访问速度[^4]。 - 扩展 RAID 组中的驱动器数量以提吞吐量并减少单点压力。 #### 调整软件参数 针对操作系统层面可以采取如下措施: - 修改调度算法:Linux 提供多种块设备调度程序(CFQ、Deadline 和 NOOP)。选择适合工作场景的一种可能改善状况;例如,在数据库服务器上推荐使用 Deadline 而不是默认 CFQ[^5]。 ```bash echo deadline | sudo tee /sys/block/sda/queue/scheduler ``` - 减少不必要的同步操作频率:通过调整 `/proc/sys/vm/dirty_ratio` 和其他相关参数控制脏页刷新行为从而减轻频繁刷盘带来的负担[^6]。 #### 应用层改进 从应用程序角度出发寻找潜在优化空间也很重要: - 缓冲池大小设置合理化——特别是像 MySQL 这样的关系型数据库管理系统,默认缓冲区容量往往偏低需依据实际数据集规模适当增大 innodb_buffer_pool_size 参数[^7]; ```sql SET GLOBAL innodb_buffer_pool_size=8G; ``` - 数据本地性考虑充分与否直接影响到分布式计算框架下的任务执行效率,Hadoop MapReduce 类似作业应尽量让输入源靠近计算节点位置避免跨机房传输损耗宝贵网路带宽进而拖累整体表现水平。 --- ### 示例脚本检测 IO 状态 下面提供一段简单的 bash 脚本来持续监测一段时间内的平均 io wait 时间百分比变化趋势图以便于分析是否存在异常波动情况发生: ```bash #!/bin/bash interval=${1:-1} # default interval is 1 second if no argument given count=${2:-10} # number of samples collected before stopping for ((i=1;i<=count;i++)); do cpu_info=$(mpstat $interval 1 | grep 'Average') idle_percent=$(echo "$cpu_info" | awk '{print $(NF)}') wa_percent=$(echo "$cpu_info" | awk '{print $(NF-1)}') total=$((100-idle_percent)) used_excl_wait=$(bc <<< "scale=2; ($total-$wa_percent)/$total*100") printf "[%d/%d] Total Used(exclude WA): %.2f%%\n" "$i" "$count" "$used_excl_wait" done ``` 运行此脚本可帮助识别哪些时间段内出现了严重的 I/O 等待现象,并据此进一步深入排查根本原因所在。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值