Я планирую арендовать физический сервер и запустить MySQL внутри контейнера LXC на этом сервере. Я хотел бы контролировать максимальное использование памяти для экземпляра MySQL, используя ограничения cgroup:
lxc.cgroup.memory.limit_in_bytes = 8192M
Это будет эффективно контролировать, сколько памяти может использовать контейнер, но top
или free
внутри контейнера по-прежнему будет сообщать об общей памяти для хоста LXC (физического сервера). Я не эксперт в том, как Linux управляет памятью в целом, но предполагаю, что - на физической машине - Linux начнет подкачку, если увидит, что вот-вот достигнет предела физической памяти. Обрабатывает ли Linux «эффективное» ограничение памяти (будь то ограничение cgroup или физическое ограничение) одинаково, независимо от того, работает ли он внутри контейнера или на физическом хосте?
lxc - пространства имен ядра
cgroups - подсистема ядра, которая следит за потреблением ресурсов и лимитами
Контейнерная система внутри lxc не знает ограничений cgroup на ОС хоста. Ядро Linux (на хосте) ограничивает потребление ресурсов cgroup.
lxc и cgroup - две независимые подсистемы ядра. Мы можем использовать cgroup без lxc и lxc без cgroup.
Openvz - имеет набор патчей ядра для правильного отображения ограничений контейнера в контейнере, но они не учитываются в ванильном ядре.
Внутри контейнера нет Linux, так как Linux является ядром, и вы делитесь им с хостом. Ваши приложения (например, бесплатные и лучшие) читают системную информацию из / proc и, таким образом, получают подробную информацию о хосте, поскольку lxc по умолчанию не подделывает ограниченные ресурсы (в отличие, например, от OpenVZ). Это нормально, если ваше приложение не ведет себя по-разному в зависимости от номеров RAM / swap / cpu. Если ваше приложение пытается выделить больше памяти, чем доступно для контейнера, оно будет уничтожено OOM, как и любое другое приложение в неконтейнерной среде.
Если вы хотите увидеть ограниченные ресурсы внутри контейнера, выполните на хосте следующие действия:
apt-get install lxcfs
После этого перезапустите контейнер. LXCFS будет эмулировать несколько файлов в / proc контейнера, и приложения будут правильно видеть ограниченные ресурсы (процессор, оперативная память, свопинг).
Больше информации на домашней странице lxcfs: https://linuxcontainers.org/lxcfs/