1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of compactstall, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard Workercompactsnoop traces the compact zone system-wide, and print various details. 5*387f9dfdSAndroid Build Coastguard WorkerExample output (manual trigger by echo 1 > /proc/sys/vm/compact_memory): 6*387f9dfdSAndroid Build Coastguard Worker 7*387f9dfdSAndroid Build Coastguard Worker# ./compactsnoop 8*387f9dfdSAndroid Build Coastguard WorkerCOMM PID NODE ZONE ORDER MODE LAT(ms) STATUS 9*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA -1 SYNC 0.025 complete 10*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA32 -1 SYNC 3.925 complete 11*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_NORMAL -1 SYNC 113.975 complete 12*387f9dfdSAndroid Build Coastguard Workerzsh 23685 1 ZONE_NORMAL -1 SYNC 81.57 complete 13*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA -1 SYNC 0.02 complete 14*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA32 -1 SYNC 4.631 complete 15*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_NORMAL -1 SYNC 113.975 complete 16*387f9dfdSAndroid Build Coastguard Workerzsh 23685 1 ZONE_NORMAL -1 SYNC 80.647 complete 17*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA -1 SYNC 0.020 complete 18*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA32 -1 SYNC 3.367 complete 19*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_NORMAL -1 SYNC 115.18 complete 20*387f9dfdSAndroid Build Coastguard Workerzsh 23685 1 ZONE_NORMAL -1 SYNC 81.766 complete 21*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA -1 SYNC 0.025 complete 22*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA32 -1 SYNC 4.346 complete 23*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_NORMAL -1 SYNC 114.570 complete 24*387f9dfdSAndroid Build Coastguard Workerzsh 23685 1 ZONE_NORMAL -1 SYNC 80.820 complete 25*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA -1 SYNC 0.026 complete 26*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA32 -1 SYNC 4.611 complete 27*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_NORMAL -1 SYNC 113.993 complete 28*387f9dfdSAndroid Build Coastguard Workerzsh 23685 1 ZONE_NORMAL -1 SYNC 80.928 complete 29*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA -1 SYNC 0.02 complete 30*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_DMA32 -1 SYNC 3.889 complete 31*387f9dfdSAndroid Build Coastguard Workerzsh 23685 0 ZONE_NORMAL -1 SYNC 113.776 complete 32*387f9dfdSAndroid Build Coastguard Workerzsh 23685 1 ZONE_NORMAL -1 SYNC 80.727 complete 33*387f9dfdSAndroid Build Coastguard Worker^C 34*387f9dfdSAndroid Build Coastguard Worker 35*387f9dfdSAndroid Build Coastguard WorkerWhile tracing, the processes alloc pages due to memory fragmentation is too 36*387f9dfdSAndroid Build Coastguard Workerserious to meet contiguous memory requirements in the system, compact zone 37*387f9dfdSAndroid Build Coastguard Workerevents happened, which will increase the waiting delay of the processes. 38*387f9dfdSAndroid Build Coastguard Worker 39*387f9dfdSAndroid Build Coastguard Workercompactsnoop can be useful for discovering when compact_stall(/proc/vmstat) 40*387f9dfdSAndroid Build Coastguard Workercontinues to increase, whether it is caused by some critical processes or not. 41*387f9dfdSAndroid Build Coastguard Worker 42*387f9dfdSAndroid Build Coastguard WorkerThe STATUS include (CentOS 7.6's kernel) 43*387f9dfdSAndroid Build Coastguard Worker 44*387f9dfdSAndroid Build Coastguard Worker compact_status = { 45*387f9dfdSAndroid Build Coastguard Worker # COMPACT_SKIPPED: compaction didn't start as it was not possible or direct reclaim was more suitable 46*387f9dfdSAndroid Build Coastguard Worker 0: "skipped", 47*387f9dfdSAndroid Build Coastguard Worker # COMPACT_CONTINUE: compaction should continue to another pageblock 48*387f9dfdSAndroid Build Coastguard Worker 1: "continue", 49*387f9dfdSAndroid Build Coastguard Worker # COMPACT_PARTIAL: direct compaction partially compacted a zone and there are suitable pages 50*387f9dfdSAndroid Build Coastguard Worker 2: "partial", 51*387f9dfdSAndroid Build Coastguard Worker # COMPACT_COMPLETE: The full zone was compacted 52*387f9dfdSAndroid Build Coastguard Worker 3: "complete", 53*387f9dfdSAndroid Build Coastguard Worker } 54*387f9dfdSAndroid Build Coastguard Worker 55*387f9dfdSAndroid Build Coastguard Workeror (kernel 4.7 and above) 56*387f9dfdSAndroid Build Coastguard Worker 57*387f9dfdSAndroid Build Coastguard Worker compact_status = { 58*387f9dfdSAndroid Build Coastguard Worker # COMPACT_NOT_SUITABLE_ZONE: For more detailed tracepoint output - internal to compaction 59*387f9dfdSAndroid Build Coastguard Worker 0: "not_suitable_zone", 60*387f9dfdSAndroid Build Coastguard Worker # COMPACT_SKIPPED: compaction didn't start as it was not possible or direct reclaim was more suitable 61*387f9dfdSAndroid Build Coastguard Worker 1: "skipped", 62*387f9dfdSAndroid Build Coastguard Worker # COMPACT_DEFERRED: compaction didn't start as it was deferred due to past failures 63*387f9dfdSAndroid Build Coastguard Worker 2: "deferred", 64*387f9dfdSAndroid Build Coastguard Worker # COMPACT_NOT_SUITABLE_PAGE: For more detailed tracepoint output - internal to compaction 65*387f9dfdSAndroid Build Coastguard Worker 3: "no_suitable_page", 66*387f9dfdSAndroid Build Coastguard Worker # COMPACT_CONTINUE: compaction should continue to another pageblock 67*387f9dfdSAndroid Build Coastguard Worker 4: "continue", 68*387f9dfdSAndroid Build Coastguard Worker # COMPACT_COMPLETE: The full zone was compacted scanned but wasn't successful to compact suitable pages. 69*387f9dfdSAndroid Build Coastguard Worker 5: "complete", 70*387f9dfdSAndroid Build Coastguard Worker # COMPACT_PARTIAL_SKIPPED: direct compaction has scanned part of the zone but wasn't successful to compact suitable pages. 71*387f9dfdSAndroid Build Coastguard Worker 6: "partial_skipped", 72*387f9dfdSAndroid Build Coastguard Worker # COMPACT_CONTENDED: compaction terminated prematurely due to lock contentions 73*387f9dfdSAndroid Build Coastguard Worker 7: "contended", 74*387f9dfdSAndroid Build Coastguard Worker # COMPACT_SUCCESS: direct compaction terminated after concluding that the allocation should now succeed 75*387f9dfdSAndroid Build Coastguard Worker 8: "success", 76*387f9dfdSAndroid Build Coastguard Worker } 77*387f9dfdSAndroid Build Coastguard Worker 78*387f9dfdSAndroid Build Coastguard WorkerThe -p option can be used to filter on a PID, which is filtered in-kernel. Here 79*387f9dfdSAndroid Build Coastguard WorkerI've used it with -T to print timestamps: 80*387f9dfdSAndroid Build Coastguard Worker 81*387f9dfdSAndroid Build Coastguard Worker# ./compactsnoop -Tp 24376 82*387f9dfdSAndroid Build Coastguard WorkerTIME(s) COMM PID NODE ZONE ORDER MODE LAT(ms) STATUS 83*387f9dfdSAndroid Build Coastguard Worker101.364115000 zsh 24376 0 ZONE_DMA -1 SYNC 0.025 complete 84*387f9dfdSAndroid Build Coastguard Worker101.364555000 zsh 24376 0 ZONE_DMA32 -1 SYNC 3.925 complete 85*387f9dfdSAndroid Build Coastguard Worker^C 86*387f9dfdSAndroid Build Coastguard Worker 87*387f9dfdSAndroid Build Coastguard WorkerThis shows the zsh process allocs pages, and compact zone events happening, 88*387f9dfdSAndroid Build Coastguard Workerand the delays are not affected much. 89*387f9dfdSAndroid Build Coastguard Worker 90*387f9dfdSAndroid Build Coastguard WorkerA maximum tracing duration can be set with the -d option. For example, to trace 91*387f9dfdSAndroid Build Coastguard Workerfor 2 seconds: 92*387f9dfdSAndroid Build Coastguard Worker 93*387f9dfdSAndroid Build Coastguard Worker# ./compactsnoop -d 2 94*387f9dfdSAndroid Build Coastguard WorkerCOMM PID NODE ZONE ORDER MODE LAT(ms) STATUS 95*387f9dfdSAndroid Build Coastguard Workerzsh 26385 0 ZONE_DMA -1 SYNC 0.025444 complete 96*387f9dfdSAndroid Build Coastguard Worker^C 97*387f9dfdSAndroid Build Coastguard Worker 98*387f9dfdSAndroid Build Coastguard WorkerThe -e option prints out extra columns 99*387f9dfdSAndroid Build Coastguard Worker 100*387f9dfdSAndroid Build Coastguard Worker# ./compactsnoop -e 101*387f9dfdSAndroid Build Coastguard WorkerCOMM PID NODE ZONE ORDER MODE FRAGIDX MIN LOW HIGH FREE LAT(ms) STATUS 102*387f9dfdSAndroid Build Coastguard Workersumm 28276 1 ZONE_NORMAL 3 ASYNC 0.728 11284 14105 16926 14193 3.58 partial 103*387f9dfdSAndroid Build Coastguard Workersumm 28276 0 ZONE_NORMAL 2 ASYNC -1.000 11043 13803 16564 14479 0.0 complete 104*387f9dfdSAndroid Build Coastguard Workersumm 28276 1 ZONE_NORMAL 2 ASYNC -1.000 11284 14105 16926 14785 0.019 complete 105*387f9dfdSAndroid Build Coastguard Workersumm 28276 0 ZONE_NORMAL 2 ASYNC -1.000 11043 13803 16564 15199 0.006 partial 106*387f9dfdSAndroid Build Coastguard Workersumm 28276 1 ZONE_NORMAL 2 ASYNC -1.000 11284 14105 16926 17360 0.030 complete 107*387f9dfdSAndroid Build Coastguard Workersumm 28276 0 ZONE_NORMAL 2 ASYNC -1.000 11043 13803 16564 15443 0.024 complete 108*387f9dfdSAndroid Build Coastguard Workersumm 28276 1 ZONE_NORMAL 2 ASYNC -1.000 11284 14105 16926 15634 0.018 complete 109*387f9dfdSAndroid Build Coastguard Workersumm 28276 1 ZONE_NORMAL 3 ASYNC 0.832 11284 14105 16926 15301 0.006 partial 110*387f9dfdSAndroid Build Coastguard Workersumm 28276 0 ZONE_NORMAL 2 ASYNC -1.000 11043 13803 16564 14774 0.005 partial 111*387f9dfdSAndroid Build Coastguard Workersumm 28276 1 ZONE_NORMAL 3 ASYNC 0.733 11284 14105 16926 19888 0.012 partial 112*387f9dfdSAndroid Build Coastguard Worker^C 113*387f9dfdSAndroid Build Coastguard Worker 114*387f9dfdSAndroid Build Coastguard WorkerThe FRAGIDX is short for fragmentation index, which only makes sense if an 115*387f9dfdSAndroid Build Coastguard Workerallocation of a requested size would fail. If that is true, the fragmentation 116*387f9dfdSAndroid Build Coastguard Workerindex indicates whether external fragmentation or a lack of memory was the 117*387f9dfdSAndroid Build Coastguard Workerproblem. The value can be used to determine if page reclaim or compaction 118*387f9dfdSAndroid Build Coastguard Workershould be used. 119*387f9dfdSAndroid Build Coastguard Worker 120*387f9dfdSAndroid Build Coastguard WorkerIndex is between 0 and 1 so return within 3 decimal places 121*387f9dfdSAndroid Build Coastguard Worker 122*387f9dfdSAndroid Build Coastguard Worker0 => allocation would fail due to lack of memory 123*387f9dfdSAndroid Build Coastguard Worker1 => allocation would fail due to fragmentation 124*387f9dfdSAndroid Build Coastguard Worker 125*387f9dfdSAndroid Build Coastguard WorkerWe can see the whole buddy's fragmentation index from /sys/kernel/debug/extfrag/extfrag_index 126*387f9dfdSAndroid Build Coastguard Worker 127*387f9dfdSAndroid Build Coastguard WorkerThe MIN/LOW/HIGH shows the watermarks of the zone, which can also get from 128*387f9dfdSAndroid Build Coastguard Worker/proc/zoneinfo, and FREE means nr_free_pages (can be found in /proc/zoneinfo too). 129*387f9dfdSAndroid Build Coastguard Worker 130*387f9dfdSAndroid Build Coastguard Worker 131*387f9dfdSAndroid Build Coastguard WorkerThe -K option prints out kernel stack 132*387f9dfdSAndroid Build Coastguard Worker 133*387f9dfdSAndroid Build Coastguard Worker# ./compactsnoop -K -e 134*387f9dfdSAndroid Build Coastguard Worker 135*387f9dfdSAndroid Build Coastguard Workersumm 28276 0 ZONE_NORMAL 3 ASYNC 0.528 11043 13803 16564 22654 13.258 partial 136*387f9dfdSAndroid Build Coastguard Worker kretprobe_trampoline+0x0 137*387f9dfdSAndroid Build Coastguard Worker try_to_compact_pages+0x121 138*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_direct_compact+0xac 139*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_slowpath+0x3e9 140*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_nodemask+0x404 141*387f9dfdSAndroid Build Coastguard Worker alloc_pages_current+0x98 142*387f9dfdSAndroid Build Coastguard Worker new_slab+0x2c5 143*387f9dfdSAndroid Build Coastguard Worker ___slab_alloc+0x3ac 144*387f9dfdSAndroid Build Coastguard Worker __slab_alloc+0x40 145*387f9dfdSAndroid Build Coastguard Worker kmem_cache_alloc_node+0x8b 146*387f9dfdSAndroid Build Coastguard Worker copy_process+0x18e 147*387f9dfdSAndroid Build Coastguard Worker do_fork+0x91 148*387f9dfdSAndroid Build Coastguard Worker sys_clone+0x16 149*387f9dfdSAndroid Build Coastguard Worker stub_clone+0x44 150*387f9dfdSAndroid Build Coastguard Worker 151*387f9dfdSAndroid Build Coastguard Workersumm 28276 1 ZONE_NORMAL 3 ASYNC -1.000 11284 14105 16926 22074 0.008 partial 152*387f9dfdSAndroid Build Coastguard Worker kretprobe_trampoline+0x0 153*387f9dfdSAndroid Build Coastguard Worker try_to_compact_pages+0x121 154*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_direct_compact+0xac 155*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_slowpath+0x3e9 156*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_nodemask+0x404 157*387f9dfdSAndroid Build Coastguard Worker alloc_pages_current+0x98 158*387f9dfdSAndroid Build Coastguard Worker new_slab+0x2c5 159*387f9dfdSAndroid Build Coastguard Worker ___slab_alloc+0x3ac 160*387f9dfdSAndroid Build Coastguard Worker __slab_alloc+0x40 161*387f9dfdSAndroid Build Coastguard Worker kmem_cache_alloc_node+0x8b 162*387f9dfdSAndroid Build Coastguard Worker copy_process+0x18e 163*387f9dfdSAndroid Build Coastguard Worker do_fork+0x91 164*387f9dfdSAndroid Build Coastguard Worker sys_clone+0x16 165*387f9dfdSAndroid Build Coastguard Worker stub_clone+0x44 166*387f9dfdSAndroid Build Coastguard Worker 167*387f9dfdSAndroid Build Coastguard Workersumm 28276 0 ZONE_NORMAL 3 ASYNC 0.527 11043 13803 16564 25653 9.812 partial 168*387f9dfdSAndroid Build Coastguard Worker kretprobe_trampoline+0x0 169*387f9dfdSAndroid Build Coastguard Worker try_to_compact_pages+0x121 170*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_direct_compact+0xac 171*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_slowpath+0x3e9 172*387f9dfdSAndroid Build Coastguard Worker __alloc_pages_nodemask+0x404 173*387f9dfdSAndroid Build Coastguard Worker alloc_pages_current+0x98 174*387f9dfdSAndroid Build Coastguard Worker new_slab+0x2c5 175*387f9dfdSAndroid Build Coastguard Worker ___slab_alloc+0x3ac 176*387f9dfdSAndroid Build Coastguard Worker __slab_alloc+0x40 177*387f9dfdSAndroid Build Coastguard Worker kmem_cache_alloc_node+0x8b 178*387f9dfdSAndroid Build Coastguard Worker copy_process+0x18e 179*387f9dfdSAndroid Build Coastguard Worker do_fork+0x91 180*387f9dfdSAndroid Build Coastguard Worker sys_clone+0x16 181*387f9dfdSAndroid Build Coastguard Worker stub_clone+0x44 182*387f9dfdSAndroid Build Coastguard Worker 183*387f9dfdSAndroid Build Coastguard Worker# ./compactsnoop -h 184*387f9dfdSAndroid Build Coastguard Workerusage: compactsnoop.py [-h] [-T] [-p PID] [-d DURATION] [-K] [-e] 185*387f9dfdSAndroid Build Coastguard Worker 186*387f9dfdSAndroid Build Coastguard WorkerTrace compact zone 187*387f9dfdSAndroid Build Coastguard Worker 188*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 189*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 190*387f9dfdSAndroid Build Coastguard Worker -T, --timestamp include timestamp on output 191*387f9dfdSAndroid Build Coastguard Worker -p PID, --pid PID trace this PID only 192*387f9dfdSAndroid Build Coastguard Worker -d DURATION, --duration DURATION 193*387f9dfdSAndroid Build Coastguard Worker total duration of trace in seconds 194*387f9dfdSAndroid Build Coastguard Worker -K, --kernel-stack output kernel stack trace 195*387f9dfdSAndroid Build Coastguard Worker -e, --extended_fields 196*387f9dfdSAndroid Build Coastguard Worker show system memory state 197*387f9dfdSAndroid Build Coastguard Worker 198*387f9dfdSAndroid Build Coastguard Workerexamples: 199*387f9dfdSAndroid Build Coastguard Worker ./compactsnoop # trace all compact stall 200*387f9dfdSAndroid Build Coastguard Worker ./compactsnoop -T # include timestamps 201*387f9dfdSAndroid Build Coastguard Worker ./compactsnoop -d 10 # trace for 10 seconds only 202*387f9dfdSAndroid Build Coastguard Worker ./compactsnoop -K # output kernel stack trace 203*387f9dfdSAndroid Build Coastguard Worker ./compactsnoop -e # show extended fields 204