2008-10-21 6 views
3

Я использую cherrypy как веб-сервер. Это дает хорошие результаты для моего приложения, но с ним очень большая проблема. CherryPy сбой после нескольких часов, заявив, что он не может создать сокет, так как слишком много открытых файлов: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.. 

Я попытался выяснить, что происходит. Мое приложение не открывает какой-либо файл или какой-либо сокет и т. Д. Мой файл открывает только пару berkeley dbs. Я исследовал этот вопрос дальше. Я видел файловые дескрипторы, используемые моим вишневым процессом с id 4536 in/proc/4536/fd/ . Сначала были созданы и очищены новые сокеты, но через час я обнаружил, что у него было около 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

питон 2.3.4

Red Hat Enterprise Linux ES выпуск 4 (Nahant Update 7)

Заранее спасибо !

+1

Если вы могли бы создать и опубликовать минимальный репроектор, это было бы полезно; если мы не можем воспроизвести в нашей собственной среде, любые предложения - это догадки. – 2008-10-23 00:42:11

ответ

4

Я предполагаю, что вы храните (в памяти) часть данных, имеющую ссылку на сокет; если вы храните объекты запроса где угодно, например, это, вероятно, сделает это.

Вероятность того, что розетки будут закрыты, когда они собраны в мусор; если вы делаете что-либо, что помешало бы сборку мусора, то это ваша проблема. Я предлагаю вам попробовать воспроизвести программу Hello World, написанную на CherryPy; если вы не можете воспроизвести там, вы знаете, что это в вашем коде - ищите места, где вы сохраняете информацию, которая могла (прямо или иначе) ссылаться на сокет.

+0

Нет, я не сохраняю никакой информации. На самом деле мой сервер является сервером только для чтения. Нет записи, кроме сокета. Сокеты собираются достаточно хорошо изначально. Эта проблема возникает по мере продвижения времени. – NeoAnderson 2008-10-21 19:43:06

Смежные вопросы