讲师中心 微信公众号
AI工具推荐 视频效率加速

怎么排查由于DNS解析过慢导致Workerman整个进程被阻塞的问题?

云强同学_5131

云强同学_5131

发布时间:2026-05-21 23:48:26

|

218人浏览过

|

来源于php中文网

原创

Workerman进程卡在gethostbyname或dns_get_record调用上,因其默认使用阻塞式DNS解析,导致整个Worker停在建连前的DNS阶段,无法处理新请求。

怎么排查由于dns解析过慢导致workerman整个进程被阻塞的问题?

Workerman 进程卡在 gethostbyname 或 dns_get_record 调用上

Workerman 默认使用 PHP 原生的阻塞式 DNS 函数(如 gethostbyname、stream_context_create 中的 resolve_timeout 未设或设得过大),一旦下游服务域名(比如 MySQL、Redis、HTTP 客户端请求的 API 域名)解析慢,整个 Worker 进程就会停在那,无法处理新连接或已建立连接的数据。这不是 Workerman 自身 bug,而是 PHP 运行时行为。

典型表现是:php your_start_file.php status 显示某个 Worker 的 connections 长期不变化、total_request 停滞、mem_usage 缓慢上涨,且 recv_fail 或 send_fail 开始上升——说明它卡在建连前的 DNS 阶段,没机会发包。

  • 检查所有外部依赖是否用了域名:MySQL 主机填的是 db.internal 而非 IP;Redis 连接地址是 cache.company.local:6379;HTTP 客户端调用 https://api.v1.company.com
  • 确认这些域名是否被硬编码在配置文件、Worker 启动逻辑、或连接池初始化代码里(比如 new Redis() 构造时传入域名)
  • 临时把关键依赖改成 IP 地址测试:若改完后 status 恢复活跃、connections 正常波动,基本可锁定是 DNS 问题

用 strace 或 lsof 直接观察 Worker 进程在等什么

不要只看 Workerman 状态输出,要进系统层确认进程到底卡在哪。对一个疑似卡住的 Worker PID(从 status 输出中拿到 pid 字段)执行:

Adblock Dns
Adblock Dns

在你的机器上运行DNS服务器,使用Pi-hole黑名单阻止189,000+个广告、追踪器和恶意软件域名,实现全网拦截。

下载
strace -p <PID> -e trace=connect,sendto,recvfrom,getaddrinfo,gethostbyname -s 256

如果看到反复出现 getaddrinfo("db.internal", ...) 后长时间无返回,或 connect 调用一直失败并重试,就是 DNS 解析阻塞了后续流程。

  • getaddrinfo 是现代 PHP(7.4+)默认使用的函数,比 gethostbyname 更通用,但也更可能因 DNSSEC 或递归超时卡住
  • 若 strace 显示大量 connect(…, AF_INET, …) 失败且错误码是 EINPROGRESS 后无进展,说明 DNS 返回了 IP,但 TCP 层连不上——这不属于 DNS 问题,需另查网络策略或目标端口
  • 用 lsof -p <pid> | grep -i "dns\|53"</pid> 可快速判断该进程是否正在向 DNS 服务器(如 114.114.114.114:53)发 UDP 包且未收响应

Workerman 启动前预热 DNS 缓存,或强制跳过运行时解析

Workerman 不提供内置 DNS 缓存机制,也不能像 Node.js 那样用 dns.lookup + dns.resolve 分离同步/异步。所以最稳妥的方式是在 Worker 初始化阶段就完成解析,并复用结果。

  • 在 Worker::onWorkerStart 回调里,对所有依赖域名调用一次 gethostbyname 或 dns_get_record,把结果存到全局变量或连接池配置中;后续创建连接时直接用 IP
  • MySQL 连接可改用 mysqli 或 PDO 的 PDO::ATTR_TIMEOUT + mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 1),但注意:PHP 的 connect timeout **不包含 DNS 解析时间**,它只控制 TCP 握手阶段
  • 若必须用域名且无法预热(比如动态路由场景),考虑用 c-ares 扩展 + 异步 DNS 封装,但需自行集成,Workerman 不原生支持

容器/K8s 环境下 CoreDNS 或宿主机 DNS 配置失效

Workerman 部署在 Kubernetes 或 Docker 中时,/etc/resolv.conf 往往指向 10.96.0.10(CoreDNS ClusterIP),但若 coredns Pod 异常、NetworkPolicy 拦截了 UDP 53、或 VPC 安全组丢弃了 DNS 流量,所有 Worker 都会集体卡住。

  • 进容器执行 nslookup db.internal 10.96.0.10,看是否超时;再试 nslookup db.internal 8.8.8.8,对比是否仅内部 DNS 失效
  • 检查 kubectl get pods -n kube-system -l k8s-app=kube-dns 是否全部 Running;kubectl logs -n kube-system <coredns-pod></coredns-pod> 是否有 REFUSED 或 timeout 日志
  • 确认 Pod 的 dnsPolicy 是 ClusterFirst(默认),而不是 Default 或 None;后者会导致 DNS 查询直接走宿主机,而宿主机可能没配好
真实排查中,最容易被忽略的是:**Workerman 的子进程继承了父进程启动时的 DNS 环境,但父进程启动后,/etc/resolv.conf 或本地缓存可能已变更,而子进程不会自动刷新**。这意味着即使你改了 DNS 配置,也必须重启整个 Workerman 服务,仅 reload 不生效。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

11664

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

6721

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2175

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

4268

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4974

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3911

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5637

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4402

2023.11.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn