Как настроить ядро Linux для повышения производительности памяти

Ядро linux пытается оптимизировать использование оперативной памяти, занимая неиспользуемую оперативную память кэшами. Это делается на основании того, что неиспользуемая оперативная память - это пустая оперативная память.

linux

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

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

Эта задержка будет обусловлена исключительно тем, что оперативная память используется на полную мощность. Таким образом, кроме общего и потенциально спорадического увеличения задержки, никаких других симптомов может не наблюдаться. Это похоже на симптомы, которые могут наблюдаться, если жесткие диски не успевают за чтением и записью. Задержка может также влиять как на Aerospike, так и на компоненты операционной системы, такие как mallocs сетевой карты/iptables/ebtables/iproute2. Поэтому вместо этого может отображаться задержка, связанная с сетью. В следующей статье это обсуждается более подробно и предлагаются шаги по минимизации воздействия на систему.

Объяснение

Кэш-память ядра содержит следующее:

  • грязный кэш - блоки данных, еще не зафиксированные в файловых системах, поддерживающих кэширование (например, ext4). Его можно очистить, выполнив команду sync, хотя это может привести к периодическому снижению производительности. Это не рекомендуется для обычного использования, если только не очень важно зафиксировать данные на жестком диске (например, при ожидании сбоя).
  • чистый кэш - блоки данных, которые находятся на жестком диске, но также сохраняются в памяти для быстрого доступа. Отказ от чистого кэша может привести к снижению производительности, поскольку все данные будут считываться с диска, тогда как раньше часто используемые данные получались непосредственно из оперативной памяти.
  • inode cache - кэш информации о расположении inode. Он может быть удален, как и чистый кэш, но с соответствующим снижением производительности.
  • slab cache - этот тип кэша хранит объекты, выделенные приложениями через malloc, чтобы в будущем их можно было повторно выделить с уже заполненными данными объекта, что приводит к увеличению скорости при выделении памяти.

Хотя с грязным кэшем мало что можно сделать, другие кэшированные объекты могут быть очищены. Это потенциально имеет 2 результата. Уменьшится задержка в приложениях с большим количеством блоков, таких как Aerospike, при хранении данных в памяти. С другой стороны, доступ к диску может замедлиться, поскольку все данные придется считывать с диска.

Очистка кэша slab на сервере потенциально может привести к временному снижению скорости (всплеску). По этой причине не рекомендуется очищать кэш. Вместо этого лучше сообщить системе, что определенный объем оперативной памяти никогда не должен быть занят кэшем.

При необходимости очистку кэша можно выполнить следующим образом:

Большая часть пространства будет занята страничным кэшем, а не слэб-кэшем. Рекомендуется при очистке кэша удалять только страничный кэш (echo 1).

Для более постоянного исправления можно установить минимальное количество свободной оперативной памяти для ядра. Рассмотрим следующий пример:

Всего оперативной памяти: 100 ГБ
Используется: 10 ГБ
Буферы: 40 ГБ
Минимум свободной: 10 ГБ
Кэш: 40 ГБ

В этом примере с помощью опции минимальной свободной памяти выделено 10 ГБ. В этом случае, если 5 ГБ памяти выделено для буферов, ядро позволит выделению произойти мгновенно. Затем оно деаллоцирует часть кэш-памяти, чтобы обеспечить 10 ГБ свободной памяти. Выделение будет происходить мгновенно, а кэш будет динамически уменьшаться, чтобы 10 ГБ всегда оставались свободными. Новое распределение будет выглядеть следующим образом:

Всего оперативной памяти: 100 ГБ
Используемая: 10 ГБ
Буферы: 45 ГБ
Минимум свободной: 10 ГБ
Кэш: 35 ГБ

Точная настройка этих параметров зависит от текущего использования.

Настройка выполняется путем выполнения команды

где NUMBER - это количество килобайт, которое должно быть свободно в системе. Чтобы оставить незанятыми 3% памяти на машине с 100 ГБ ОЗУ, команда будет выглядеть следующим образом:

В системе с общим объемом оперативной памяти более 37 ГБ следует оставлять не более 3% свободной памяти на min_free_kbytes, чтобы ядро не тратило слишком много времени на ненужное восстановление памяти. На таких системах это будет равно от 1,1 ГБ до 3% от общего объема оперативной памяти.

При установке этого параметра следует проявлять осторожность: как слишком низкие, так и слишком высокие значения могут негативно сказаться на производительности системы. Слишком низкое значение min_free_kbytes не позволяет системе освобождать память. Это может привести к зависанию системы и OOM-киллам процессов.

Установка слишком большого значения этого параметра (5-10% от общего объема памяти системы) приведет к тому, что память будет немедленно исчерпана. Linux предназначен для использования всей доступной оперативной памяти для кэширования данных файловой системы. Установка высокого значения min_free_kbytes приводит к тому, что система тратит слишком много времени на восстановление памяти.

Рекомендация RedHat: держать min_free_kbytes на уровне 1-3% от общего объема памяти в системе.

Рекомендуется либо уменьшить swappiness до 0. Для операций с низкой задержкой использование swap в любом объеме резко снизит производительность.

Чтобы уменьшить потенциальную задержку, установите swappiness на 0:

Примечания

Все вышеперечисленные изменения НЕ являются постоянными. Они происходят только во время работы машины. Чтобы сделать изменения постоянными, необходимо внести дополнения в файл /etc/sysctl.conf.

Следующие строки делают изменения, показанные выше, постоянными:

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

Существует еще один параметр, направленный на получение результата, аналогичного вышеописанному, под названием zone_reclaim. К сожалению, этот параметр вызывает агрессивное повторное изъятие и сканирование и поэтому должен быть отключен. Во всех новых ядрах и дистрибутивах он стандартно отключен.

Следующая команда может быть использована, чтобы убедиться, что zone_reclaim отключен:

Понравилась статья? Поделиться с друзьями:
Добавить комментарий