我有一个运行 CentOS 6 的虚拟机。在这个 Linux 机器上,我同时运行 4 个curl 下载。
在某些情况下,其中一个curl 下载会挂起。ps
表明curl过程仍然存在。并且netstat
显示连接的RECV_Q很长:
tcp 878104 0 10.161.238.20:46130 10.162.220.12:80 ESTABLISHED
版本curl
7.38.0。
任何想法?为什么curl
挂起?增加 TCP 缓冲区是否有帮助?
答案1
大型静态接收队列表示套接字上已接收到数据,但curl 未读取数据。
增加 TCP 缓冲区没有任何帮助。
这是一个病态的案例。对于 HTTP 请求,curl 旨在发送请求(或者如果分块则可能发送请求)并读取响应。如果它没有读取响应,则说明它要么已暂停,要么正忙于做其他事情。
例如,这可能是因为它将响应写入其标准输出被阻止,例如因为它是一个完整的管道,或者它正在将其写入不可靠的网络文件系统上的文件。
ps -o state,wchan,args -C curl
或者
pgrep -x curl | xargs -IP cat /proc/P/stack
可能会给您一些线索,告诉您curl
正在做什么阻止它读取响应(也/proc/$pid/task/*/stack
适用于多线程应用程序)。
答案2
您可以尝试运行curl
和strace
/或尝试使用最新版本curl
(版本 7.50.3)。