Я арендую сервер Gentoo с обычным стеком LAMP (prefork Apache MPM) + suPHP.
Время от времени моему серверу не хватает памяти и он замедляется до обхода (отвечает на эхо-запросы, но войти в систему практически невозможно, а нажатие клавиш, отправленное через SSH, может занять несколько минут, чтобы отобразить ответ, не говоря уже о обработке). В системных журналах тоже много чего оom_killer.
Это то, что я вижу в top
в один из этих моментов:
top - 16:45:05 up 22 days, 8:08, 3 users, load average: 104.26, 103.87, 93.3 Tasks: 393 total, 1 running, 388 sleeping, 0 stopped, 4 zombie Cpu(s): 4.6%us, 9.3%sy, 0.8%ni, 0.0%id, 84.8%wa, 0.0%hi, 0.5%si, 0.0%st Mem: 2042128k total, 1634392k used, 407736k free, 1792k buffers Swap: 0k total, 0k used, 0k free, 27724k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3125 apache 20 0 288m 105m 1368 S 0 5.3 0:01.00 apache2 2886 apache 20 0 285m 102m 1368 S 0 5.1 0:02.44 apache2 3048 apache 20 0 279m 96m 1192 D 0 4.8 0:01.58 apache2 3037 apache 20 0 278m 95m 1076 S 0 4.8 0:02.23 apache2 3014 apache 20 0 278m 94m 1204 D 0 4.8 0:01.81 apache2 2859 apache 20 0 274m 91m 1368 S 0 4.6 0:00.63 apache2 3016 apache 20 0 269m 86m 1368 S 0 4.3 0:01.49 apache2 2887 apache 20 0 269m 86m 1192 D 0 4.3 0:01.06 apache2 2753 apache 20 0 269m 86m 1368 S 0 4.3 0:01.09 apache2 3036 apache 20 0 266m 83m 1372 S 1 4.2 0:01.10 apache2 3006 apache 20 0 266m 83m 1368 S 0 4.2 0:01.98 apache2 3007 apache 20 0 265m 82m 1372 S 0 4.1 0:02.00 apache2 3064 apache 20 0 264m 81m 1368 S 0 4.1 0:00.57 apache2 3045 apache 20 0 263m 80m 1368 S 0 4.1 0:00.60 apache2 2888 apache 20 0 263m 79m 416 S 0 4.0 0:01.09 apache2 2862 apache 20 0 260m 77m 1368 S 1 3.9 0:01.95 apache2 2891 apache 20 0 259m 76m 1332 D 0 3.9 0:01.98 apache2 3046 apache 20 0 258m 75m 1080 S 0 3.8 0:01.20 apache2 2873 apache 20 0 255m 72m 1380 S 0 3.6 0:01.51 apache2 2987 apache 20 0 252m 69m 1368 S 0 3.5 0:01.04 apache2 2666 apache 20 0 250m 67m 1368 S 0 3.4 0:00.72 apache2 2903 apache 20 0 248m 66m 1368 S 0 3.3 0:01.02 apache2 3013 apache 20 0 247m 63m 416 S 0 3.2 0:01.02 apache2
Обратите внимание, что PHP работает в режиме CGI, так что это просто Apache без каких-либо модулей PHP.
Честно говоря, я не понимаю, почему еще это было бы медленным, кроме работы с ОЗУ, но он утверждает, что у него 400 МБ свободной ОЗУ. «84,8% wa» также указывает на то, что система ожидает операций ввода-вывода (подкачки?).
Что я пробовал:
Тонкая настройка параметров MPM:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 50
MaxRequestsPerChild 10
MaxMemFree 1024
А пока я уменьшил MaxClients
до 25, но теперь обработка запросов страниц занимает несколько секунд, и какой-нибудь ребенок с FlashGet теоретически может засорить все процессы Apache и фактически сделать все веб-сайты недоступными: /
Вопросы:
Может ли кто-нибудь предложить некоторые настройки конфигурации Apache, которые могут радикально улучшить мою ситуацию?
Можно ли сказать Linux, чтобы он не менял местами / выгружать sshd, bash и все остальное, что мне нужно для ssh и убивать неконтролируемые процессы?
Если ответ на вышеупомянутый вопрос - «нет», кто-нибудь, пожалуйста, объясните мне, почему в наши дни современные операционные системы имеют такие ужасающие недостатки. Для меня это звучит как эпическая неудача в дизайне ОС :(
Каждый из ваших процессов apache использует около 80 МБ памяти (столбец RES). Это огромно - здесь у меня есть веб-сервер с apache 2.2, используемый для запуска CGI, и каждый процесс использует около 5 МБ. Теперь, если у вас есть 50 процессов apache, каждый из которых использует 80 МБ, вы меняете местами как черт. Как только мы выясним, почему вы потребляете так много памяти, мы, вероятно, решим проблему.
Можете ли вы опубликовать свой файл конфигурации apache?