Вопрос или проблема
Я запускаю некоторые поды (Solr и Zookeeper) на AWS EC2.
Хотя k8s по умолчанию не поддерживает своп, я все же включил его, установив –fail-swap-on в значение false, потому что хочу, чтобы моя система могла использовать своп. И потом я заметил странное поведение при использовании свопа, на котором, надеюсь, вы сможете пролить свет 🙂
Согласно документации Docker doc, мы можем ограничить контейнеры Docker в использовании своп-памяти, сделав следующее.
Если –memory-swap установлено в то же значение, что и –memory, и –memory
установлено в положительное целое число, контейнер не будет иметь доступа к свопу.
См. Предотвратить использование свопа контейнером.
С помощью docker inspect
я могу увидеть:
-
MemorySwappiness
установлено в null, так что он просто использует параметры, установленные в ОС.Memory
равноMemorySwap
, так что своп-память не может быть использована.$ sudo docker inspect 30309d07aa95 | grep Mem "Memory": 1073741824, "CpusetMems": "", "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 1073741824, "MemorySwappiness": null,
Однако, после того как я запустил свой контейнер на некоторое время, я вижу, что мой Solr использует много свопа.
$ grep --color VmSwap /proc/9549/status
VmSwap: 261812 kB
в то время как используется около 517820 kB физической памяти.
Кто-нибудь знает, почему это не работает, как описано в документации Docker?
Дополнительная информация
-
ОС: Amazon Linux 2 AMI (HVM), SSD Volume Type – ami-0cbc6aae997c6538a (64-бит x86) / ami-09172771b47695ce2
-
Версия Docker
Клиент:
Версия: 18.06.3-ce
Версия API: 1.38
Версия Go: go1.10.3
Коммит Git: d7080c1
Сборка: Ср Фев 20 02:26:51 2019
ОС/Архитектура: linux/amd64
Экспериментальная: falseСервер:
Движок:
Версия: 18.06.3-ce
Версия API: 1.38 (минимальная версия 1.12)
Версия Go: go1.10.3
Коммит Git: d7080c1
Сборка: Ср Фев 20 02:28:17 2019
ОС/Архитектура: linux/amd64
Экспериментальная: false -
Некоторые системные настройки по памяти
vm.overcommit_kbytes = 0
vm.overcommit_memory = 1
vm.overcommit_ratio = 50
vm.swappiness = 60
vm.vfs_cache_pressure = 100
Поскольку не весь своп создается равным. VmSwap
учитывает вещи, отличные от того, что вы могли бы считать «свопом», включая грязные страницы из отображенных в память файлов — и, если я правильно помню, Solr действительно любит свои mmap’d файлы. /proc/<pid>/smaps
должно дать больше подробностей о том, что именно происходит.
Ответ или решение
После отключения swap-памяти для контейнера Docker вы заметили, что значительное количество swap все же используется. Это может вызывать путаницу, особенно учитывая настройки, которые вы применили для ограничения использования swap. Давайте рассмотрим причины такого поведения более подробно.
Причины использования swap-памяти в вашем случае
-
Настройки Docker и Kubernetes: Вы правильно указали, что при установке
--memory-swap
в то же значение, что и--memory
, контейнер не должен использовать swap-память. Однако важно учитывать, что параметры Docker могут поведать себя иначе в контексте работы других систем, таких как системы управления контейнерами (например, Kubernetes). Несмотря на то что вы установили соответствующие параметры, другие компоненты системы могут по-прежнему использовать swap. -
Системные переменные и настройки ядра: Параметры, такие как
vm.swappiness
, также будут оказывать влияние на использование swap. В вашем случае значениеswappiness
установлено на 60, что указывает системе быть относительно активной при использовании swap. Это поведение может сохраняться даже при установленных ограничениях на уровне контейнера. -
Совместная работа с mmap: Вы упомянули, что используете Solr, который активно работает с memory-mapped файлами (mmap). Данные, загруженные в память с использованием mmap, могут быть помечены как "грязные" (dirty) и, следовательно, могут занимать место в swap. Это объясняет использование swap, даже если вы ограничили его использование на уровне контейнера.
-
Проверка доступных метрик: Чтобы получить более глубокое понимание использования swap, вы можете воспользоваться командой
cat /proc/<pid>/smaps
, которая предоставит детализированное представление о том, сколько памяти и swap используется каждым из сегментов вашего процесса. Это позволит вам увидеть данные, которые могут не учитываться в стандартных показателях использования памяти.
Рекомендации
-
Анализ метрик памяти: Используйте инструмент мониторинга для анализа использования памяти и swap в реальном времени, чтобы лучше понять поведение вашего приложения.
-
Настройка параметров свопирования: Если вы хотите уменьшить использование swap, вы можете провести эксперименты с параметром
vm.swappiness
, уменьшая его значение. Это заставит ядро реже использовать swap в отношении активных процессов. -
Обновление версий: Рассмотрите возможность обновления вашей версии Docker, так как более новые версии могут включать улучшения и исправления, которые могут изменить поведение управления памятью.
-
Тестирование в изолированном окружении: Проведение тестов в контролируемом окружении может помочь вам выяснить, как конкретные настройки влияют на использование памяти и swap.
Заключение
Понимание поведения swap в контексте Docker и Kubernetes требует учета множества факторов. Настройки на уровне контейнера, параметры системы, а также поведение конкретных приложений, таких как Solr, могут значительно влиять на использование памяти. Рекомендуется внимательно анализировать все эти аспектов, чтобы принять обоснованные решения по оптимизации работы вашего приложения.