Redis 스톨 문제 해결


8

서버에서 여러 redis 인스턴스가 실행 중입니다. 인스턴스가 동시에 중단되는 여러 웹 계층 서버가 인스턴스에 연결되어 있습니다.

우리는 당시 패킷 캡처를 진행하여 다음 wireshark IO 그래프에 따라 TX 및 RX 트래픽 모두에서 중단이 발생했음을 확인했습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

redis 호출에서 관련 스파이크가 있었지만 시간 지연으로 인해 효과가 아닌 원인이라고 생각합니다.

여기에 이미지 설명을 입력하십시오

15 / s 샘플링 간격 (카운터로 수집 됨)에서 평균 136 개의 메모리 할당이 중단되었습니다.

여기에 이미지 설명을 입력하십시오

또한 동시에 마이그레이션 된 일반 NUMA 페이지 수가 부족한 것 같습니다.

여기에 이미지 설명을 입력하십시오

위의 결과는 정상으로 보이지만,이 결과에 대해 두 개의 연속적인 데이터 포인트가있어 그래프에서 볼 수있는 300 개 이상의 다른 스파이크에 비해 비정상적입니다.

또한 메모리 압축 실패 및 압축 중단에서 상관 된 스파이크가있었습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

여기에 풍부한 메모리 정보가 있지만 Linux 메모리 지식은 실속을 설명하기 위해이 모든 정보를 함께 제공하는 좋은 이야기를 실제로 가정 할만큼 깊지는 않습니다. 심도있는 Linux 메모리 지식을 가진 사람 (및 아마도 redis 메모리 지식이있는 사람)이이 정보 중 일부를 함께 묶을 수 있습니까?

15 초 간격으로 / proc / vmstat에서 모든 통계를 수집하므로 여기에 추가 할 수있는 데이터가 있으면 요청하십시오. 방금 흥미로운 활동, 특히 alloc 스톨, 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'을 검색하면 인터넷에 많은 것들이 있으므로 여기서 다시 해시하지 않습니다.


이미 0 인 것 같습니다[kbrandt@ny-redis01: ~] cat /proc/sys/vm/zone_reclaim_mode 0
Kyle Brandt

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
Tobert

밀접한 상관 관계인 thp_split이 있습니다. 기록이 약간 지연되지만 모니터링 에이전트 타이밍에도 영향을 줄 수 있습니다. 그래프로 질문을 업데이트했습니다!
Kyle Brandt

thp split 동안 무슨 일이 일어나고 있는지 우리에게 깨우침
Kyle Brandt

꼭두각시로 설정했지만 exec로 설정했습니다. 나는 rc.local에서 그것을 보지 못하므로 현재의 가설은 경쟁 조건이다-커널 스위치가 설정되기 전에 redis가 시작된다
Kyle Brandt

2

Redis가 분기점을 검사 할 때 Linux 커널은 쓰기시 복사를 위해 매핑 테이블을 복제해야합니다. RAM이 많은 경우 시간이 오래 걸릴 수 있습니다. 우리는 포크하는 데 8 초가 걸리는 200GB의 Redis 인스턴스가 있으며, 이런 일이 발생하는 동안 머신은 전 세계적으로 귀머거리입니다.

해결 방법 (쉬운 것부터 어려운 것까지) :

  • 체크 포인트가 덜 빈번 해져 체크 포인트 이전의 시간과 키 수가 증가
  • RAM을 덜 사용하는 여러 프로세스 인스턴스로 데이터를 분할
  • 어쨌든 때때로 포크되지만 체크 포인트 대신 aof를 시도하십시오.
  • 체크 포인트를하는 동안 거의 모든 것이 지저분해질 수 있으므로 실제 RAM을 두 배로 늘려야 할 수도 있지만 거대한 페이지를 사용해보십시오.
  • 그것을 조이고 Postgres와 함께 가십시오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.