Я написал веб-службу RESTful в качестве основы мобильного приложения с использованием PHP и библиотеки Restler. Он работает на моем сервере разработки под управлением Windows Server 2008 R2, PHP 5.3.5, Apache 2.2.17 и MySQL 5.5.8. Просто для смеха я решил протестировать свой сервер разработки и столкнулся с возможной проблемой конфигурации
Если я сбегу ab -k -n 1000 -c 50 http://myproductionserver.com/something/restful
через Windows CLI я обычно останавливаюсь между 300-700 запросами. Ошибка говорит: «apr_socket_recv: существующее соединение было принудительно закрыто удаленным хостом. (730054). Всего выполнено X запросов».
Я решил проверить журналы ошибок Apache. Не полезно. Вот ошибка, которую я вызвал с помощью ab:
[Fri Feb 24 17:23:27 2012] [notice] Parent: child process exited with status 255 -- Restarting.
[Fri Feb 24 17:23:27 2012] [notice] Apache/2.2.17 (Win32) PHP/5.3.5 configured -- resuming normal operations
[Fri Feb 24 17:23:27 2012] [notice] Server built: Oct 18 2010 01:58:12
[Fri Feb 24 17:23:27 2012] [notice] Parent: Created child process 768
[Fri Feb 24 17:23:28 2012] [notice] Disabled use of AcceptEx() WinSock2 API
[Fri Feb 24 17:23:28 2012] [notice] Child 768: Child process is running
[Fri Feb 24 17:23:28 2012] [notice] Child 768: Acquired the start mutex.
[Fri Feb 24 17:23:28 2012] [notice] Child 768: Starting 64 worker threads.
[Fri Feb 24 17:23:28 2012] [notice] Child 768: Listening on port 80.
Поэтому, когда я вернулся домой, я провел тот же тест, используя свой локальный IP-адрес, думая, что это может быть проблема с сетью. Произошло то же самое. Я долго искал, но ответов не так много. Я обнаружил очень похожую проблему, и было решено использовать Win32DisableAcceptEx в файле httpd.conf, заявив, что проблема на самом деле связана с ошибкой с .dll PHP. Я отключил их все, кроме базового MySQLi. Как видно из приведенных выше журналов, никто ничего не сделал.
У кого-нибудь есть идеи? Я серьезно разбиваю сервер с 1000 запросов? Дайте мне знать, если вам понадобится дополнительная информация! Я знаю, что это просто сервер разработки, который сидит дома, но он имитирует мой рабочий сервер. Мне нужно разобраться с этим, прежде чем двигаться дальше. Я ценю помощь!
Вероятно, вам придется посмотреть на MaxClients установка и ServerLimit настройки для вашего экземпляра apache, которые могут быть ниже, чем вы могли ожидать, чтобы убедиться, что это не ограничение apache. Однако беглый взгляд на документы показывает, что значение по умолчанию для обоих - 256, что меньше установленного вами ограничения в 50 подключений.
Действительно ли происходит сбой сервера, т.е. вам нужно перезапустить httpd или он продолжает обслуживать запросы после снятия нагрузки?
Я бы установил отладку на уровне журнала и httpd.conf, попробовал с меньшим количеством подключений и общим n и увеличил тест. Я бы также посмотрел и посмотрел, какие значения для RLimitCPU
RLimitNPROC
RLimitMEM
так как они также являются пределами, при которых apache может начать убивать процессы / потоки / соединения и т. д.