Я запускаю chrooted httpd процесс OpenBSD, и в течение последних нескольких дней я получаю случайные зависания, которые исчезают без какого-либо вмешательства с моей стороны. Сначала я подумал, что это может быть проблема с ресурсами, поскольку SSH зависает в то же время, но оставил на консоли запущенный «верхний», который не показывает ничего необычного (использование памяти низкое, нет высокой нагрузки и т. Д.).
Мне удалось заставить пользователей звонить мне именно тогда, когда это происходит, а не через 20-30 минут, и я заметил в журналах ошибок следующее:
Timeout
^@Timeout
^@Timeout
^@Timeout
Это все, что стоит на кону. Иногда количество таймаутов ^ @ различается, но это все, что есть. Я просмотрел журналы доступа, чтобы узнать, могут ли это делать некоторые из потенциально зависающих процессов, таких как вызовы curl, но я не заметил никакой корреляции.
Сайт, работающий в настраиваемом приложении PHP, у которого до недавнего времени не было никаких проблем. Одновременно с этим не было внесено никаких изменений в код.
Кто-нибудь еще сталкивался с подобной ситуацией или есть какие-то идеи?
[Изменить - 11.06.2009]
Похоже, что-то еще происходит за пределами этого сервера. Отпечатки тайм-аута, кажется, происходят случайно, но я думаю, что то же самое происходит на сетевом уровне, когда соединения зависают.
Спасибо за вклад!
Однажды у нас была аналогичная проблема с SVN. Оказалось, что системный пул энтропии иногда полностью истощался, а затем SVN и пара других вещей (не помню, что) зависали. Это может относиться к SSH, и если PHP использует энтропию, то это может быть также случай с Apache.
Вы можете проверить уровень энтропии в вашем окне OpenBSD с помощью следующей команды:
sysctl kern.random
В результате вы получите довольно много цифр. Они описаны в /usr/include/dev/rndvar.h
:
struct rndstats {
quad_t rnd_total; /* total bits of entropy generated */
quad_t rnd_used; /* strong data bits read so far */
quad_t rnd_reads; /* strong read calls */
quad_t arc4_reads; /* aRC4 data bytes read so far */
quad_t arc4_nstirs; /* arc4 pool stirs */
quad_t arc4_stirs; /* arc4 pool stirs (bits used) */
quad_t rnd_pad[5];
quad_t rnd_waits; /* sleeps for data */
quad_t rnd_enqs; /* enqueue calls */
quad_t rnd_deqs; /* dequeue calls */
quad_t rnd_drops; /* queue-full drops */
quad_t rnd_drople; /* queue low watermark low entropy drops */
quad_t rnd_ed[32]; /* entropy feed distribution */
quad_t rnd_sc[RND_SRC_NUM]; /* add* calls */
quad_t rnd_sb[RND_SRC_NUM]; /* add* bits */
};
Если окажется, что это действительно проблема с энтропией, вы можете рассмотреть возможность использования несильного случайного генератора, например /dev/urandom
для вашего PHP-приложения.