我有一个在 Linux (RHEL 5.5) 上运行的 http 代理,在收到来自客户端的 [SYN] 数据包后,它间歇性地不回复 [SYN,ACK] 数据包。此问题可以通过重新启动代理来恢复。我针对代理进程运行了 gstack,但是每个线程的堆栈没有表明任何问题(挂起)。在此问题期间,只有不到 100 个连接处于“SYN_RECV”状态。
有任何想法吗?对于这样的问题,我应该从哪里开始调试呢?
任何建议将不胜感激。
答案1
缺少SYN、ACK通常表明服务器软件没有accept
连接。这可能是由于多种原因造成的,很可能是某种资源耗尽。您可以尝试strace
服务器进程查看它是否在accept
系统调用中,或者等效地在文件描述符中对服务器套接字执行一些select
操作以供选择。poll
答案2
看起来像是防火墙问题。如果 TCP 连接收到第一个 SYN + ACK 响应,则很可能您的数据包没有发送到代理服务器。
检查服务器端和客户端。