Dépannage d'un décrochage Redis

8

Nous avons plusieurs instances de redis exécutées sur un serveur. Il existe également plusieurs serveurs de niveau Web se connectant à ces instances qui rencontrent un blocage en même temps.

Nous avions des captures de paquets en cours à ce moment-là, qui ont identifié un mur dans le trafic TX et RX, comme le montrent les graphiques d'E / S Wirehark suivants:

entrez la description de l'image ici

entrez la description de l'image ici

Il y avait un pic corrélatif dans les appels redis, mais je soupçonne que c'était un effet et non une cause en raison du décalage:

entrez la description de l'image ici

Avec un intervalle d'échantillonnage de 15 / s (qui est collecté comme compteur), il y avait en moyenne 136 décrochages d'allocation de mémoire:

entrez la description de l'image ici

Il semblait également y avoir un nombre hors du commun de pages NUMA migrées en même temps:

entrez la description de l'image ici

Bien que ce qui précède semble normal, il y avait deux points de données consécutifs pour cela, ce qui le rend anormal par rapport aux autres pointes supérieures à 300 observées dans le graphique.

Il y avait également une pointe corrélée dans les échecs de compactage de la mémoire et les blocages de compactage:

entrez la description de l'image ici

entrez la description de l'image ici

Bien que je possède une mine d'informations sur la mémoire ici, ma connaissance de la mémoire Linux n'est pas suffisamment approfondie pour vraiment émettre l'hypothèse d'une bonne histoire qui rassemble toutes ces informations pour expliquer le décrochage. Toute personne possédant une connaissance approfondie de la mémoire Linux (et peut-être une connaissance approfondie de la mémoire Redis) peut-elle lier certaines de ces informations?

Nous collectons toutes les statistiques de / proc / vmstat à des intervalles de 15 secondes, donc s'il y a des données que vous pensez pouvoir ajouter à cela, veuillez en faire la demande. Je viens de choisir les choses qui semblaient avoir une activité intéressante, en particulier le décrochage alloc, la migration numa et le décrochage / échecs de compactage. Les totaux suivent et couvrent 20 jours de disponibilité:

[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 

Aussi tous les paramètres / proc / sys / vm / * si cela aide:

***/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

Mise à jour:

Il y a un thp_split qui est proche dans le temps:

entrez la description de l'image ici

Kyle Brandt
la source

Réponses:

4

Quelle est votre configuration pour / proc / sys / vm / zone_reclaim? Essayez de le mettre à 0. Il y a beaucoup de choses sur le net si vous recherchez «zone_reclaim», donc je n'essaierai pas de le ressasser ici.

Tobert
la source
Est déjà nul, il semble[kbrandt@ny-redis01: ~] cat /proc/sys/vm/zone_reclaim_mode 0
Kyle Brandt
1
D'ACCORD. Prochain arrêt: les pages géantes transparentes. Il semble qu'ils soient utilisés: 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 Pour Redis, vous voulez probablement que THP soit désactivé. antirez.com/news/84 TL; DR: echo never> / sys / kernel / mm / transparent_hugepage / enabled
Tobert
Il y a un thp_split qui est une corrélation étroite. Un certain retard dans l'enregistrement, mais le timing de l'agent de surveillance pourrait également avoir été affecté. Mise à jour de la question avec le graphique!
Kyle Brandt
Voulez-vous nous éclairer sur ce qui se passe pendant une scission thp?
Kyle Brandt
Nous l'avons mis en marionnette, mais en tant qu'exéc. Je ne le vois pas dans rc.local, donc mon hypothèse actuelle est une condition de concurrence - redis démarre avant que le commutateur du noyau ne soit défini
Kyle Brandt
2

Lorsque Redis bifurque au point de contrôle, le noyau Linux doit dupliquer les tables de mappage pour une copie en écriture. Si vous avez beaucoup de RAM, cela peut prendre beaucoup de temps. Nous avons une instance Redis de 200 Go qui prend 8 secondes à débiter, et la machine est sourde au monde pendant que cela se produit.

Solutions de contournement (de facile à difficile):

  • checkpoint moins souvent, augmentant le temps et le nombre de clés avant le checkpoint
  • partager vos données en plusieurs instances de processus, chacune utilisant moins de RAM
  • essayez aof au lieu de checkpoint, bien que cela se produise de temps en temps de toute façon
  • essayez d'énormes pages, bien que vous deviez peut-être doubler votre RAM physique car environ tout sera sale lors du contrôle
  • visser et aller avec Postgres
Jon Watte
la source