php grpc扩展channel阻塞25s,返回{"metadata":[],"code":14,"details":"OS Error"}}

216 阅读1分钟

现象

长时间空闲的php进程,请求grpc接口阻塞25秒,返回{"metadata":[],"code":14,"details":"OS Error"}};重试成功

排查分析

  1. 只有长时间没有请求的php进程才会复现(fpm重启马上就恢复,隔了一段时间又会出现)
  2. 服务端k8s日志未发现超过10秒的请求
  3. 尝试添加参数timeout:2秒,请求仍阻塞
  4. 搜索查到issue:# gRPC channels blocking indefinitely and not respecting deadlines on network disconnect

结论方案

官方文档推荐设置TCP User Timeout,但是php不支持(go支持)
目前将tcp链接作为短链使用了(用完close掉);影响:增加了1ms以内的tcp链接开销

详见:github.com/grpc/propos…