2008-08-21 3 views
15

Я запускаю Apache на Linux в VMWare.sleep() бесшумно hogs CPU

Один из PHP-страниц я запрашивающие делает sleep(), и я считаю, что если я попытаюсь запросить вторую страницу в то время как первая страница sleep()'ing, вторая страница зависнет, ожидая sleep() от первой страницы Конец.

Кто-нибудь еще видел это поведение?

Я знаю, что PHP не многопоточного, но это кажется грубым неправильным обращением процессора.

Редактировать: Я должен был упомянуть, что использование ЦП не всплескивается. То, что я подразумеваю под «зависанием» процессора, заключается в том, что никакая другая страница PHP, похоже, не может использовать процессор, пока страница находится в режиме сна().

+0

Вы когда-нибудь находили решение для этого? У меня такая же проблема. – 2010-05-23 17:26:30

ответ

1

Вы действительно видите, что процессор переходит на 100% или просто нет других страниц? Сколько apache-экземпляров вы запускаете? Все ли они останавливаются при запуске sleep() в потоках?

Функция PHP sleep(), по существу, проходит через незанятый цикл в течение n секунд. Он не освобождает память, но не должен значительно увеличивать нагрузку на процессор.

4

Возможно, это означает, что ваш Apache использует только один дочерний процесс.

Поэтому:

Дочерний процесс 1 обрабатывает запрос (в данном случае спать, но он мог бы делать реальную работу, Apache не может сказать разницу), поэтому, когда новый запрос приходит, он будет придется дождаться завершения первого процесса.

Решение будет состоять в том, чтобы увеличить количество дочерних процессов, разрешенных для создания Apache (MaxClients, если вы используете prefork MPM), просто удалите sleep() из скрипта PHP.

Не зная, что происходит в вашем скрипте, трудно сказать, но вы, вероятно, можете избавиться от сна().

+0

Вы немного приручили понятие со словом «вероятно», но я до сих пор не вижу, как вы можете оправдать ожидая, что сможете удалить биты кода, которые вы никогда не видели, не нарушая ничего? – JoeBloggs 2008-12-17 15:25:51

+3

Прошу прощения, я не сказал более четко. Я не имел в виду, что вы могли бы просто избавиться от сна, и приложение продолжило бы работать. Я имел в виду, что, по всей вероятности, sleep() не существует по уважительной причине, и приложение, вероятно, может быть переписано для работы без сна(). – rix0rrr 2008-12-22 12:51:12

10

Возможно, вызываемая страница открывает сеанс, а затем не фиксирует его, в этом случае см. this answer для решения.

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