
CentOS 6を実行している仮想マシンがあります。このLinuxボックスでは、4つのカールダウンロードを同時に実行しています。
場合によっては、カールのダウンロードの1つが中断されます。ps
カールプロセスがまだ存在することを示します。そして、netstat
接続されたRECV_Qが非常に長いことを示しています。
tcp 878104 0 10.161.238.20:46130 10.162.220.12:80 ESTABLISHED
バージョンcurl
7.38.0。
どんなアイデアがありますか?なぜcurl
停止しますか? TCPバッファを増やすと役に立ちますか?
答え1
大きな静的受信キューは、ソケットからデータが受信されたがカールがデータを読み取っていないことを示します。
TCPバッファを増やしても役に立ちません。
これは病的なケースです。 HTTP要求の場合、カールは要求(またはチャンクされている場合は要求)を送信し、応答を読み取るように設計されています。応答を読み取れなかった場合は、一時停止中または別の操作を実行しています。
たとえば、標準出力に応答を書き込むことがパイプ全体であるか、信頼できないネットワークファイルシステムのファイルに書き込むなどの理由でブロックされる可能性があります。
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)を試してみてください。