以下の更新:
別のデータセンターのDebian仮想マシンで、無関係なスクリプトで同様の問題が発生しました。
これは、説明されている問題 here のように疑わしく見えます(そして、その質問をしている人のように、サーバーの前にプロキシが設定されていません).
以下の説明との主な違いは、ハングしたプロセスにアタッチすると、recvfrom
ではなくread
への呼び出しが表示されることです。
$ strace -p 17527
Process 17527 attached - interrupt to quit
recvfrom(3,
ただし、Pythonはプロキシされているという印象を受けていません。
>>> import os; print os.getenv("HTTP_PROXY"), os.getenv("http_proxy")
None, None
だから私はまだ困惑しています。残念ながら、リンクされた質問にも最終的な回答はありません。
(私は この質問 が関連しているかどうかも疑問に思っていますが、S3がConnection: close
ヘッダーを尊重できない可能性は低いと思われます。)
いくつかのDebian(Wheezy、x86_64)サーバーがあり、すべて次の動作を示しています。
すべてのサーバーには、とりわけS3からデータをプルするcronジョブのセットがあります。これらは通常は正常に実行されますが、時折ps aux
は、数時間または数日前に開始されたジョブの一部がまだ実行中であり、正常に終了していないことを明らかにします。
strace -p <pid>
でそれらを検査すると、すべての場合で、プロセスは読み取りコマンドでハングします。たとえば、今チェックしたプロセスの出力は次のとおりです。
$ strace -p 12089
Process 12089 attached - interrupt to quit
read(5,
開いているファイル記述子を確認すると、次のようになります。
$ Sudo lsof -i | grep 12089
python 12089 user 5u IPv4 809917771 0t0 TCP my.server.net:35427->185-201.Amazon.com:https (ESTABLISHED)
最初はこれがPythonスクリプトでの読み取りタイムアウトの設定の不足によるものだと思っていましたが、いくつかの理由により、そうではないようです:
socket.setdefaulttimeout
を使用して60秒のタイムアウト-これはPython 2.7、ただし、コードベースは2.5互換でなければなりません)は昨日からハングしています。svn up --non-interactive
プロセスを実行しています( subprocess.Popen
、それだけの価値があります)。そのSVNプロセスの状況は似ています-
PythonはSVNを待っています:
$ strace -p 28034
Process 28034 attached - interrupt to quit
wait4(28127,
そしてSVNはread
呼び出しが完了するのを待っています:
$ strace -p 28127
Process 28127 attached - interrupt to quit
read(6,
そして、その読み取りは別の外部ホストを指しています:
$ Sudo lsof -i | grep 28127
svn 28127 user 3u IPv4 701186417 0t0 TCP my.server.net:49299->sparrow.telecommunity.com:svn (ESTABLISHED)
svn 28127 user 6u IPv4 701186439 0t0 TCP my.server.net:49309->sparrow.telecommunity.com:svn (ESTABLISHED)
(更新されているディレクトリでsvn:externals
プロパティがez_setup svn://svn.eby-sarna.com/svnroot/ez_setup
に設定されているようです。Webサイトに基づいて、これはtelecommunity.comにリダイレクトしていると思います)
その他の関連する可能性のあるポイント:
svn:externals
の意味するところが何であるかを完全に確信していません。これは私の時間の前に設定されました。ifconfig
によるドロップされたパケットはありません。これはネットワーク構成を示していると思います問題ですが、どこから始めればよいかわかりません。だから私の質問は:
read
の呼び出しを処理する方法について根本的に異なるものはありますか?これをシステムレベルで修正できますか、それとも個々のプロセスで問題が発生していますか?
プロトコルレベルで何が起こっているのか不明であるため、言うのは困難です。基本的にread(2)
は無期限にブロックします:-
さて、もう一方の端がデータを送信する前に最初にあなたからの応答を期待している、またはもう一方の端からの以前の応答がSVNが何かをすることを期待しているなど、プロセスに何か問題がある可能性がありますelse =追加のデータを要求する前。たとえば、クライアントにいくつかの情報を再送信させるエラー応答が返されたとします。
このデータの送信者が何を期待しているのかを判断する必要がある情報からは不可能であるため、これを適切に修正することはできません。ただし、問題を回避して報告する方法はいくつかあります。
wait
を使用するのではなく、wait
を実行して、親プロセスでアラームを構成します。これで、プロセスが一定期間内に完了しなかった場合、プロセスを強制終了して、これが発生したことを報告できます。これを行う簡単な方法は、timeout
コマンドを呼び出すようにsubprocess.Popenを変更することです。socket
システムコールをオーバーライドし、レシーバーにもタイムアウトを追加します。どちらも簡単ではありません。これにより、svn
が予期しない動作をする可能性があります。OS XとLinuxが読み取り呼び出しを処理する方法について根本的に異なるものはありますか?
私はこれに対する答えはわかりませんが、両方が正反対に正しく動作している場合、それらは両方とも同じように動作するはずです。データを送信する準備がまだ整っていないソケットから読み取ろうとすると、ストリームを無期限にブロックすることが予想される動作です。
全体的に見て、svn
コマンドが特定の時間内に完了することを期待するのが最善の攻撃です。それが殺さない場合、あなたが殺したと報告します。
私は上記の問題を理解したと思いますが、ほとんどの謎はサーバーで何が起こっているのかについての私の誤解から生じています。
次の基本的な問題がありました:
何が起こっているのかを説明するために、ここではこの回答は残しておきますが、実際に起こりうる問題が何であったかについて彼が正しかったので、マシューの質問を受け入れます。