API返回延迟,FPM重启后恢复之后又重现 问题解决方案 (2)

通过以上信息,在 06:55:13后,确实有超过3秒的时间,是 fd=6 导致的, 那 fd=6 是什么
可通过 lsof -p pid 的方式查看
但 进程id 12405 退出了
就是说,由于FPM的动态启动进程的配置,一个进程退出后,会重新生成进程,已达到配置的进程数
所以 一边打印调试信息,一边输出 工作pid的 文件信息

lsof -p 12408
php-fpm 12408 apache 5u IPv4 1203792101 0t0 TCP localhost:cslistener->localhost:22384 (ESTABLISHED)
php-fpm 12408 apache 6u IPv4 1203794606 0t0 TCP xx.com:28866->ip-10-66-100-169.ec2.internal:9411 (SYN_SENT)

此时,原因终于找到了,在每次结束后,又请求了某个ip 9411端口的服务
可以看到tcp状态是 SYN_SENT,虽然已发出连接请求,但对应没回应,并不是ESTABLISHED状态
说明是对应请求机器的问题

于是去查看此ip对应机器,原来确实有此机器,但不知什么时候起,此机器已下架了
导致了这个问题,此刻想到了为什么突然之间接口就有延迟了

问题修复

既然确认了是连接了某个服务导致的问题,对应的php配置文件应该有配置
于是 找到 所有模块配置文件ini路径,搜索ip
发现是 其 molten 扩展配置

molten 扩展是一个全链路追踪的工具
molten追踪php核心调用库运行时信息并且按照zipkin/optracing格式输出信息。
可以追踪curl,pdo,mysqli,redis,mongodb,memcached 这么多的运行信息。

去掉此扩展加载,重启FPM后,接口响应正常

总结

问题出现的时候,最直观的方式应该是日志,通过查看日志,可以解决大部分问题

当日志解决不了的问题,如何调试,就成了问题解决的关键
strace ltrace 以及 gdb 调试

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzwdy.html