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

Linux / proc / sys / vm / drop_caches на гостевых виртуальных машинах

Вопрос: Было ли когда-нибудь хорошей идеей отключить кеш страниц внутри гостевых виртуальных машин и вместо этого полагаться на ZFS ARC (и L2ARC на основе SSD) хоста?

Контекст: Я спрашиваю, так как я использую кластер Proxmox, который всегда показывает около 90% использования ОЗУ для всех виртуальных машин, независимо от того, сколько ему действительно нужно. Этого следовало ожидать из-за того, что гостевое ядро ​​использует кеш страниц. Поскольку я слышал много хороших отзывов о ZFS ARC, я подумал, что, возможно, я мог бы больше полагаться на них и уменьшить зависимость от кеша страниц гостей. По сути, ARC будет своего рода общим кешем страниц для всех виртуальных машин.

Сделав это, я получил бы дополнительное преимущество в виде более точной статистики и графиков proxmox, что дало бы мне лучшее представление о том, сколько памяти на самом деле требуется каждой виртуальной машине. Это, в свою очередь, предоставит мне информацию, которая мне нужна, чтобы лучше настроить размеры оперативной памяти каждой виртуальной машины, и позволит мне увеличить размер ARC хоста на ту же величину.

Я на самом деле ничего из этого не пробовал, я думал, что сначала вы, ребята, попробую. Итак, я глуп, что так думаю?

Последующий вопрос: КАК я могу отключить (или ограничить) кеш страницы на виртуальной машине Linux? ОДИН метод - использовать cronjob и регулярно записывать «3» в / proc / sys / vm / drop_caches, например, раз в минуту или что-то в этом роде. Но это кажется хакерским, разве нет лучшего способа?

P.S. Да, я понимаю, что говорю только о кеше чтения, а не о кеше записи, на который влияет количество грязный страниц. Поэтому мне, вероятно, все равно понадобится некоторое количество свободного места в ОЗУ, чтобы учесть это (но это должно быть видно в статистике использования ОЗУ виртуальной машины в Proxmox, поэтому все вышеупомянутое должно по-прежнему применяться).

Я часто (но не всегда, см. Ниже) оптимизирую свои гипервизоры аналогично тому, что вы предлагаете: позволить виртуальным машинам сильно ретранслировать в общий дисковый кеш хоста.

Однако, используя drop_caches подход кажется мне слишком тяжелым, так как он может лишить гостя слишком много кэш-памяти. В то же время я не знаю какого-либо метода ограничения кеширования страниц (кроме настройки вашего приложения для использования прямого ввода-вывода). Итак, ключ к правильному размеру ресурсов RAM вашей виртуальной машины: попробуйте назначить только ту память, которая действительно нужна гостю, плюс 1 или 2 ГБ для некоторой "передышки".

Такое управление памятью имеет несколько важных преимуществ:

  • управляемая хостом, кэш-память может динамически выделяться для гостей в зависимости от их требований к вводу-выводу;
  • благодаря динамическому управлению, когда ваша память рассматривается как настоящий пул ресурсов, вы сокращаете потери ресурсов и повышаете эффективность;
  • при использовании ZFS на вашем хосте вы подключаетесь к очень продвинутому ARC / L2ARC и его устойчивому к мусору поведению

Но есть и недостатки:

  • будучи общим ресурсом, кэш-память вашего хоста может быть уничтожена мошеннической виртуальной машиной (что влияет на другие, более важные виртуальные машины);
  • находятся некоторые переключатели контекста и vmexit/vmenter вдали, пиковая и устойчивая скорость любого кэша на основе хоста будет ниже, чем у коррумпированного кеша на стороне гостя (и это причина, по которой я предлагаю вам избегать повторения drop_caches в гостях);
  • хотя ARC более продвинутый и с гораздо более высокой скоростью попаданий, он медленнее, чем кеш страниц в Linux когда рабочая нагрузка полностью подходит в кеше. Таким образом, для максимальной скорости гостя на гостевых системах, критичных к производительности, вы, вероятно, захотите выделить виртуальной машине достаточно памяти для кеширования страниц.