如何处理 Worker 进程卡死在 D 状态(不可中断睡眠) 时的磁盘 I/O 链路排查

酷墨酱_4119

酷墨酱_4119

2026-05-26

498人浏览

原创

Worker进程卡D状态本质是等待内核完成不可中断磁盘I/O,需通过ps+stack确认阻塞点、iotop定位IO源、dmesg/smartctl检查硬件健康,并临时调worker_processes、禁用同步写缓解,长期优化挂载参数与IO调度。

如何处理 worker 进程卡死在 d 状态(不可中断睡眠) 时的磁盘 i/o 链路排查

Worker 进程卡在 D 状态,本质是它正等待内核完成某次磁盘 I/O 操作,且该等待不可被信号中断。这不是进程崩溃,也不是配置错误,而是底层 I/O 链路出现实质性阻塞。排查必须从内核态出发,跳过 CPU 和内存表象,直击 I/O 路径。

第一步:确认 D 状态是否真由磁盘引起

别一看到 D 就急着调 Nginx 或重启服务。先做快速过滤:

  • 用 ps aux | awk '$8 ~ /^D$/ {print $0}' 列出所有 D 态进程,重点关注 nginx worker、php-fpm、Go 二进制或容器主进程
  • 对每个可疑 PID,执行 cat /proc/PID/stack(需 root)。若栈中出现 blk_mq_do_dispatch_sched、__wait_on_bit、ext4_writepages、nvme_queue_rq 或 __generic_file_read,基本锁定为块设备或文件系统层阻塞
  • 同时运行 iostat -x 1:若 %util 接近 100%、await > 50ms,而 r/s 或 w/s 却很低,说明请求在队列里堆积,不是吞吐高,而是响应慢

第二步:定位真实 I/O 发起者

D 是结果,不是源头。真正拖慢磁盘的是背后那个反复读写、刷盘或同步的进程:

  • 运行 sudo iotop -o -P,按 I/O% 排序,找出当前正在发起实际读写的进程(注意看 IO_RATE 列,不是 CPU%)
  • 常见“隐形推手”包括:logrotate 定时 truncate 大日志、rsync 未限速同步、MySQL 的 innodb_flush_log_at_trx_commit=1 + 高频小事务、PHP 在 /tmp 下高频创建/删除 session 文件
  • 对高 I/O 进程执行 lsof -p PID | grep -E "(REG|DIR)",重点看它是否在反复 open/write 同一个大文件(如 access.log、pg_wal/、/tmp/*.sess)

第三步:检查存储层健康与挂载状态

很多 D 状态持续存在,根本原因是硬件、驱动或远程存储异常:

  • 运行 dmesg -T | tail -50,搜索 timeout、I/O error、ata、nvme、nfs 等关键词
  • 查磁盘健康:smartctl -a /dev/sdX(需安装 smartmontools),关注 Reallocated_Sector_Ct、Pending_Sector 和 UDMA_CRC_Error_Count
  • 若用 NFS/CIFS:mount | grep nfs 看挂载参数;showmount -e server 测试服务端可达性;卡死时可用 umount -f -l /mnt/nfs 懒卸载
  • 若跑在 Docker 中,检查 df -h /var/lib/docker 是否满,再用 ls -la /var/lib/docker/overlay2/*/merged 看是否有权限异常或元数据损坏迹象

第四步:临时缓解与长期规避

目标不是“杀死 D 进程”,而是让 worker 尽快脱离阻塞,恢复服务响应:

  • 立即降低争抢强度:HDD 环境临时将 worker_processes 设为 2~4;SSD 可试 4~6,避免多 worker 同时触发随机寻道
  • 禁用高频同步写:注释掉 Nginx 的 access_log 行,或改用带缓冲的写法:access_log /path/to/access.log buffer=64k flush=5s;PHP 日志改走 syslog,交由 rsyslog 异步刷盘
  • 长期预防:关键挂载点启用 errors=remount-ro(ext4)、NFS 加 soft,timeo=10,retrans=3;I/O 密集任务用 ionice -c2 -n7 降级调度优先级
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

457

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

980

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

3432

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

1116

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

1009

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

534

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

3176

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

5992

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

907

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习