一、背景
本次部署tidb集群使用了3个物理机和一个虚拟机进行部署。
物理机配置为96核,128GB内存,96核分4个numa节点,所以在每个物理机上部署1个tidb、1个pd和1个tikv分别绑定1个numa节点。
虚拟机作为数据库的代理服务器部署tiproxy。
tidb的版本为v8.5.3.
部署时指定的tikv.storage.block-cache.capacity为30GB
部署完成后,一小部分业务测试使用,业务并发也不大,导入数据大概6,70GB。使用过程都是正常的,业务也没有反馈失败的问题。但是查看监控,看到很多tikv的重启现象。接下来就是漫长的排查过程。
二、排查过程
- 首先查看监控看到3个节点最近时间都是轮番重启,内存达到30GB多一点就会重启。

- 查看操作系统的日志显示被系统oom-kill了:

- 但是为什么被系统oom-kill了呢,查看物理机的内存占比也很低呢。看看操作系统的numa绑定策略为default,这个是可以跨numa来调用内存的呢。

- 那是什么原因呢,查看tikv的日志,看到很多这种日志,这个不是rockdb向titan引擎同步数据么,一直这种日志:

- 有看了下数据库的配置,看到是开启了titan,并且设置的rocksdb.defaultcf.titan.min-blob-size为2KB,这个关了试试。
最后参考官网的关闭titan关闭该配置,地址:https://docs.pingcap.com/zh/tidb/stable/titan-configuration/#%E5%85%B3%E9%97%AD-titan
但是过了2个多小时,某个tikv又oom了。
6. 查看tikv的日志,没啥问题,监控中的除了内存在不断上涨也没看到什么问题。最后还是锁定到系统的操作日志中。
2月 30 14:28:09 localhost.localdomain kernel: impwkr-v0 invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
12月 30 14:28:09 localhost.localdomain kernel: CPU: 70 PID: 70511 Comm: impwkr-v0 Kdump: loaded Not tainted 4.19.90-2305.1.0.0199.81.uel20.aarch64 #1
12月 30 14:28:09 localhost.localdomain kernel: Hardware name: Inspur CS5280K2/BC82AMDYB, BIOS 7.38 01/04/2025
12月 30 14:28:09 localhost.localdomain kernel: Call trace:
12月 30 14:28:09 localhost.localdomain kernel: dump_backtrace+0x0/0x1e0
12月 30 14:28:09 localhost.localdomain kernel: show_stack+0x24/0x30
12月 30 14:28:09 localhost.localdomain kernel: dump_stack+0xb4/0xf0
12月 30 14:28:09 localhost.localdomain kernel: dump_header+0x48/0x1e4
12月 30 14:28:09 localhost.localdomain kernel: oom_kill_process+0x348/0x390
12月 30 14:28:09 localhost.localdomain kernel: out_of_memory+0x134/0x5a0
12月 30 14:28:09 localhost.localdomain kernel: __alloc_pages_nodemask+0xdf0/0xe90
12月 30 14:28:09 localhost.localdomain kernel: alloc_pages_vma+0x90/0x230
12月 30 14:28:09 localhost.localdomain kernel: do_anonymous_page+0x1d4/0x6c0
12月 30 14:28:09 localhost.localdomain kernel: __handle_mm_fault+0x468/0x4e0
12月 30 14:28:09 localhost.localdomain kernel: handle_mm_fault+0xd8/0x1a0
12月 30 14:28:09 localhost.localdomain kernel: do_page_fault+0x228/0x510
12月 30 14:28:09 localhost.localdomain kernel: do_translation_fault+0xa8/0xbc
12月 30 14:28:09 localhost.localdomain kernel: do_mem_abort+0x6c/0x120
12月 30 14:28:09 localhost.localdomain kernel: el0_da+0x24/0x28
12月 30 14:28:09 localhost.localdomain kernel: Mem-Info:
12月 30 14:28:09 localhost.localdomain kernel: active_anon:572400 inactive_anon:1105 isolated_anon:0
active_file:14981 inactive_file:133783 isolated_file:0
unevictable:25 dirty:0 writeback:0 unstable:0
slab_reclaimable:4695 slab_unreclaimable:17158
mapped:11723 shmem:1248 pagetables:292 bounce:0
free:1282189 free_pcp:0 free_cma:0
12月 30 14:28:09 localhost.localdomain kernel: Node 2 active_anon:32314240kB inactive_anon:26112kB active_file:576kB inactive_file:704kB unevictable:448kB isolated(anon):0kB isolated(file):0kB m>
12月 30 14:28:09 localhost.localdomain kernel: Node 2 Normal free:28352kB min:28480kB low:61952kB high:95424kB active_anon:32314624kB inactive_anon:26112kB active_file:576kB inactive_file:0kB un>
12月 30 14:28:09 localhost.localdomain kernel: lowmem_reserve[]: 0 0 0
12月 30 14:28:09 localhost.localdomain kernel: Node 2 Normal: 269*64kB (UM) 59*128kB (U) 5*256kB (UM) 0*512kB 1*1024kB (U) 1*2048kB (U) 0*4096kB 0*8192kB 0*16384kB 0*32768kB 0*65536kB 0*131072kB>
12月 30 14:28:09 localhost.localdomain kernel: Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
12月 30 14:28:09 localhost.localdomain kernel: Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=524288kB
12月 30 14:28:09 localhost.localdomain kernel: Node 1 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
12月 30 14:28:09 localhost.localdomain kernel: Node 1 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=524288kB
12月 30 14:28:09 localhost.localdomain kernel: Node 2 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
12月 30 14:28:09 localhost.localdomain kernel: Node 2 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=524288kB
12月 30 14:28:09 localhost.localdomain kernel: Node 3 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
12月 30 14:28:09 localhost.localdomain kernel: Node 3 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=524288kB
12月 30 14:28:09 localhost.localdomain kernel: 150048 total pagecache pages
12月 30 14:28:09 localhost.localdomain kernel: 0 pages in swap cache
12月 30 14:28:09 localhost.localdomain kernel: Swap cache stats: add 0, delete 0, find 0/0
12月 30 14:28:09 localhost.localdomain kernel: Free swap = 0kB
12月 30 14:28:09 localhost.localdomain kernel: Total swap = 0kB
12月 30 14:28:09 localhost.localdomain kernel: 2093968 pages RAM
12月 30 14:28:09 localhost.localdomain kernel: 0 pages HighMem/MovableOnly
12月 30 14:28:09 localhost.localdomain kernel: 25551 pages reserved
12月 30 14:28:09 localhost.localdomain kernel: 0 pages cma reserved
12月 30 14:28:09 localhost.localdomain kernel: 0 pages hwpoisoned
12月 30 14:28:09 localhost.localdomain kernel: Tasks state (memory values in pages):
12月 30 14:28:09 localhost.localdomain kernel: [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
12月 30 14:28:09 localhost.localdomain kernel: [ 1522] 0 1522 922 652 393216 0 -250 systemd-journal
12月 30 14:28:09 localhost.localdomain kernel: [ 1545] 0 1545 771 231 327680 0 -1000 systemd-udevd
12月 30 14:28:09 localhost.localdomain kernel: [ 2052] 81 2052 156 114 327680 0 -900 dbus-daemon
12月 30 14:28:09 localhost.localdomain kernel: [ 2056] 2 2056 1694 173 393216 0 0 rngd
12月 30 14:28:09 localhost.localdomain kernel: [ 2058] 0 2058 4377 331 393216 0 0 sssd
12月 30 14:28:09 localhost.localdomain kernel: [ 2059] 0 2059 149 99 327680 0 0 uharden_dbus_da
12月 30 14:28:09 localhost.localdomain kernel: [ 2061] 0 2061 1282 82 393216 0 -500 irqbalance
12月 30 14:28:09 localhost.localdomain kernel: [ 2068] 171 2068 7393 317 458752 0 0 pulseaudio
12月 30 14:28:09 localhost.localdomain kernel: [ 2080] 0 2080 4396 354 458752 0 0 sssd_be
12月 30 14:28:09 localhost.localdomain kernel: [ 2093] 0 2093 4580 714 458752 0 0 sssd_nss
12月 30 14:28:09 localhost.localdomain kernel: [ 2094] 0 2094 4065 303 393216 0 0 sssd_pam
12月 30 14:28:09 localhost.localdomain kernel: [ 2112] 0 2112 484 194 393216 0 0 systemd-logind
12月 30 14:28:09 localhost.localdomain kernel: [ 2116] 0 2116 7556 472 327680 0 0 NetworkManager
12月 30 14:28:09 localhost.localdomain kernel: [ 2135] 0 2135 397 169 393216 0 -1000 sshd
12月 30 14:28:09 localhost.localdomain kernel: [ 2138] 0 2138 21331 1143 524288 0 0 tuned
12月 30 14:28:09 localhost.localdomain kernel: [ 2146] 0 2146 3507 80 458752 0 0 crond
12月 30 14:28:09 localhost.localdomain kernel: [ 2181] 0 2181 488 189 393216 0 0 login
12月 30 14:28:09 localhost.localdomain kernel: [ 2135] 0 2135 397 169 393216 0 -1000 sshd
12月 30 14:28:09 localhost.localdomain kernel: [ 2138] 0 2138 21331 1143 524288 0 0 tuned
12月 30 14:28:09 localhost.localdomain kernel: [ 2146] 0 2146 3507 80 458752 0 0 crond
12月 30 14:28:09 localhost.localdomain kernel: [ 2181] 0 2181 488 189 393216 0 0 login
12月 30 14:28:09 localhost.localdomain kernel: [ 2182] 0 2182 3425 40 393216 0 0 agetty
12月 30 14:28:09 localhost.localdomain kernel: [ 2263] 996 2263 46861 391 917504 0 0 polkitd
12月 30 14:28:09 localhost.localdomain kernel: [ 2438] 0 2438 10519 920 458752 0 0 uos-license-age
12月 30 14:28:09 localhost.localdomain kernel: [ 2439] 0 2439 2963 354 458752 0 0 rsyslogd
12月 30 14:28:09 localhost.localdomain kernel: [ 2533] 0 2533 6470 395 458752 0 0 udisksd
12月 30 14:28:09 localhost.localdomain kernel: [ 2973] 0 2973 382 220 393216 0 0 systemd
12月 30 14:28:09 localhost.localdomain kernel: [ 2975] 0 2975 658 172 393216 0 0 (sd-pam)
12月 30 14:28:09 localhost.localdomain kernel: [ 2982] 0 2982 3492 83 393216 0 0 bash
12月 30 14:28:09 localhost.localdomain kernel: [ 3165] 0 3165 3424 85 327680 0 0 ping
12月 30 14:28:09 localhost.localdomain kernel: [ 9341] 0 9341 144 65 327680 0 -900 uos-permissionm
12月 30 14:28:09 localhost.localdomain kernel: [ 9772] 0 9772 98 46 393216 0 0 rdma-ndd
12月 30 14:28:09 localhost.localdomain kernel: [ 55698] 994 55698 205 55 393216 0 0 chronyd
12月 30 14:28:09 localhost.localdomain kernel: [ 69915] 1000 69915 837876 507211 6488064 0 0 tikv-server
12月 30 14:28:09 localhost.localdomain kernel: [ 71102] 1000 71102 11356 415 458752 0 0 node_exporter
12月 30 14:28:09 localhost.localdomain kernel: [ 71104] 1000 71104 3352 14 393216 0 0 run_node_export
12月 30 14:28:09 localhost.localdomain kernel: [ 71105] 1000 71105 3330 15 393216 0 0 tee
12月 30 14:28:09 localhost.localdomain kernel: [ 71268] 1000 71268 11485 172 458752 0 0 blackbox_export
12月 30 14:28:09 localhost.localdomain kernel: [ 71269] 1000 71269 3352 14 327680 0 0 run_blackbox_ex
12月 30 14:28:09 localhost.localdomain kernel: [ 71270] 1000 71270 3330 15 393216 0 0 tee
12月 30 14:28:09 localhost.localdomain kernel: oom-kill:constraint=CONSTRAINT_MEMORY_POLICY,nodemask=2,cpuset=/,mems_allowed=0-3,global_oom,task_memcg=/system.slice/tikv-20160.service,task=tikv->
12月 30 14:28:09 localhost.localdomain kernel: Out of memory: Kill process 69915 (tikv-server) score 967 or sacrifice child
12月 30 14:28:09 localhost.localdomain kernel: Killed process 69915 (tikv-server) total-vm:53624064kB, anon-rss:32061888kB, file-rss:399616kB, shmem-rss:0kB
12月 30 14:28:09 localhost.localdomain kernel: oom_reaper: reaped process 69915 (tikv-server), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
12月 30 14:28:09 localhost.localdomain systemd[1]: tikv-20160.service: Main process exited, code=killed, status=9/KILL
-- Subject: Unit process exited
- 日志中看到oom-kill:constraint=CONSTRAINT_MEMORY_POLICY,nodemask=2,cpuset=/,mems_allowed=0-3,这种字眼,去gpt搜索了一下反馈如下,这说明绑核限制了内存的跨numa访问。

- 为什么操作系统中的策略是default,而这里就绑定了呢,最后定位到tikv的自启脚本(一般是部署路径的/scripts/run_tikv.sh)发现如下配置,这说明强制绑定cpu和内存了,真相大白。

三、解决方式
根据发现的问题,就是numa绑核造成的内存不足,那么这里就好处理。
- 修改配置,修改tikv绑定和核数,我这里临时绑定了2个核心。这样就可以使用64GB内存。
- 调整tikv的参数,比如调小tikv.storage.block-cache.capacity更小。
四、总结
在tidb的使用过程中,真的是有很多小细节没有注意到造成严重的问题,吃一堑长一智,这次血的教训记录下来和大家共享,希望对大家有所帮助。