1

ForkingMixInでPython(2.7)SocketServerを使用しています。それはうまくいきました。

ただし、頻繁に使用する場合(大量のクライアントを迅速に接続/切断する場合)、「サーバー」がスタックし、アイドル状態のCPUをすべて消費することがあります(上部に100%のCPUが表示されます)。プロセスでCLIからのstraceを使用すると、waitpid()syscallの無限のシーケンスが実行されることが示されます。コマンド「ps」によると、この時点では子プロセスはありません。

この問題の後、私のサーバー実装は使用できなくなり、再起動のみが役立ちます:(クライアントは接続できますが、答えはありません。OS側では「バックログ」キューだけが使用されていると思いますが、Pythonコードは接続を受け入れません。

これは、たとえば、いくつかのプライベートHTTP実装を使用して簡単に再現でき、CTRL-R(リロード)を備えたブラウザー(私はchromeを使用)を10秒ほど押し続けます。もちろん、この「残忍な」試みがなくても、「通常の使用法で」問題が発生することはめったになく、何が問題になるのかを理解することすら困難でした。os.fork()を使用したSocketServerやソケット関数などの独自の実装を作成しましたが、この問題はありませんが、「すでに準備ができている」「標準」のソリューションに満足しています。

問題:サーバーを実装する私のスクリプトはこの方法で非常に簡単にDoSできるので、それは良いことではありません。

気付いたのは、SIGCHLD用のsingalハンドラーをインストールしたことです。それを削除すると、問題を再現できないようですが、ゾンビプロセスを確認できます(wait()されていないためだと思います)。signal.SIG_IGNを使用してシグナルハンドラーをインストールしても、この問題が発生します。

誰かが問題になる可能性があり、私がこれをどのように解決できるかを助けることができますか?とにかく、特に長い実行の後で、多くのゾンビプロセスを残すのはあまり良くないので、singalハンドラーを使用したいと思います。

アイデアをありがとう。

4

1 に答える 1

0

おそらく関連している:サーバー側の多くのTIME_WAITのコストはいくらですか?

すべての最大接続がtime_wait状態になっている可能性があります。

  • sysctl net.core.somaxconn最大接続数を確認してください。
  • 他の構成の詳細を確認sysctl net.ipv4してください(例:tw
  • ulimit -n最大オープンファイル記述子(ソケットを含む)を確認します
  • 試すことができます:sysctl net.ipv4.tcp_tw_reuse=1それらのソケットをすばやく再利用します(何をしているのかわからない限り、有効のままにしないでください)。
  • ファイルハンドルのリークを確認します。

[そうではない]ばかげた質問:SocketServerの実装は標準の実装+ ForkingMixInとどのように異なりますか?

ForkingMixInただし、 (フォーク爆弾)を悪用するのは非常に簡単です。eventletライブラリ(http://eventlet.net/doc/index.html)などのグリーンスレッドを使用することをお勧めします。

これはあなたの問題かもしれません。

于 2012-10-11T07:33:53.123 に答える