#2830·jemalloc

我的程序在 phn_merge 中循环了 20 多分钟,没有释放 mutex 锁 ecache,然后阻塞了所有其他线程。

作者: gelele创建于 2025年4月14日更新于 2026年2月19日

Env info Jemalloc 版本: 5.3.0 操作系统: Centos 7 C++ 工具链: C++ 921 1. 第一次捕获的 pstack 信息: 线程 237 (线程 0x7f833f9e7700 (LWP 2938)): #0 phn_merge (cmp=<优化出>, offset=40, phn1=0x7f839882fc80, phn0=0x7f839882fc80) 在 include/jemalloc/internal/ph.h:140 #1 phn_merge_siblings (cmp=<优化出>, offset=40, phn=<优化出>) 在 include/jemalloc/internal/ph.h:209 #2 ph_merge_children (cmp=<优化出>, offset=40, phn=0x7f80b3775000) 在 include/jemalloc/internal/ph.h:244 #3 ph_remove (cmp=<优化出>, offset=40, phn=phn@entry=0x7f80b3775000, ph=0x7f8398803d58, ph@entry=0x0) 在 include/jemalloc/internal/ph.h:389 #4 je_edata_heap_remove (ph=ph@entry=0x7f8398803d58, phn=phn@entry=0x7f8398831a00) 在 src/edata.c:6 #5 0x0000000003119349 in je_eset_remove (eset=0x7f8398803a98, edata=edata@entry=0x7f8398831a00) 在 src/eset.c:126 #6 0x000000000311c462 in extent_activate_locked (pac=<优化出>, ecache=<优化出>, edata=0x7f8398831a00, eset=<优化出>, tsdn=0x7f833f9e6900) 在 src/extent.c:280 #7 extent_recycle_extract (ehooks=0x7f83988000c0, guarded=<优化出>, alignment=64, size=102400, expand_edata=<优化出>, ecache=0x7f8398803a28, pac=0x7f83988039f0, tsdn=0x7f833f9e6900) 在 src/extent.c:444 #8 extent_recycle (tsdn=tsdn@entry=0x7f833f9e6900, pac=pac@entry=0x7f83988039f0, ehooks=ehooks@entry=0x7f83988000c0, ecache=ecache@entry=0x7f8398803a28, expand_edata=expand_edata@entry=0x0, size=size@entry=102400, alignment=alignment@entry=64, zero=zero@entry=false, commit=commit@entry=0x7f833f9e1800, growing_retained=growing_retained@entry=false, guarded=guarded@entry=false) 在 src/extent.c:606 #9 0x000000000311c8cd in je_ecache_alloc (tsdn=tsdn@entry=0x7f833f9e6900, pac=pac@entry=0x7f83988039f0, ehooks=ehooks@entry=0x7f83988000c0, ecache=ecache@entry=0x7f8398803a28, expand_edata=expand_edata@entry=0x0, size=size@entry=102400, alignment=alignment@entry=64, zero=zero@entry=false, guarded=guarded@entry=false) 在 src/extent.c:87 #10 0x000000000312989d in pac_alloc_real (guarded=false, zero=<优化出>, alignment=64, size=102400, ehooks=0x7f83988000c0, pac=0x7f83988039f0, tsdn=0x7f833f9e6900) 在 src/pac.c:116 #11 pac_alloc_impl (tsdn=0x7f833f9e6900, self=0x7f83988039f0, size=102400, alignment=64, zero=<优化出>, guarded=<优化出>, frequent_reuse=false, deferred_work_generated=0x7f833f9e1920) 在 src/pac.c:178 #12 0x0000000003127f0e in pai_alloc (deferred_work_generated=0x7f833f9e1920, frequent_reuse=false, guarded=<优化出>, zero=false, alignment=64, size=102400, self=0x7f83988039f0, tsdn=0x7f833f9e6900) 在 include/jemalloc/internal/pai.h:43 #13 je_pa_alloc (tsdn=tsdn@entry=0x7f833f9e6900, shard=shard@entry=0x7f83988039d8, size=size@entry=102400, alignment=alignment@entry=64, slab=slab@entry=false, szind=46, zero=zero@entry=false, guarded=false, deferred_work_generated=deferred_work_generated@entry=0x7f833f9e1920) 在 src/pa.c:139 #14 0x00000000030f074f in

内容来源: jemalloc/jemalloc