Оптимизация и тюнинг Ceph
Настройка Swappiness, кэширование, оптимизация операций чтения/записи для ускорения работы Ceph, тюнинг Ceph.
Единой конфигурации для идеальной работы нет, оптимизация и настройка производится исходя из требований к различного рода задачам.
В данном примере будет рассмотрен один из вариантов для улучшения работы дисковой подсистемы Ceph.
**ВНИМАНИЕ!
Все действия в данной статье могут привести к краху системы.
Не выполняйте их на рабочих серверах. Пожалейте нервы :)
**
Приступим.
1. read_ahead
Параметр read_ahead
ускоряет операции дискового чтения путем предварительной выборки и их загрузки в оперативную память. Установка относительно высоких значений read_ahead
даст преимущества клиентам при выполнении операций последовательного чтения.
Проверить текущее установленное значение параметра можно командой:
1 | $ sudo cat /sys/block/sda/queue/read_ahead_kb |
Для установки read_ahead
бОльшего значения, используем следующую команду:
1 | echo "8192" > /sys/block/sda/queue/read_ahead_kb |
Аналогично необходимо изменить read_ahead
для всех RBD, помеченных для данного хоста.
Убедитесь, что вы используете правильное имя пути устройства.
2. Отключим синтаксический анализ каталога OSD с помощью updatedb
Утилита под названием updatedb сканирует всю систему и обновляет файл базы данных mlocate.db
.
База данный это файл, в котором содержится информация о файлах и их путях в системе Linux.
1 | updatedb -e /var/lib/ceph |
3. Отключить transparent hugepage(THP)
Проверить статус HugePages можно командой:
1 | # grep -i HugePages_Total /proc/meminfo |
или
1 | $ cat /proc/sys/vm/nr_hugepages |
Нулевое значение означает, что HugePages отключен в системе.
Ежели это иначе, то следуем дальше.
Для отключения THP при загрузке отредактируем файл grub.conf
:
1 | transparent_hugepage=never |
Для отключения THP “на лету” выполним команды:
1 | # echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled |
4. Использование ОЗУ и SWAP
Параметр vm.swappiness
по умолчанию имеет значение 60 и контролирует процент свободной памяти, при которой начнется активный сброс страниц в раздел swap.
Значение параметра достаточно легко понять.
100-60 = 40% занятой памяти при которой система уже начнет использовать раздел swap
Лучшим решением будет изменить данный параметр на 10 и указать системе не использоваться swap, пока ОЗУ не достигнет 90%.
Для изменения параметра “на лету” выполним:
1 | echo 10 > /proc/sys/vm/swappiness |
или
1 | sysctl -w vm.swappiness=10 |
Для перманентной настройки параметра, изменим файл /etc/sysctl.conf
и добавим строчку:
1 | vm.swappiness=10 |
Параметр vfs_cache_pressure
по умолчанию имеет значение 100 и отвечает за уровень выделяемой памяти под кэш.
Увеличение данного параметра заставляет ядро активнее выгружать неиспользуемые страницы памяти из кеша, т.е. количество выделяемой оперативной памяти под кеш будет расти медленнее, что снизит вероятность того, что будет задействован раздел swap.
При уменьшении параметра, ядро, наоборот, будет дольше держать страницы памяти в кеше, в том числе и в swap’е.
Это имеет смысл при небольшом количестве ОЗУ, например, если у нас 512 МБ памяти, то параметр vfs_cache_pressure
можно выставить равным 50. Это позволит сократить количество дисковых операций в swap разделе, так как удаление неиспользуемых страниц будет происходить реже.
Дальнейшее уменьшение этого параметра может привести к нехватке памяти.
Если мы хотим ускорить работу системы и у нас достаточно памяти, то изменим значение системы, добавив строчки в файл /etc/sysctl.conf
:
1 | vm.swappiness = 10 |
Параметр kernel.pid_max
служит для поддержки большего значения тредов (threads). В теории, максимум это - 4,194,303.
Внесем изменения в файл /etc/sysctl.conf
, добавив строчку:
1 | kernel.pid_max = 4194303 |
vm.zone_reclaim_mode
Параметр vm.zone_reclaim_mode
. Опасен для файловых серверов.
Важно, чтобы значение было выставлено в ноль.
Оптимизация Ceph OSD
Отключим ведение журнала в памяти.
Каждая подсистема Ceph имеет свой уровень логирования и регистрирует это в памяти.
Мы можем установить разные значения для каждой из этих подсистем, установив уровень логирования и уровень памяти для ведения журнала отладки в диапазоне от 1 до 20. (Где 1 является кратким и 20 - подробным).
Первое значение - это уровень логирования, а второй - уровень памяти. Мы должны отделить их с помощью косой черты (/):
debug <subsystem> = <log-level>/<memory-level>
Логирование по умолчанию идеально подходит для наблюдения за кластером.
Если ведение журнала в памяти влияет на производительность или потребление памяти, в это случае мы можем отключить его.
Чтобы отключить добавьте следующие параметры:
1 | debug_lockdep = 0/0 |
Установим max_open_files
для того чтобы задать максимальное значение открытых дескрипторов файлов на уровне ОС:
1 | max_open_files = 131072 |
Для всех SSD-дисков установим настройки:
1 | filestore_op_threads = 32 |
Текущий конфигурационный файл тестового сервера:
(Будет изменяться в зависимости от проведенных тестов и рекомендаций)
1 | filestore_min_sync_interval = 10 |