Устранение неполадок с Redis Stall


8

У нас есть несколько экземпляров redis, работающих на сервере. Существует также несколько серверов веб-уровня, подключающихся к тем экземплярам, ​​которые одновременно испытывают остановку.

В то время у нас были перехваты пакетов, которые определили, что в TX и RX-трафике происходит остановка, как показано на следующих графиках ввода-вывода wireshark:

введите описание изображения здесь

введите описание изображения здесь

Был всплеск корреляции в вызовах redis, но я подозреваю, что это было следствием, а не причиной из-за временной задержки:

введите описание изображения здесь

С интервалом выборки 15 / с (это собирается как счетчик) в среднем было 136 остановок выделения памяти:

введите описание изображения здесь

Похоже, что в это же время было перенесено необычное количество страниц NUMA:

введите описание изображения здесь

Хотя приведенное выше выглядит нормально, для этого были две последовательные точки данных, которые делают его ненормальным по сравнению с другими более 300 пиками, показанными на графике.

Был также коррелированный всплеск ошибок сжатия памяти и остановок сжатия:

введите описание изображения здесь

введите описание изображения здесь

Хотя у меня здесь много информации о памяти, мои знания о памяти в Linux недостаточно глубоки, чтобы действительно выдвинуть гипотезу о хорошей истории, которая объединяет всю эту информацию для объяснения срыва. Может ли кто-нибудь с глубоким знанием памяти Linux (и, возможно, с глубоким знанием памяти заново) связать часть этой информации вместе?

Мы собираем всю статистику из / proc / vmstat с 15-секундными интервалами, поэтому, если есть какие-либо данные, которые, по вашему мнению, могут добавить к этому, пожалуйста, запросите их. Я просто выбрал вещи, которые, как мне показалось, имели интересную активность, в частности остановка выделения, миграция numa и остановка / сбой сжатия. Итоги следуют и покрывают 20 дней безотказной работы:

[kbrandt@ny-redis01: ~] uptime
 21:11:49 up 20 days, 20:05,  8 users,  load average: 1.05, 0.74, 0.69
[kbrandt@ny-redis01: ~] cat /proc/vmstat
nr_free_pages 105382
nr_alloc_batch 5632
nr_inactive_anon 983455
nr_active_anon 15870487
nr_inactive_file 12904618
nr_active_file 2266184
nr_unevictable 0
nr_mlock 0
nr_anon_pages 16361259
nr_mapped 26329
nr_file_pages 15667318
nr_dirty 48588
nr_writeback 0
nr_slab_reclaimable 473720
nr_slab_unreclaimable 37147
nr_page_table_pages 38701
nr_kernel_stack 987
nr_unstable 0
nr_bounce 0
nr_vmscan_write 356302
nr_vmscan_immediate_reclaim 174305
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 32
nr_shmem 423906
nr_dirtied 3071978326
nr_written 3069010459
numa_hit 1825289996
numa_miss 3360625955
numa_foreign 3360626253
numa_interleave 64798
numa_local 1856473774
numa_other 3329442177
workingset_refault 297175
workingset_activate 24923
workingset_nodereclaim 0
nr_anon_transparent_hugepages 41
nr_free_cma 0
nr_dirty_threshold 3030688
nr_dirty_background_threshold 1515344
pgpgin 25709012
pgpgout 12284206511
pswpin 143954
pswpout 341570
pgalloc_dma 430
pgalloc_dma32 498407404
pgalloc_normal 8131576449
pgalloc_movable 0
pgfree 8639210186
pgactivate 12022290
pgdeactivate 14512106
pgfault 61444049878
pgmajfault 23740
pgrefill_dma 0
pgrefill_dma32 1084722
pgrefill_normal 13419119
pgrefill_movable 0
pgsteal_kswapd_dma 0
pgsteal_kswapd_dma32 11991303
pgsteal_kswapd_normal 1051781383
pgsteal_kswapd_movable 0
pgsteal_direct_dma 0
pgsteal_direct_dma32 58737
pgsteal_direct_normal 36277968
pgsteal_direct_movable 0
pgscan_kswapd_dma 0
pgscan_kswapd_dma32 13416911
pgscan_kswapd_normal 1053143529
pgscan_kswapd_movable 0
pgscan_direct_dma 0
pgscan_direct_dma32 58926
pgscan_direct_normal 36291030
pgscan_direct_movable 0
pgscan_direct_throttle 0
zone_reclaim_failed 0
pginodesteal 0
slabs_scanned 1812992
kswapd_inodesteal 5096998
kswapd_low_wmark_hit_quickly 8600243
kswapd_high_wmark_hit_quickly 5068337
pageoutrun 14095945
allocstall 567491
pgrotated 971171
drop_pagecache 8
drop_slab 0
numa_pte_updates 58218081649
numa_huge_pte_updates 416664
numa_hint_faults 57988385456
numa_hint_faults_local 57286615202
numa_pages_migrated 39923112
pgmigrate_success 48662606
pgmigrate_fail 2670596
compact_migrate_scanned 29140124
compact_free_scanned 28320190101
compact_isolated 21473591
compact_stall 57784
compact_fail 37819
compact_success 19965
htlb_buddy_alloc_success 0
htlb_buddy_alloc_fail 0
unevictable_pgs_culled 5528
unevictable_pgs_scanned 0
unevictable_pgs_rescued 18567
unevictable_pgs_mlocked 20909
unevictable_pgs_munlocked 20909
unevictable_pgs_cleared 0
unevictable_pgs_stranded 0
thp_fault_alloc 11613
thp_fault_fallback 53
thp_collapse_alloc 3
thp_collapse_alloc_failed 0
thp_split 9804
thp_zero_page_alloc 1
thp_zero_page_alloc_failed 0 

