现象
长时间空闲的php进程,请求grpc接口阻塞25秒,返回{"metadata":[],"code":14,"details":"OS Error"}};重试成功
排查分析
- 只有长时间没有请求的php进程才会复现(fpm重启马上就恢复,隔了一段时间又会出现)
- 服务端k8s日志未发现超过10秒的请求
- 尝试添加参数timeout:2秒,请求仍阻塞
- 搜索查到issue:# gRPC channels blocking indefinitely and not respecting deadlines on network disconnect
结论方案
官方文档推荐设置TCP User Timeout,但是php不支持(go支持)
目前将tcp链接作为短链使用了(用完close掉);影响:增加了1ms以内的tcp链接开销