Можно ли заставить виртуальную машину использовать пространство подкачки (файл подкачки) в качестве памяти при перерасходе памяти?

Можно ли заставить виртуальную машину использовать пространство подкачки (файл подкачки) в качестве памяти при перерасходе памяти?

Я провожу эксперименты с VM и KVM. Я пытаюсь осознать факт перегрузки и пространства подкачки. Сначала позвольте мне показать настройку системы и сопутствующую конфигурацию, которую я сделал для этого эксперимента.

Моя хост-компьютерная система имеет:

  1. Память (DRAM): 16 ГБ
  2. swapspace (раздел подкачки): 32 ГБ
  3. SSD-накопитель: 512 ГБ

и моя виртуальная машина имеет:

  1. Память: 4 ГБ
  2. swapspace (раздел подкачки): 8 ГБ
  3. Емкость виртуального диска: 20 ГБ

Если я ограничу ресурс памяти виртуальной машины с 4 ГБ до 1 ГБ с помощью интерфейса cgroup. В этой ситуациичрезмерная приверженностьпроисходит. Тогда я попытался решить это с помощьюwap-пространствои провереноvmstatесли бы это сработало или нет. Похоже, что он не использует swap-пространство как память.

Почему моя виртуальная машина не использовала пространство подкачки в ситуации перегрузки?

решение1

Я думаю, вы упускаете из виду значение слова «чрезмерная приверженность».

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

Основная концепция заключается в том, что большинство программ выделяют больше памяти, чем они фактически используют. Например, они могут выделить 32 КБ ОЗУ для чтения файла размером всего 57 байт. Они считывают его и фактически используют для этого одну страницу памяти. Но все еще было выделено 32 КБ. Обратите внимание, что этот пример из 90-х, а сегодня выделение больше, а файл больше, но суть в том, что дополнительная память по-прежнему является обязательством, которое никогда не будет собрано.

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

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

Если приложения на вашем сервере, которые вы ограничили до 1 ГБ, на самом деле попытаются получить доступ к полному объему страниц в ГБ, они будут использовать своп в 8 ГБ, который вы настроили для использования. Но он не использует его для перерасхода. Технически он не использует перерасход, пока не выделит больше 9 ГБ виртуальной памяти, которые у него фактически есть.

Тем не менее, это Linux, и мои воспоминания о попытках выжать из Linux максимум памяти без включения избыточного выделения памяти таковы, что он, как правило, терпит неудачу немного раньше — он оставляет некоторый резерв для разных вещей, таких как крошечный объем файлового кэша и т. д. Этот опыт был более десяти лет назад, но я не вижу особой причины, чтобы это изменилось; важно иметь память для возможности выполнять файловый ввод-вывод.

Связанный контент