在 http 下载期间,curl 挂起

在 http 下载期间,curl 挂起

我有一个运行 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 

版本curl7.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

您可以尝试运行curlstrace/或尝试使用最新版本curl(版本 7.50.3)。

相关内容