当前位置: 首页 > news >正文

Linux 磁盘读写带宽跑满如何使用 iotop 定位具体进程?

当 Linux 服务器磁盘读写带宽占满导致系统响应变慢时,最直接的排查手段是使用 iotop 工具查看实时占用磁盘 I/O 的进程,确认是否为异常写入或备份任务。

先说结论:iotop 是定位磁盘 I/O 占用进程的首选工具,但需要 root 权限且内核支持任务记账功能。

  • 先定位:使用 sudo iotop -oPa 命令筛选出实际产生 I/O 的进程。
  • 先做:确认进程身份,区分正常业务高峰与异常死循环写入。
  • 再处置:优先使用 ionice 限制权重,必要时 kill -15 优雅终止。
  • 后验证:结合 iostat 观察整体磁盘利用率是否随干预下降。

前置检查与内核配置

iotop 依赖内核的任务记账功能(Task Accounting)。如果运行时报错 Error accessing task IO accounting information 或显示空白,说明内核未开启相关功能。

1. 检查内核参数:

sysctl kernel.task_delayacct

如果返回 kernel.task_delayacct = 0,尝试临时开启:

sudo sysctl -w kernel.task_delayacct=1

2. 永久生效配置:

若临时开启成功,需写入配置文件防止重启失效:

echo 'kernel.task_delayacct=1' | sudo tee -a /etc/sysctl.conf

注意:若上述命令无效,说明当前内核编译时未包含 CONFIG_TASK_DELAY_ACCT,需更换内核或使用替代方案。

命令速用版

如果已经安装了 iotop 且内核支持,直接运行以下命令即可看到实时占用最高的进程:

sudo iotop -oPa

参数说明:-o 仅显示有 I/O 操作的进程,-P 仅显示进程不显示线程,-a 显示累计 I/O 量。

安全处置进程

定位到高 I/O 进程 PID 后,切勿直接强制杀死,以免数据不一致或服务中断。

1. 限制 I/O 权重(推荐):

如果是业务进程但不能立即停止,可先降低其 I/O 优先级,让出磁盘资源:

sudo ionice -c2 -n7 -p <PID>

说明:-c2 表示 Best-effort 类别,-n7 表示最低优先级。

2. 优雅终止进程:

确认进程可停止后,先发送 SIGTERM 信号:

sudo kill -15 <PID>

观察进程是否退出,若无响应且确认为异常进程,再考虑强制终止:

sudo kill -9 <PID>

验证与替代方案

1. 验证效果:

在另一个终端窗口运行 iostat -x 1,观察磁盘的 %util 指标。当占用高的进程被限制或终止后,%util 数值应明显下降,系统响应恢复。

2. iotop 不可用时的替代:

若内核不支持 iotop,可通过 /proc 文件系统查看特定进程 I/O:

cat /proc/<PID>/io

关注 write_bytesread_bytes 字段的变化,配合 watch 命令监控:

watch -n 1 'cat /proc/<PID>/io | grep bytes'

常见坑

  • 权限不足:iotop 必须使用 root 权限运行,否则无法读取其他进程的 I/O 信息。
  • 线程干扰:默认情况下 iotop 可能显示线程,使用 -P 参数可以聚合到进程级别,更方便识别。
  • 缓存误导:有时看到写入高可能是页面缓存回写,结合 iostat 的 writesection 确认是否为物理磁盘写入。
  • 容器环境:在 Docker 容器中运行 iotop 可能无法看到宿主机或其他容器的进程,需在宿主机排查。

参考来源

  • iotop Project Page, GitHub Repository, https://github.com/ionutbalosin/iotop
  • Linux Man Pages, iotop(8), https://man7.org/linux/man-pages/man8/iotop.8.html

原文链接:https://www.zjcp.cc/ask/10868.html

http://www.jsqmd.com/news/799429/

相关文章:

  • 智能工厂设备联网新思路:用这款433 Mesh模块,手把手搭建抗干扰的无线数据采集网络
  • YouTube 转 MP3 工具里,为什么预览要放在下载前
  • 逻辑表达式与真值表转换
  • 为什么92%的SaaS团队在3个月内切换了语音服务商?——ElevenLabs与PlayAI在WebRTC集成、WebAssembly兼容性及低功耗端侧部署的实战踩坑全记录
  • 工控HMI界面设计:从原则到实践的效率革命
  • Neovim涂抹光标插件:提升编码体验的动态轨迹设计
  • 避坑指南:在STM32上实现Modbus RTU主机,这些时序和中断处理的细节你注意了吗?
  • AUTOSAR Wdg模块的两种“狗”:片内看门狗与SPI外挂看门狗配置异同点解析
  • 从DataOperation接口到QuickSort实现:探究适配器模式在算法整合中的应用
  • 实测推荐!2025年在线降重工具终极指南,6款平台横向对比帮你选出最优方案
  • mysql如何提升临时表的处理性能_优化tmp_table_size与内存设置
  • New-API数据导出功能:轻松管理AI模型使用记录与账单数据
  • 基于KMM与Compose Multiplatform的跨平台聊天机器人SDK集成指南
  • 自动驾驶核心技术解析:从ODD、OEDR到商业化落地路径
  • Google Maps路线响应延迟超800ms?Gemini边缘推理加速方案上线即降为112ms(附可复用TensorRT优化脚本)
  • 新手避坑指南:大疆F450机架+Pixhawk飞控组装,从焊接电调到调参的完整流程
  • 告别驱动开发:手把手教你用himm工具在用户空间玩转Hi3516的GPIO
  • 终极指南:FanControl如何解决Windows风扇控制难题,让你的电脑告别噪音与高温
  • 2026最权威的五大AI学术方案解析与推荐
  • 避开Halcon傅里叶滤波的坑:你的‘dc_center’参数真的设对了吗?
  • ARMv8-M架构与Cortex-M33安全特性详解
  • 硬件开发中云边端架构的平衡之道:从实时性到可靠性的工程实践
  • Google Calendar智能安排深度拆解(Gemini原生集成技术白皮书级解析)
  • 别再只盯着密钥了!深入ESP32 eFuse,看懂flash加密背后的硬件安全逻辑
  • Python入门之基础语法详解
  • Armv8-R AArch64架构TLB维护指令与内存屏障详解
  • PostgreSQL数据清洗实战:用CAST和CASE表达式把混乱的‘A/B/C/1/2/3’评分表统一成数字
  • 手把手教你用Gstreamer和V4L2在Zynq MPSoC上搭建视频流Pipeline(HDMI IN to DP OUT)
  • 网络空间安全:第五空间的“守护者”,这个专业为什么越来越“香“?
  • 路线图:AI 编程新范式与框架生态