X

mpm itk ограничить кол-во соединений для клиентов

Столкнулся с проблемой: сервачок с маленьким кол-вом памяти, постоянно зависал. В логах я увидел, что это происходило из-за того, что отведенные 500 мб ОЗУ и 2Гб свапа быстро съедали невиданные процессы (думаю поисковые боты) и сервак падал. Все бы ничего (мне даже не лень его перегружать), но ссылки из Sape начали уходить в Error и доход падал. Надо было решать эту проблему.

Было решено вспомнить как использовать MaxClients директиву конфигурации mpm-ов апача. Но у меня же стоял не prefork, а itk. Поэтому у меня была возможность конфигурировать кол-во клиентов для каждого пользователя отдельно (каждый пользователь у меня это отдельный домен + его поддомены, итого ~ 20 сайтов).

Сделать это можно так:

  • Открываем файл в котором вы храните настройки VirtualHost конфигурации апача для своих сайтов:
    у меня это: /etc/apache2/sites-enabled/site-name.com
  • Если вы itkконфигурировали тут, то у вас должна быть такая секция
    <IfModule mpm_itk_module>
    AssignUserId username usergroup
    </IfModule>
  • В неё добавляем директиву MaxClientsVHostи кол-во процессов
    <IfModule mpm_itk_module>
    AssignUserId username usergroup
    MaxClientsVHost 25
    </IfModule>
  • Вот и всё, теперь осталось перезагрузить апач
    #/etc/init.d/apache2 restart

Теперь расскажу как я выбирал оптимальное кол-во запросов. Первое что надо знать, это сколько занимает процесс апача под нагрузкой (т.е. открытие страниц или выполнение скрипта) памяти. Чтобы это узнать есть несколько способов:

Способ 1

  • Используем команду top или htop (htop удобней, но её надо ставить отдельно)
  • Заходим на сайт и обновляем страницу много раз, при этом смотрим в окно где запущен top/htop
  • Должны появляться процессы apache, вот вам и надо запомнить сколько эти процессы занимают % памяти.
  • Например вы видите что в среднем 2%
  • Теперь считаете сколько это: 2% * 512 мб (кол-во свободного озу) / 100. Получается около 10 мб.

Способ 2

  • Запускаете постоянное обновление страницы (например можно в FireFox поставить обновлять вкладку, каждые 2 секунды). Я же воспользовался сервисом Load Impact о котором расскажу ниже.
  • И выполняете такой скрипт:
    ps -eo size,pid,user,command | awk '{ hr=$1/1024 ; printf("%13.6f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | sort
  • И видите какой процесс и сколько ест памяти, в моем случае каждый процесс апач ел 14 мб

Тут надо конечно выяснить, это на все ли потоки столько ест или на один. Т.к. в моем случае, было запущено 13 потоков, то возможно, что в расчет надо брать не 14 мб, а 14/13 ~ 1 мб. Но на данном этапе мне некогда выяснять этот момент, возможно займусь позже. А сейчас я беру в расчет что каждый поток может есть 14 мб, если я завышу своим расчеты в 14 раз и все будет работать, то это даже к лучшему 🙂 Если вы знаете этот вопрос подробнее, напишите в комментах.

Итак, теперь мы знаем что у нас кушается 14 мб на процесс. Соответственно, теперь мы можем посчитать сколько процессов мы можем запустить, до того момента пока уйдем в свап:

512 мб / 14 = 36 процессов.

Теперь по моим расчетам, при мега-нагрузке  на какой-нибудь сайт, я ему отдаю 25 процессов, остальные 11 будут распределены между остальными сайтами, в случае их превышения, память пойдет со свопа. У меня нет на этих сайтах такой посещаемости, и хорошо настроено кеширование, поэтому я особо не боюсь. Но на всякий случай считаем, что пришла тонна людей. Соответственно максимальная нагрузка будет такой:

10 сайтов (MaxClientsVHost 10) = 10*10 = 100 процессов
10 сайтов (MaxClientsVHost 25) = 10*25 = 250 процессов
итого: 350 процессов * 14 мб = 4780 мб

Т.к. со свапом у меня всего 2.5 Гб, то при таком подходе, сервак всего скорее упадет. Тут уже надо оценивать посещаемость и всякие другие параметры отдельно, и решать подходит ли это вам или нет. Но давайте высчитаем оптимальные параметры. Я думаю в моем случае это

10 сайтов (MaxClientsVHost 5) = 10*5 =50 процессов
10 сайтов (MaxClientsVHost 10) = 10*10 = 100 процессов
итого: 150 процессов * 14 мб = 2100 мб

Обратите внимание, что в заметке выше, я уже писал, про то, что не знаю насколько правильно брать цифру 14 в качестве расчетной, возможно, надо поделить на кол-во процессов апача при замере памяти, в таком случае, показатели тут можно задать в 14 раз больше.

Теперь надо проверить. Пока я искал решения своих проблем, я наткнулся на вот такой, сервис: https://loadimpact.com. Он позволяет задать url и система автоматом будет делать запросы, при этом повышая их, и в конце теста выдаст Вам результат. В моем случае, до изменений, мой сервер сдох уже на половине теста. После изменений, сайт который был под нагрузкой, либо ели грузился, либо падал с сообщением о том что сервер занят (Load Impact занял все отведенные потоки), остальные сайты прекрасно работали, память не уходила в своп. Как результат сервер без проблем выдержал повторный тест.

Желаю и Вам, чтобы сервера не падали, а сайты работали долго и без багов принося юзерам удовольствие а вам денюшки 🙂

Категории: Apache Сервера