Оптимизация и тюнинг Ceph

Оптимизация и тюнинг Ceph

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Настройка Swappiness, кэширование, оптимизация операций чтения/записи для ускорения работы Ceph, тюнинг Ceph.

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

В данном примере будет рассмотрен один из вариантов для улучшения работы дисковой подсистемы Ceph.

**ВНИМАНИЕ!

Все действия в данной статье могут привести к краху системы.

Не выполняйте их на рабочих серверах. Пожалейте нервы :)
**

Приступим.

1. read_ahead

Параметр read_ahead ускоряет операции дискового чтения путем предварительной выборки и их загрузки в оперативную память. Установка относительно высоких значений read_ahead даст преимущества клиентам при выполнении операций последовательного чтения.

Проверить текущее установленное значение параметра можно командой:

1
2
$ sudo cat /sys/block/sda/queue/read_ahead_kb 
128

Для установки 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
2
# grep -i HugePages_Total /proc/meminfo 
HugePages_Total: 0

или

1
2
3
4
$ cat /proc/sys/vm/nr_hugepages
0
$ sysctl vm.nr_hugepages
vm.nr_hugepages = 0

Нулевое значение означает, что HugePages отключен в системе.
Ежели это иначе, то следуем дальше.

Для отключения THP при загрузке отредактируем файл grub.conf:

1
transparent_hugepage=never

Для отключения THP “на лету” выполним команды:

1
2
# 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%.

Для изменения параметра “на лету” выполним:

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
2
vm.swappiness = 10
vm.vfs_cache_pressure = 1000

Параметр 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 для того чтобы задать максимальное значение открытых дескрипторов файлов на уровне ОС:

1
max_open_files = 131072

Для всех SSD-дисков установим настройки:

1
2
3
4
5
filestore_op_threads = 32
filestore_min_sync_interval = 0.01
filestore_max_sync_interval = 1
throttler_perf_counter = false
osd_enable_op_tracker = false

Текущий конфигурационный файл тестового сервера:

(Будет изменяться в зависимости от проведенных тестов и рекомендаций)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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