Стоит nginx/1.8.0 и httpd 2.2.15 на CentOS 6.7 mpm конфиг следующий:
ServerLimit 500
StartServers 4
MinSpareServers 4
MaxSpareServers 8
MaxClients 500
KeepAlive On
KeepAliveTimeout 5
MaxRequestsPerChild 3000
ListenBacklog 512
В sysctl.conf задействованы следующие опции:
vm.overcommit_ratio = 100
vm.overcommit_memory = 2
Но я не уверен что эти опции влияют на проблему.
После имитации высокой нагрузки либо ддоса, с помощью siege и последующей остановки нагрузки, апач частенько подвисает, strace говорит следующее:
[pid 63565] <... restart_syscall resumed> ) = 0
[pid 63565] clone(child_stack=0, >flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, >child_tidptr=0x7f9421beeab0) = -1 ENOMEM (Cannot allocate >memory)
[pid 63565] write(2, «[Thu Jan 28 12:58:31 2016] [erro»..., 96) >= 96
[pid 63565] rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid 63565] rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
[pid 63565] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 63565] nanosleep({10, 0},
[pid 63565] <... nanosleep resumed> 0x7ffe6a49de20) = 0
[pid 63565] clone(child_stack=0, >flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, >child_tidptr=0x7f9421beeab0) = -1 ENOMEM (Cannot allocate >memory)
[pid 63565] write(2, «[Thu Jan 28 12:58:41 2016] [erro»..., 96) >= 96
[pid 63565] rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid 63565] rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
[pid 63565] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 63565] nanosleep({10, 0},
Бывает что подвисает не на долго, на 1-2 минуты например, а затем просыпается и начинает убивать своих детей и нормально работать, а иногда подвисания бывают и более долгие, например 20 минут (более ждать не мог, рестартанул железку). Но бывает и так что не зависает. Если в момент подвисания апача, попытаться рестартануть апач, то мастер процесс умрет и больше не запуститься потому что все дети остаются висеть в системе. В общем бьюсь уже неделю, не могу понять в чем проблема. Есть идеи?
P.S. Мне вот еще что интересно, даю нагрузку, затем нагрузку останавливаю, при этом в сторону приложения не идет ВООБЩЕ никаких запросов, но strace показывает что апач все еще продолжает обрабатывать в течении какого-то времни какие-то запросы. Думал что это нгинкс ему доотправляет то что наполучал, но если отключить нгинкс в этот момент, то апач все равно обраюатывает какие-то запросы, как-будто из какой то очереди. Пробовал ставить ListenBacklog 1, картина та же