私はcherrypyをWebサーバーとして使用しています。それは私のアプリケーションに良いパフォーマンスを与えますが、それには非常に大きな問題があります。開いているファイルが多すぎるため、ソケットを作成できなかったことを示すcherrypyが数時間後にクラッシュします。
[21/Oct/2008:12:44:25] ENGINE HTTP Server
cherrypy._cpwsgi_server.CPWSGIServer(('0.0.0.0', 8080)) shut down
[21/Oct/2008:12:44:25] ENGINE Stopped thread '_TimeoutMonitor'.
[21/Oct/2008:12:44:25] ENGINE Stopped thread 'Autoreloader'.
[21/Oct/2008:12:44:25] ENGINE Bus STOPPED
[21/Oct/2008:12:44:25] ENGINE Bus EXITING
[21/Oct/2008:12:44:25] ENGINE Bus EXITED
Exception in thread HTTPServer Thread-3:
Traceback (most recent call last):
File "/usr/lib/python2.3/threading.py", line 436, in __bootstrap
self.run()
File "/usr/lib/python2.3/threading.py", line 416, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.3/site-packages/cherrypy/process/servers.py", line 73, in
_start_http_thread
self.httpserver.start()
File "/usr/lib/python2.3/site-packages/cherrypy/wsgiserver/__init__.py", line 1388, in start
self.tick()
File "/usr/lib/python2.3/site-packages/cherrypy/wsgiserver/__init__.py", line 1417, in tick
s, addr = self.socket.accept()
File "/usr/lib/python2.3/socket.py", line 167, in accept
sock, addr = self._sock.accept()
error: (24, 'Too many open files')
[21/Oct/2008:12:44:25] ENGINE Waiting for child threads to terminate..
私は何が起こっているのか理解しようとしました。私のアプリケーションはファイルやソケットなどを開きません。私のファイルはいくつかのバークレーデータベースしか開きません。この問題をさらに調査しました。/ proc / 4536 / fd/にあるid4536のcherrypyプロセスで使用されるファイル記述子を確認しました。最初は新しいソケットが作成され、適切にクリーンアップされましたが、1時間後、約509個のソケットがクリーンアップされていないことがわかりました。すべてのソケットはCLOSE_WAIT状態でした。次のコマンドを使用してこの情報を取得しました。
netstat -ap | grep "4536" | grep CLOSE_WAIT | wc -l
CLOSE_WAIT状態は、リモートクライアントが接続を閉じたことを意味します。なぜcherrypyはソケットを閉じず、ファイル記述子を解放しないのですか?問題を解決するにはどうすればよいですか?
私は以下で遊んでみました:
cherrypy.config.update({'server.socketQueueSize': '10'})
これにより、いつでも開くソケットの数が10に制限されると思いましたが、まったく効果がありませんでした。これは私が設定した唯一の構成であるため、残りの構成はデフォルト値を保持します。
誰かがこれに光を当てることができますか?チェリーピーのバグだと思いますか?どうすれば解決できますか?これらのソケットを自分で閉じる方法はありますか?
以下は私のシステム情報です:
CherryPy-3.1.0
Python 2.3.4
Red Hat Enterprise Linux ESリリース4(Nahant Update 7)
前もって感謝します!