| .TH compactsnoop 8 "2019-11-1" "USER COMMANDS" |
| .SH NAME |
| compactsnoop \- Trace compact zone events. Uses Linux eBPF/bcc. |
| .SH SYNOPSIS |
| .B compactsnoop [\-h] [\-T] [\-p PID] [\-d DURATION] [\-K] [\-e] |
| .SH DESCRIPTION |
| compactsnoop traces the compact zone events, showing which processes are |
| allocing pages with memory compaction. This can be useful for discovering |
| when compact_stall (/proc/vmstat) continues to increase, whether it is |
| caused by some critical processes or not. |
| |
| This works by tracing the compact zone events using raw_tracepoints and one |
| kretprobe. |
| |
| For the Centos 7.6 (3.10.x kernel), see the version under tools/old, which |
| uses an older memory compaction mechanism. |
| |
| Since this uses BPF, only the root user can use this tool. |
| .SH REQUIREMENTS |
| CONFIG_BPF and bcc. |
| .SH OPTIONS |
| .TP |
| \-h |
| Print usage message. |
| .TP |
| \-T |
| Include a timestamp column. |
| .TP |
| \-p PID |
| Trace this process ID only (filtered in-kernel). |
| .TP |
| \-d DURATION |
| Total duration of trace in seconds. |
| .TP |
| \-K |
| Output kernel stack trace |
| .TP |
| \-e |
| Show extended fields. |
| .SH EXAMPLES |
| .TP |
| Trace all compact zone events: |
| # |
| .B compactsnoop |
| .TP |
| Trace all compact zone events, for 10 seconds only: |
| # |
| .B compactsnoop -d 10 |
| .SH FIELDS |
| .TP |
| TIME(s) |
| Time of the call, in seconds. |
| .TP |
| COMM |
| Process name |
| .TP |
| PID |
| Process ID |
| .TP |
| NODE |
| Memory node |
| .TP |
| ZONE |
| Zone of the node (such as DMA, DMA32, NORMAL eg) |
| .TP |
| ORDER |
| Shows which order alloc cause memory compaction, -1 means all orders (eg: write |
| to /proc/sys/vm/compact_memory) |
| .TP |
| MODE |
| SYNC OR ASYNC |
| .TP |
| FRAGIDX (extra column) |
| The FRAGIDX is short for fragmentation index, which only makes sense if an |
| allocation of a requested size would fail. If that is true, the fragmentation |
| index indicates whether external fragmentation or a lack of memory was the |
| problem. The value can be used to determine if page reclaim or compaction |
| should be used. |
| .PP |
| .in +8n |
| Index is between 0 and 1 so return within 3 decimal places |
| .PP |
| .in +8n |
| 0 => allocation would fail due to lack of memory |
| .PP |
| .in +8n |
| 1 => allocation would fail due to fragmentation |
| .TP |
| MIN (extra column) |
| The min watermark of the zone |
| .TP |
| LOW (extra column) |
| The low watermark of the zone |
| .TP |
| HIGH (extra column) |
| The high watermark of the zone |
| .TP |
| FREE (extra column) |
| The nr_free_pages of the zone |
| .TP |
| LAT(ms) |
| compact zone's latency |
| .TP |
| STATUS |
| The compaction's result. |
| .PP |
| .in +8n |
| For (CentOS 7.6's kernel), the status include: |
| .PP |
| .in +8n |
| "skipped" (COMPACT_SKIPPED): compaction didn't start as it was not possible or |
| direct reclaim was more suitable |
| .PP |
| .in +8n |
| "continue" (COMPACT_CONTINUE): compaction should continue to another pageblock |
| .PP |
| .in +8n |
| "partial" (COMPACT_PARTIAL): direct compaction partially compacted a zone and |
| there are suitable pages |
| .PP |
| .in +8n |
| "complete" (COMPACT_COMPLETE): The full zone was compacted |
| .PP |
| .in +8n |
| For (kernel 4.7 and above): |
| .PP |
| .in +8n |
| "not_suitable_zone" (COMPACT_NOT_SUITABLE_ZONE): For more detailed tracepoint |
| output - internal to compaction |
| .PP |
| .in +8n |
| "skipped" (COMPACT_SKIPPED): compaction didn't start as it was not possible or |
| direct reclaim was more suitable |
| .PP |
| .in +8n |
| "deferred" (COMPACT_DEFERRED): compaction didn't start as it was deferred due |
| to past failures |
| .PP |
| .in +8n |
| "no_suitable_page" (COMPACT_NOT_SUITABLE_PAGE): For more detailed tracepoint |
| output - internal to compaction |
| .PP |
| .in +8n |
| "continue" (COMPACT_CONTINUE): compaction should continue to another pageblock |
| .PP |
| .in +8n |
| "complete" (COMPACT_COMPLETE): The full zone was compacted scanned but wasn't |
| successful to compact suitable pages. |
| .PP |
| .in +8n |
| "partial_skipped" (COMPACT_PARTIAL_SKIPPED): direct compaction has scanned part |
| of the zone but wasn't successful to compact suitable pages. |
| .PP |
| .in +8n |
| "contended" (COMPACT_CONTENDED): compaction terminated prematurely due to lock |
| contentions |
| .PP |
| .in +8n |
| "success" (COMPACT_SUCCESS): direct compaction terminated after concluding that |
| the allocation should now succeed |
| .PP |
| .in +8n |
| .SH OVERHEAD |
| This traces the kernel compact zone kprobe/kretprobe or raw_tracepoints and |
| prints output for each event. As the rate of this is generally expected to be |
| low (< 1000/s), the overhead is also expected to be negligible. |
| .SH SOURCE |
| This is from bcc. |
| .IP |
| https://github.com/iovisor/bcc |
| .PP |
| Also look in the bcc distribution for a companion _examples.txt file containing |
| example usage, output, and commentary for this tool. |
| .SH OS |
| Linux |
| .SH STABILITY |
| Unstable - in development. |
| .SH AUTHOR |
| Wenbo Zhang |