Линукс физическая память и своп в производстве

Вопрос или проблема

Я хотел бы получить мнение о свопинге моего производственного сервера и разделении физической памяти между сервисами.

Конфигурация этого сервера имеет ОС 22.04 ubuntu с 128 ГБ ОЗУ. Это выделенный сервер, а не VPS. Он хостит PHP-приложение и запускает следующие сервисы:

  1. Nginx 1.26.2
  2. Varnish 7.5, работающий на сокете
  3. Redis 7.4.1, работающий на сокете
  4. PHP8.3 FPM
  5. Rabbitmq 3.13.7
  6. ElasticSearch 8.11.4
  7. Percona mysql 8.0.39-30
  8. Hitch 1.8

Все вышеупомянутые сервисы, конечно, имеют собственные конфигурации, в которых указано, сколько памяти должно использоваться. Для этого сервера я настроил файл подкачки размером 64 ГБ. Конечно, я не дал приоритет системе на использование этого SWAP.

NAME      TYPE      SIZE USED PRIO
/swapfile file       64G 2.8G   -2
/dev/md0  partition   4G   0B   -3

cat /proc/sys/vm/swappiness
10

и

/etc/sysctl.conf
vm.swappiness=10
vm.vfs_cache_pressure=90
vm.overcommit_memory = 1

ОЗУ free -m

               total        used        free      shared  buff/cache   available
Mem:          128731       46517        7285         953       74928       79952
Swap:          69626        2882       66744

Вы заметите, что у меня используется около 2.8 ГБ свопа. Насколько я знаю, ОС для использования SWAP должна иметь полное ОЗУ.

С помощью этого bash-скрипта:

for file in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less

Я вижу, что nginx, php8.3, Elasticsearch, redis и hitch используют SWAP.

Также я вижу в ОЗУ, что там около 7 ГБ свободно. Также я вижу, что буфер/кэш использует 75 ГБ ОЗУ. Теперь возникают вопросы:

  1. Как я могу предотвратить использование SWAP ОС?
  2. Может кто-то объяснить, что такое буфер/кэш? Это резервная ОЗУ? Это связано с Varnish? Как мне контролировать эту часть ОЗУ?

Ответ или решение

Память и своп в Linux на производственном сервере

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

Текущая конфигурация

Вы используете сервер с Ubuntu 22.04 и 128 ГБ ОЗУ, что достаточно для большинства веб-приложений. На сервере работают следующие службы:

  • Nginx 1.26.2
  • Varnish 7.5
  • Redis 7.4.1
  • PHP 8.3 FPM
  • Rabbitmq 3.13.7
  • ElasticSearch 8.11.4
  • Percona MySQL 8.0.39-30
  • Hitch 1.8

С учетом вашего выбора, вы настроили своп-файл размером 64 ГБ с низким приоритетом, что говорит о том, что вы не хотите, чтобы система активно использовала своп. Ваши параметры в файле /etc/sysctl.conf сигнализируют о том, что вы настраиваете выборку памяти для оптимизации работы системы.

Текущая загрузка памяти выглядит следующим образом:

              total        used        free      shared  buff/cache   available
Mem:          128731       46517        7285         953       74928       79952
Swap:          69626        2882       66744

Вы заметили, что около 7 ГБ ОЗУ свободно, а объем кэша и буфера составляет 75 ГБ. Это приведет нас к вашим вопросам.

Вопросы и ответы

1. Как предотвратить использование свопа ОС?

Чтобы ограничить использование свопа, вы уже хотите установить параметр vm.swappiness на значение 10, что означает, что система будет использовать своп только в крайних случаях. Однако, если вы хотите минимизировать использование свопа ещё больше, рассмотрите следующие шаги:

  • Повышение значения vm.swappiness: Значение от 1 до 10 будет заставлять систему вручную вытягивать процессы в своп только в случае нехватки ОЗУ.
  • Оптимизация приложений: Убедитесь, что приложения не потребляют больше памяти, чем это необходимо. Например, настройки Redis и PHP-FPM могут быть улучшены, чтобы использовать меньше памяти.
  • Мониторинг прогрессии: Используйте инструменты мониторинга, такие как top, htop или vmstat, для отслеживания использования памяти в реальном времени и обнаружения процессов, которые активно используют своп.
2. Что такое buff/cache?

buff/cache в выводе команды free -m представляет собой пространство, которое используется для кэширования файлов и данных. Это не резервная память, а память, временно выделяемая для ускорения доступа к данным. Она может быть освобождена, если системе это необходимо.

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

  • Настройки приложений и служб: Оптимизируйте конфигурации Nginx, Varnish, Redis и ElasticSearch для улучшения работы с кэшем. Например, лимитируйте количество памяти, выделяемой для кэша, в зависимости от нагрузки.
  • Общие настройки системы: Используйте vm.vfs_cache_pressure, чтобы настроить, как система управляет кэшем страниц. Установка этого параметра на более низкое значение будет увеличивать использование кэша, тем самым потенциально улучшая производительность.

Подводя итоги

Оптимизация использования памяти и свопа – это комплексный процесс, требующий глубокого понимания работы ваших приложений и системы в целом. Поддерживая низкий уровень использованного свопа и оптимизируя использование buff/cache, вы сможете увеличить производительность вашего сервера, минимизируя при этом риски, связанные с недостатком ресурсов. Регулярные проверки конфигурации и мониторинг помогут вам поддерживать высокую эффективность работы вашего производственного сервера.

Оцените материал
Добавить комментарий

Капча загружается...