2016-12-07 3 views
0

Хорошо, поэтому я изучаю, что кажется утечкой FD.Непредсказуемая утечка дескриптора файла

Это приложение Linux CppCms, написанное на C++ 11, я тестирую его с помощью инструментов, которые отправляют около 250 запросов/секунд.

Тесты выполнены в течение 30 минут, а иногда я получаю сообщение lighttpd (server.c.1446) [note] sockets disabled, out-of-fds.

Я начал исследовать FDS с помощью watch "sudo ls /proc/<lighttpd>/fd/ | wc -l; echo /;sudo ls /proc/<myApp>/fd/ | wc -l;echo /; sysctl fs.file-nr"

Результаты кажется, говорят, что все нормально, пока это не так. FDs являются стабильными (50 - 100) и случайным образом поднимаются до maxtfd-номера lighttpd. Если мое заявление было вовлечено, я думаю, что это произошло раньше (не после 200000 успешных запросов)

Я использовал Valgrind, чтобы попытаться увидеть что-нибудь, и я нашел это:

==5647== Open AF_UNIX socket 6: <unknown> 
==5647== at 0x8E379EA: socketpair (syscall-template.S:84) 
==5647== by 0x97F8001: booster::aio::socket_pair(booster::aio::stream_socket&, booster::aio::stream_socket&) (stream_socket.cpp:570) 
==5647== by 0x7312766: cppcms::service::setup_exit_handling() (service.cpp:378) 
==5647== by 0x73135C7: cppcms::service::run() (service.cpp:572) 
==5647== by 0x43F56E: MainMngr::runServer() (mainmngr.cpp:46) 
==5647== by 0x443A95: main (main.cpp:22) 
==5647== 
==5647== Open AF_UNIX socket 5: <unknown> 
==5647== at 0x8E379EA: socketpair (syscall-template.S:84) 
==5647== by 0x97F8001: booster::aio::socket_pair(booster::aio::stream_socket&, booster::aio::stream_socket&) (stream_socket.cpp:570) 
==5647== by 0x7312766: cppcms::service::setup_exit_handling() (service.cpp:378) 
==5647== by 0x73135C7: cppcms::service::run() (service.cpp:572) 
==5647== by 0x43F56E: MainMngr::runServer() (mainmngr.cpp:46) 
==5647== by 0x443A95: main (main.cpp:22) 

Я m не в состоянии сказать, является ли это реальной утечкой дескриптора файла, но это так.

Есть ли в моем коде проблема? У CppCms есть проблемы? Вы когда-нибудь сталкивались с такой проблемой? У вас есть какие-либо подсказки для определения того, кто увеличивает размер дескриптора файла от 100 до 8000?

+0

вы можете показать нам свой код –

+0

Это довольно большой проект, и я не думаю, что это важно для того, чтобы поставить его неотъемлемую часть. Я могу объяснить это. Мой главный экземпляр менеджера, у менеджера есть приложение cppcms :: в качестве члена, а вызов runserver mthod вызывает cppcms :: application :: run. Я использую aplication_pool для монтирования класса, который связывает URL-адреса cppcms с каждым сервисом. Код работает в большинстве случаев, он иногда не срабатывает при перегрузке. – MokaT

+0

Если это действительно cppcms, вам, к сожалению, придется попробовать и изолировать проблему в небольшом примере, чтобы мы могли посмотреть на нее, текущей информации недостаточно, и я сам не сталкивался с такой проблемой (но я буду обязательно обновите, если я когда-либо сделаю). – ZN13

ответ

1

Извините. Существует регрессия в lighttpd 1.4.43 с mod_cgi и CGI POST запросов. Описание проблемы и исправления доступно в https://redmine.lighttpd.net/issues/2771

+0

Я не в 1.4.43, поэтому моя проблема в другом месте, но я действительно думаю, что ваш ответ поможет кому-то. Спасибо, что поделился. – MokaT

+0

Какую версию lighttpd вы используете? Некоторые исторические проблемы с ресурсами mod_fastcgi были рассмотрены в lighttpd 1.4.40 и более поздних версиях. – gstrauss