Я использую 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)
Заранее спасибо !
Если вы могли бы создать и опубликовать минимальный репроектор, это было бы полезно; если мы не можем воспроизвести в нашей собственной среде, любые предложения - это догадки. – 2008-10-23 00:42:11