Также все настройки / proc / sys / vm / *, если это поможет:

***/proc/sys/vm/admin_reserve_kbytes***
8192
***/proc/sys/vm/block_dump***
0
***/proc/sys/vm/dirty_background_bytes***
0
***/proc/sys/vm/dirty_background_ratio***
10
***/proc/sys/vm/dirty_bytes***
0
***/proc/sys/vm/dirty_expire_centisecs***
3000
***/proc/sys/vm/dirty_ratio***
20
***/proc/sys/vm/dirty_writeback_centisecs***
500
***/proc/sys/vm/drop_caches***
1
***/proc/sys/vm/extfrag_threshold***
500
***/proc/sys/vm/hugepages_treat_as_movable***
0
***/proc/sys/vm/hugetlb_shm_group***
0
***/proc/sys/vm/laptop_mode***
0
***/proc/sys/vm/legacy_va_layout***
0
***/proc/sys/vm/lowmem_reserve_ratio***
256 256 32
***/proc/sys/vm/max_map_count***
65530
***/proc/sys/vm/memory_failure_early_kill***
0
***/proc/sys/vm/memory_failure_recovery***
1
***/proc/sys/vm/min_free_kbytes***
90112
***/proc/sys/vm/min_slab_ratio***
5
***/proc/sys/vm/min_unmapped_ratio***
1
***/proc/sys/vm/mmap_min_addr***
4096
***/proc/sys/vm/nr_hugepages***
0
***/proc/sys/vm/nr_hugepages_mempolicy***
0
***/proc/sys/vm/nr_overcommit_hugepages***
0
***/proc/sys/vm/nr_pdflush_threads***
0
***/proc/sys/vm/numa_zonelist_order***
default
***/proc/sys/vm/oom_dump_tasks***
1
***/proc/sys/vm/oom_kill_allocating_task***
0
***/proc/sys/vm/overcommit_kbytes***
0
***/proc/sys/vm/overcommit_memory***
1
***/proc/sys/vm/overcommit_ratio***
50
***/proc/sys/vm/page-cluster***
3
***/proc/sys/vm/panic_on_oom***
0
***/proc/sys/vm/percpu_pagelist_fraction***
0
***/proc/sys/vm/scan_unevictable_pages***
0
***/proc/sys/vm/stat_interval***
1
***/proc/sys/vm/swappiness***
60
***/proc/sys/vm/user_reserve_kbytes***
131072
***/proc/sys/vm/vfs_cache_pressure***
100
***/proc/sys/vm/zone_reclaim_mode***
0

Обновить:

Есть thp_split, который близок по времени:

введите описание изображения здесь

Ответы:


4

Каковы ваши настройки для / proc / sys / vm / zone_reclaim? Попробуйте установить его на 0. В сети достаточно информации, если вы ищете 'zone_reclaim', поэтому я не буду пытаться перефразировать ее здесь.


Уже ноль кажется[kbrandt@ny-redis01: ~] cat /proc/sys/vm/zone_reclaim_mode 0
Кайл Брандт

1
ХОРОШО. Следующая остановка: прозрачные огромные страницы. Похоже, они используются: thp_fault_alloc 11613 thp_fault_fallback 53 thp_collapse_alloc 3 thp_collapse_alloc_failed 0 thp_split 9804 thp_zero_page_alloc 1 thp_zero_page_alloc_failed 0 Для Redis вы, вероятно, хотите отключить THP. antirez.com/news/84 TL; DR: echo never> / sys / kernel / mm / transparent_hugepage / enabled
Тоберт,

Существует thp_split, который является тесной корреляцией. Некоторое отставание в записи, но на синхронизацию агента мониторинга также могли повлиять. Обновил вопрос с графиком!
Кайл Брандт

Неужели мы просвещаем нас о том, что происходит во время раскола?
Кайл Брандт

У нас есть это в марионетке, но как exec. Я не вижу этого в rc.local, поэтому моя текущая гипотеза - это состояние гонки - redis запускается до установки переключателя ядра
Кайл Брандт,

2

Когда Redis разветвляется на контрольную точку, ядру Linux необходимо дублировать таблицы сопоставления для копирования при записи. Если у вас много оперативной памяти, это может занять много времени. У нас есть экземпляр Redis емкостью 200 ГБ, который требует 8 секунд для разветвления, и машина остается глухой к миру, пока это происходит.

Обходные пути (от простого к сложному):

  • контрольная точка реже, увеличивая время и количество ключей перед контрольной точкой
  • разделить ваши данные на несколько экземпляров процесса, каждый из которых использует меньше оперативной памяти
  • попробуйте aof вместо контрольной точки, хотя это все равно будет иногда разветвляться
  • попробуйте большие страницы, хотя вам может понадобиться удвоить физическую память, потому что примерно все будет загрязнено во время контрольных точек
  • прикрути его и иди с Postgres
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.