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ハンドラーを使用したいと思います。
アイデアをありがとう。