Вопрос или проблема
Я хотел бы получить мнение о свопинге моего производственного сервера и разделении физической памяти между сервисами.
Конфигурация этого сервера имеет ОС 22.04 ubuntu с 128 ГБ ОЗУ. Это выделенный сервер, а не VPS. Он хостит PHP-приложение и запускает следующие сервисы:
- Nginx 1.26.2
- Varnish 7.5, работающий на сокете
- Redis 7.4.1, работающий на сокете
- PHP8.3 FPM
- Rabbitmq 3.13.7
- ElasticSearch 8.11.4
- Percona mysql 8.0.39-30
- 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 ГБ ОЗУ. Теперь возникают вопросы:
- Как я могу предотвратить использование SWAP ОС?
- Может кто-то объяснить, что такое буфер/кэш? Это резервная ОЗУ? Это связано с 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
, вы сможете увеличить производительность вашего сервера, минимизируя при этом риски, связанные с недостатком ресурсов. Регулярные проверки конфигурации и мониторинг помогут вам поддерживать высокую эффективность работы вашего производственного сервера.