3

私は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)

前もって感謝します!

4

1 に答える 1

4

ソケットへの参照を持つデータを(メモリ内に)保存していると思います。たとえば、リクエストオブジェクトをどこにでも保存すれば、それでうまくいくでしょう。

ソケットが閉じられる最後のチャンスは、ガベージ コレクションのときです。ガベージ コレクションがそれらに到達するのを妨げるようなことをしている場合、そこに問題があります。CherryPy で記述された Hello World プログラムで再現することをお勧めします。そこで再現できない場合は、それがコード内にあることがわかります。ソケットを (直接または別の方法で) 参照できる情報を保持している場所を探します。

于 2008-10-21T19:22:18.693 に答える