Оптимизация и тюнинг Ceph
Настройка Swappiness, кэширование, оптимизация операций чтения/записи для ускорения работы Ceph, тюнинг Ceph.
Единой конфигурации для идеальной работы нет, оптимизация и настройка производится исходя из требований к различного рода задачам.
В данном примере будет рассмотрен один из вариантов для улучшения работы дисковой подсистемы Ceph.
ВНИМАНИЕ!
Все действия в данной статье могут привести к краху системы.
Не выполняйте их на рабочих серверах. Пожалейте нервы :)
Приступим.
1. read_ahead
Параметр read_ahead
ускоряет операции дискового чтения путем предварительной выборки и их загрузки в оперативную память. Установка относительно высоких значений read_ahead
даст преимущества клиентам при выполнении операций последовательного чтения.
Проверить текущее установленное значение параметра можно командой:
$ sudo cat /sys/block/sda/queue/read_ahead_kb 128 |
Для установки read_ahead
бОльшего значения, используем следующую команду:
echo "8192"> /sys/block/sda/queue/read_ahead_kb |
Аналогично необходимо изменить read_ahead
для всех RBD, помеченных для данного хоста.
Убедитесь, что вы используете правильное имя пути устройства.
2. Отключим синтаксический анализ каталога OSD с помощью updatedb
Утилита под названием updatedb сканирует всю систему и обновляет файл базы данных mlocate.db
.
База данный это файл, в котором содержится информация о файлах и их путях в системе Linux.
updatedb -e /var/lib/ceph |
3. Отключить transparent hugepage(THP)
Проверить статус HugePages можно командой:
# grep -i HugePages_Total /proc/meminfo HugePages_Total: 0 |
или
$ cat /proc/sys/vm/nr_hugepages 0 $ sysctl vm.nr_hugepages vm.nr_hugepages = 0 |
Нулевое значение означает, что HugePages отключен в системе. Ежели это иначе, то следуем дальше.
Для отключения THP при загрузке отредактируем файл grub.conf
:
transparent_hugepage=never
|
Для отключения THP “на лету” выполним команды:
# echo never> /sys/kernel/mm/redhat_transparent_hugepage/enabled # echo never> /sys/kernel/mm/redhat_transparent_hugepage/defrag |
4. Использование ОЗУ и SWAP
Параметр vm.swappiness
по умолчанию имеет значение 60 и контролирует процент свободной памяти, при которой начнется активный сброс страниц в раздел swap.
Значение параметра достаточно легко понять.
100-60 = 40% занятой памяти при которой система уже начнет использовать раздел swap
Лучшим решением будет изменить данный параметр на 10 и указать системе не использоваться swap, пока ОЗУ не достигнет 90%.
Для изменения параметра “на лету” выполним:
echo 10> /proc/sys/vm/swappiness |
или
sysctl -w vm.swappiness=10 |
Для перманентной настройки параметра, изменим файл /etc/sysctl.conf
и добавим строчку:
vm.swappiness=10
|
Параметр vfs_cache_pressure
по умолчанию имеет значение 100 и отвечает за уровень выделяемой памяти под кэш.
Увеличение данного параметра заставляет ядро активнее выгружать неиспользуемые страницы памяти из кеша, т.е. количество выделяемой оперативной памяти под кеш будет расти медленнее, что снизит вероятность того, что будет задействован раздел swap.
При уменьшении параметра, ядро, наоборот, будет дольше держать страницы памяти в кеше, в том числе и в swap’е.
Это имеет смысл при небольшом количестве ОЗУ, например, если у нас 512 МБ памяти, то параметр vfs_cache_pressure
можно выставить равным 50. Это позволит сократить количество дисковых операций в swap разделе, так как удаление неиспользуемых страниц будет происходить реже.
Дальнейшее уменьшение этого параметра может привести к нехватке памяти.
Если мы хотим ускорить работу системы и у нас достаточно памяти, то изменим значение системы, добавив строчки в файл /etc/sysctl.conf
:
vm.swappiness = 10 vm.vfs_cache_pressure = 1000 |
Параметр kernel.pid_max
служит для поддержки большего значения тредов (threads). В теории, максимум это - 4,194,303.
Внесем изменения в файл /etc/sysctl.conf
, добавив строчку:
kernel.pid_max = 4194303
|
vm.zone_reclaim_mode
Параметр vm.zone_reclaim_mode
. Опасен для файловых серверов.
Важно, чтобы значение было выставлено в ноль.
Оптимизация Ceph OSD
Отключим ведение журнала в памяти.
Каждая подсистема Ceph имеет свой уровень логирования и регистрирует это в памяти.
Мы можем установить разные значения для каждой из этих подсистем, установив уровень логирования и уровень памяти для ведения журнала отладки в диапазоне от 1 до 20. (Где 1 является кратким и 20 - подробным).
Первое значение - это уровень логирования, а второй - уровень памяти. Мы должны отделить их с помощью косой черты (/):
debug = <log-level>/<memory-level>
Логирование по умолчанию идеально подходит для наблюдения за кластером.
Если ведение журнала в памяти влияет на производительность или потребление памяти, в это случае мы можем отключить его.
Чтобы отключить добавьте следующие параметры:
debug_lockdep = 0/0 debug_context = 0/0 debug_crush = 0/0 debug_buffer = 0/0 debug_timer = 0/0 debug_filer = 0/0 debug_objecter = 0/0 debug_rados = 0/0 debug_rbd = 0/0 debug_journaler = 0/0 debug_objectcatcher = 0/0 debug_client = 0/0 debug_osd = 0/0 debug_optracker = 0/0 debug_objclass = 0/0 debug_filestore = 0/0 debug_journal = 0/0 debug_ms = 0/0 debug_monc = 0/0 debug_tp = 0/0 debug_auth = 0/0 debug_finisher = 0/0 debug_heartbeatmap = 0/0 debug_perfcounter = 0/0 debug_asok = 0/0 debug_throttle = 0/0 debug_mon = 0/0 debug_paxos = 0/0 debug_rgw = 0/0
Установим max_open_files
для того чтобы задать максимальное значение открытых дескрипторов файлов на уровне ОС:
max_open_files = 131072
Для всех SSD-дисков установим настройки:
filestore_op_threads = 32 filestore_min_sync_interval = 0.01 filestore_max_sync_interval = 1 throttler_perf_counter = false osd_enable_op_tracker = false
Текущий конфигурационный файл сервера:
(Может быть изменен в зависимости от проведенных тестов и рекомендаций)
filestore_min_sync_interval = 10 filestore_max_sync_interval = 15 filestore_op_threads = 32 filestore_queue_max_ops = 2500 filestore_queue_max_bytes = 10485760 filestore_queue_committing_max_ops = 5000 filestore_queue_committing_max_bytes = 10485760000 throttler_perf_counter = false filestore_merge_threshold = 40 filestore_split_multiple = 8 osd_enable_op_tracker = false osd_op_threads = 16 osd_disk_threads = 1 osd_mkfs_options_xfs = "-f -i size=2048" osd_mount_options_xfs = "rw,noatime,inode64,logbufs=8,logbsize=256k,delaylog,allocsize=4M" osd_max_write_size = 256 osd_map_dedup = true osd_disk_thread_ioprio_class = idle osd_disk_thread_ioprio_priority = 0 osd_client_message_size_cap = 1073741824 osd_scrub_begin_hour = 4 osd_scrub_end_hour = 6 osd_deep_scrub_stride = 1048576 osd_scrub_chunk_min = 1 osd_scrub_chunk_max = 5 osd_max_scrubs = 1 osd_scrub_sleep = .1 osd_max_backfills = 2 osd_backfill_scan_min = 8 osd_backfill_scan_max = 64 mon_osd_down_out_interval = 600 mon_osd_min_down_reporters = 3 journal_max_write_bytes = 1073714824 journal_max_write_entries = 10000 journal_queue_max_ops = 50000 journal_queue_max_bytes = 10485760000 journal_dio = true
Полный оптимизированный конфигурационый файл можно скачать по ссылке: ceph.conf