关于进程非busy状态下的响应超时的问题

小星

我的场景是这样的,使用workerman的http协议监听8088端口实现一个API接口,然后使用nginx反向代理转发到8088端口,但是nginx总是大多数情况下或响应超时。直接访问8088端口也会超时,但是业务逻辑的耗时应该是很短的,在传统非常驻内存的框架里这段代码的响应时间几乎是2毫秒,有人遇到过这类情况吗 或者该从那里着手分析原因呢

我的nginx配置

#PROXY-START/
location  ~* \.(php|jsp|cgi|asp|aspx)$
{
    proxy_pass http://127.0.0.1:8088;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
}
location /Service
{
    proxy_pass http://127.0.0.1:8088;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;

    add_header X-Cache $upstream_cache_status;
    #Set Nginx Cache

        add_header Cache-Control no-cache;
    expires 12h;
}
#PROXY-END/
1743 2 0
2个回答

walkor

如果业务没有调用 $connection->send(),浏览器得不到数据就会一直等待,直到超时

  • 小星 2020-08-21

    好的 我查一下看看 谢谢你 这一点没有想到

  • 小星 2020-08-21

    我尝试跟踪系统调用发现
    12:45:26.318928 select(4, [3], [], [], {tv_sec=100, tv_usec=0}) = 0 (Timeout)
    12:47:06.418908 select(4, [3], [], [], {tv_sec=100, tv_usec=0}) = 0 (Timeout)
    12:48:46.518309 select(4, [3], [], [], {tv_sec=100, tv_usec=0}) = 0 (Timeout)
    12:50:26.615896 select(4, [3], [], [], {tv_sec=100, tv_usec=0}
    重启后第一次请求响应时间只用啦3.8ms,然后一直阻塞在这个地方,再次请求就会大概率出现请求超时,而且没有看到系统调用

  • walkor 2020-08-21

    进程空闲的时候会调用select,是正常的。

  • 小星 2020-08-21

    我觉得可能是8088端口的问题 换了一个端口正常啦 可能是nginx的问题

小星

lsof端口号的结果
lsof -i:8088
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 6560 root 3u IPv4 220473 0t0 TCP :radan-http (LISTEN)
php 6561 root 3u IPv4 220473 0t0 TCP
:radan-http (LISTEN)
nginx 16453 www 12u IPv4 727211 0t0 TCP localhost:56158->localhost:radan-http (ESTABLISHED)
nginx 16453 www 14u IPv4 727270 0t0 TCP localhost:56162->localhost:radan-http (ESTABLISHED)
php 16839 root 3u IPv4 720711 0t0 TCP *:radan-http (LISTEN)

  • 暂无评论
年代过于久远,无法发表回答
🔝