Назад | Перейти на главную страницу

«Приятно» для управления памятью

Прежде чем задать вопрос, я дам вам небольшую предысторию: у меня есть веб-сайт на VPS. VPS itselmf запускает веб-сервер apache, код PHP, который создает страницы с доступом к базе данных SQLite, и выполняет некоторые фоновые задачи, запускаемые заданиями cron.

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

С точки зрения производительности, скорость отклика веб-сайта является приоритетом, но фоновые задачи не зависят от времени, нет никаких проблем, если их нужно отключить, замедлить, ... Учитывая, что у меня не так много посещений (около 4000 просмотров страниц в день, большинство из них кешируются), я могу позволить себе запускать их с низким приоритетом, и они все равно выполняют свою работу. Что касается ЦП, я запускаю apache с «приятностью», равной 0 (по умолчанию), а фоновые задачи имеют «удобство» от 10 до 18. И все в порядке.

Память - это проблема, потому что некоторые из этих задач требуют большого объема памяти. Некоторые из них действительно выходят из строя, потому что не хватает памяти, когда она им нужна. Обычно происходит следующее:

  1. Запущена задача 1, потребляющая много памяти
  2. Пользователи посещают сайт => Задача 1 откладывается (у меня с этим нет проблем)
  3. Задача 1 возобновляется
  4. Запущена задача 2, потребляющая много памяти. Из-за задержек задание 1 не выполнено
  5. Пользователи посещают сайт => обе задачи откладываются (все еще нет проблем)
  6. Задача 1 возобновляется и требует больше памяти => Не осталось памяти и Задача 1 вылетает
  7. Задание 2 завершено
  8. Пользователь заходит на сайт
  9. ...

VPS работает в системе с 1 Гб оперативной памяти, и в настоящее время не определен SWAP. Я думаю, что добавление места под SWAP (бесплатно, так как это мне не стоит дороже) могло бы стать хорошим решением моей проблемы. В ходе события, описанного выше, часть памяти, используемой фоновыми задачами, может быть заменена местами, что снижает производительность этих задач, но опять же, у меня нет проблем с этим.

Чего я бы хотел избежать, так это подкачки памяти apache, потому что это снизит скорость отклика веб-сайта для конечного пользователя. Точно так же, как я указал "хорошо", что apache более важен, чем задачи backgroudn. Если вы видите другое решение моей проблемы, вы можете что-нибудь предложить. Я также улучшаю фоновые задачи, чтобы уменьшить их объем памяти, но это требует времени.

Для этого вы можете использовать контрольные группы. Он позволяет вам устанавливать ограничения для памяти и памяти + своп, так что вы можете принудительно переключать процессы в свопинг.

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

http://www.kernel.org/doc/Documentation/cgroups/memory.txt