| Suchakra Sharma | c497056 | 2015-08-03 19:22:22 -0400 | [diff] [blame] | 1 |  |
| Brenden | c3c4fc1 | 2015-05-03 08:33:53 -0700 | [diff] [blame] | 2 | # BPF Compiler Collection (BCC) |
| 3 | |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 4 | BCC is a toolkit for creating efficient kernel tracing and manipulation |
| Brendan Gregg | 239e863 | 2016-07-25 15:02:32 -0700 | [diff] [blame] | 5 | programs, and includes several useful tools and examples. It makes use of |
| 6 | extended BPF (Berkeley Packet Filters), formally known as eBPF, a new feature |
| 7 | that was first added to Linux 3.15. Much of what BCC uses requires Linux 4.1 |
| 8 | and above. |
| Brenden | c3c4fc1 | 2015-05-03 08:33:53 -0700 | [diff] [blame] | 9 | |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 10 | eBPF was [described by](https://lkml.org/lkml/2015/4/14/232) Ingo Molnár as: |
| 11 | |
| 12 | > One of the more interesting features in this cycle is the ability to attach eBPF programs (user-defined, sandboxed bytecode executed by the kernel) to kprobes. This allows user-defined instrumentation on a live kernel image that can never crash, hang or interfere with the kernel negatively. |
| 13 | |
| Brendan Gregg | 239e863 | 2016-07-25 15:02:32 -0700 | [diff] [blame] | 14 | BCC makes BPF programs easier to write, with kernel instrumentation in C |
| 15 | (and includes a C wrapper around LLVM), and front-ends in Python and lua. |
| 16 | It is suited for many tasks, including performance analysis and network |
| 17 | traffic control. |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 18 | |
| 19 | ## Screenshot |
| 20 | |
| 21 | This example traces a disk I/O kernel function, and populates an in-kernel |
| 22 | power-of-2 histogram of the I/O size. For efficiency, only the histogram |
| 23 | summary is returned to user-level. |
| 24 | |
| 25 | ```Shell |
| 26 | # ./bitehist.py |
| 27 | Tracing... Hit Ctrl-C to end. |
| 28 | ^C |
| Brendan Gregg | 8d70a88 | 2015-09-25 11:07:23 -0700 | [diff] [blame] | 29 | kbytes : count distribution |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 30 | 0 -> 1 : 3 | | |
| 31 | 2 -> 3 : 0 | | |
| 32 | 4 -> 7 : 211 |********** | |
| 33 | 8 -> 15 : 0 | | |
| 34 | 16 -> 31 : 0 | | |
| 35 | 32 -> 63 : 0 | | |
| 36 | 64 -> 127 : 1 | | |
| 37 | 128 -> 255 : 800 |**************************************| |
| 38 | ``` |
| 39 | |
| 40 | The above output shows a bimodal distribution, where the largest mode of |
| 41 | 800 I/O was between 128 and 255 Kbytes in size. |
| 42 | |
| Brendan Gregg | 310ab53 | 2016-07-24 13:34:40 -0700 | [diff] [blame] | 43 | See the source: [bitehist.py](examples/tracing/bitehist.py). What this traces, |
| 44 | what this stores, and how the data is presented, can be entirely customized. |
| 45 | This shows only some of many possible capabilities. |
| Brenden | c3c4fc1 | 2015-05-03 08:33:53 -0700 | [diff] [blame] | 46 | |
| Brenden Blanco | 3151843 | 2015-07-07 17:38:30 -0700 | [diff] [blame] | 47 | ## Installing |
| 48 | |
| 49 | See [INSTALL.md](INSTALL.md) for installation steps on your platform. |
| 50 | |
| Jean-Tiare Le Bigot | 94e911c | 2016-02-21 23:01:05 +0100 | [diff] [blame] | 51 | ## FAQ |
| 52 | |
| 53 | See [FAQ.txt](FAQ.txt) for the most common troubleshoot questions. |
| 54 | |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 55 | ## Contents |
| 56 | |
| 57 | Some of these are single files that contain both C and Python, others have a |
| 58 | pair of .c and .py files, and some are directories of files. |
| 59 | |
| 60 | ### Tracing |
| 61 | |
| Sasha Goldshtein | 2161e75 | 2017-02-09 10:25:20 -0500 | [diff] [blame] | 62 | #### Examples: |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 63 | |
| Brendan Gregg | 310ab53 | 2016-07-24 13:34:40 -0700 | [diff] [blame] | 64 | - examples/tracing/[bitehist.py](examples/tracing/bitehist.py): Block I/O size histogram. [Examples](examples/tracing/bitehist_example.txt). |
| Brendan Gregg | 9894e3e | 2016-07-24 13:37:20 -0700 | [diff] [blame] | 65 | - examples/tracing/[disksnoop.py](examples/tracing/disksnoop.py): Trace block device I/O latency. [Examples](examples/tracing/disksnoop_example.txt). |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 66 | - examples/[hello_world.py](examples/hello_world.py): Prints "Hello, World!" for new processes. |
| Brendan Gregg | d602d6b | 2016-08-01 16:18:40 -0700 | [diff] [blame] | 67 | - examples/tracing/[mysqld_query.py](examples/tracing/mysqld_query.py): Trace MySQL server queries using USDT probes. [Examples](examples/tracing/mysqld_query_example.txt). |
| 68 | - examples/tracing/[nodejs_http_server.py](examples/tracing/nodejs_http_server.py): Trace Node.js HTTP server requests using USDT probes. [Examples](examples/tracing/nodejs_http_server_example.txt). |
| Brendan Gregg | b79df7b | 2016-07-24 13:40:25 -0700 | [diff] [blame] | 69 | - examples/tracing/[task_switch.py](examples/tracing/task_switch.py): Count task switches with from and to PIDs. |
| Eduardo Urias | 64908b9 | 2016-04-06 17:18:20 -0400 | [diff] [blame] | 70 | - examples/tracing/[tcpv4connect.py](examples/tracing/tcpv4connect.py): Trace TCP IPv4 active connections. [Examples](examples/tracing/tcpv4connect_example.txt). |
| Dr.Z | d978a0d | 2015-11-12 04:45:21 +0900 | [diff] [blame] | 71 | - examples/tracing/[trace_fields.py](examples/tracing/trace_fields.py): Simple example of printing fields from traced events. |
| Brendan Gregg | e422f5e | 2016-07-01 18:38:30 -0700 | [diff] [blame] | 72 | - examples/tracing/[urandomread.py](examples/tracing/urandomread.py): A kernel tracepoint example, which traces random:urandom_read. [Examples](examples/tracing/urandomread_example.txt). |
| Dr.Z | d978a0d | 2015-11-12 04:45:21 +0900 | [diff] [blame] | 73 | - examples/tracing/[vfsreadlat.py](examples/tracing/vfsreadlat.py) examples/tracing/[vfsreadlat.c](examples/tracing/vfsreadlat.c): VFS read latency distribution. [Examples](examples/tracing/vfsreadlat_example.txt). |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 74 | |
| Brendan Gregg | 42cf2bf | 2016-02-23 16:26:43 -0800 | [diff] [blame] | 75 | #### Tools: |
| Brendan Gregg | 4ec5e4d | 2017-02-08 23:49:21 -0800 | [diff] [blame] | 76 | <center><a href="images/bcc_tracing_tools_2017.png"><img src="images/bcc_tracing_tools_2017.png" border=0 width=700></a></center> |
| Sasha Goldshtein | 6ae261e | 2016-02-14 08:32:54 -0800 | [diff] [blame] | 77 | - tools/[argdist](tools/argdist.py): Display function parameter values as a histogram or frequency count. [Examples](tools/argdist_example.txt). |
| Brendan Gregg | aa87997 | 2016-01-28 22:43:37 -0800 | [diff] [blame] | 78 | - tools/[bashreadline](tools/bashreadline.py): Print entered bash commands system wide. [Examples](tools/bashreadline_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 79 | - tools/[biolatency](tools/biolatency.py): Summarize block device I/O latency as a histogram. [Examples](tools/biolatency_example.txt). |
| Brendan Gregg | 6f075b9 | 2016-02-07 00:46:34 -0800 | [diff] [blame] | 80 | - tools/[biotop](tools/biotop.py): Top for disks: Summarize block device I/O by process. [Examples](tools/biotop_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 81 | - tools/[biosnoop](tools/biosnoop.py): Trace block device I/O with PID and latency. [Examples](tools/biosnoop_example.txt). |
| Allan McAleavy | eb3c960 | 2016-02-06 12:06:18 +0000 | [diff] [blame] | 82 | - tools/[bitesize](tools/bitesize.py): Show per process I/O size histogram. [Examples](tools/bitesize_example.txt). |
| Brendan Gregg | ddce4db | 2016-02-15 22:24:02 -0800 | [diff] [blame] | 83 | - tools/[btrfsdist](tools/btrfsdist.py): Summarize btrfs operation latency distribution as a histogram. [Examples](tools/btrfsdist_example.txt). |
| Brendan Gregg | ee74c37 | 2016-02-15 22:22:19 -0800 | [diff] [blame] | 84 | - tools/[btrfsslower](tools/btrfsslower.py): Trace slow btrfs operations. [Examples](tools/btrfsslower_example.txt). |
| Brendan Gregg | 1298998 | 2016-09-14 08:15:09 -0700 | [diff] [blame] | 85 | - tools/[capable](tools/capable.py): Trace security capability checks. [Examples](tools/capable_example.txt). |
| unixtest | 57abe5b | 2016-01-31 10:47:03 +0000 | [diff] [blame] | 86 | - tools/[cachestat](tools/cachestat.py): Trace page cache hit/miss ratio. [Examples](tools/cachestat_example.txt). |
| chantra | e159f7e | 2016-07-23 15:33:11 +0200 | [diff] [blame] | 87 | - tools/[cachetop](tools/cachetop.py): Trace page cache hit/miss ratio by processes. [Examples](tools/cachetop_example.txt). |
| Sasha Goldshtein | 9972f27 | 2016-06-29 01:48:08 -0700 | [diff] [blame] | 88 | - tools/[cpudist](tools/cpudist.py): Summarize on- and off-CPU time per task as a histogram. [Examples](tools/cpudist_example.txt) |
| Brendan Gregg | 3f3acd8 | 2016-12-21 15:34:09 -0800 | [diff] [blame] | 89 | - tools/[cpuunclaimed](tools/cpuunclaimed.py): Sample CPU run queues and calculate unclaimed idle CPU. [Examples](tools/cpuunclaimed_example.txt) |
| Sasha Goldshtein | 2161e75 | 2017-02-09 10:25:20 -0500 | [diff] [blame] | 90 | - tools/[dbslower](tools/dbslower.py): Trace MySQL/PostgreSQL queries slower than a threshold. [Examples](tools/dbslower_example.txt). |
| 91 | - tools/[dbstat](tools/dbstat.py): Summarize MySQL/PostgreSQL query latency as a histogram. [Examples](tools/dbstat_example.txt). |
| Brendan Gregg | 2757f0e | 2016-02-10 01:38:32 -0800 | [diff] [blame] | 92 | - tools/[dcsnoop](tools/dcsnoop.py): Trace directory entry cache (dcache) lookups. [Examples](tools/dcsnoop_example.txt). |
| Brendan Gregg | 5bfadab | 2016-02-10 01:36:51 -0800 | [diff] [blame] | 93 | - tools/[dcstat](tools/dcstat.py): Directory entry cache (dcache) stats. [Examples](tools/dcstat_example.txt). |
| Sasha Goldshtein | 2161e75 | 2017-02-09 10:25:20 -0500 | [diff] [blame] | 94 | - tools/[deadlock_detector](tools/deadlock_detector.py): Detect potential deadlocks on a running process. [Examples](tools/deadlock_detector_example.txt). |
| Brendan Gregg | 3e4b747 | 2016-02-14 18:16:06 -0800 | [diff] [blame] | 95 | - tools/[execsnoop](tools/execsnoop.py): Trace new processes via exec() syscalls. [Examples](tools/execsnoop_example.txt). |
| Brendan Gregg | 157fee3 | 2016-02-14 23:31:14 -0800 | [diff] [blame] | 96 | - tools/[ext4dist](tools/ext4dist.py): Summarize ext4 operation latency distribution as a histogram. [Examples](tools/ext4dist_example.txt). |
| Brendan Gregg | cd1cad1 | 2016-02-12 02:27:19 -0800 | [diff] [blame] | 97 | - tools/[ext4slower](tools/ext4slower.py): Trace slow ext4 operations. [Examples](tools/ext4slower_example.txt). |
| Brendan Gregg | dc642c5 | 2016-02-09 00:32:51 -0800 | [diff] [blame] | 98 | - tools/[filelife](tools/filelife.py): Trace the lifespan of short-lived files. [Examples](tools/filelife_example.txt). |
| Brendan Gregg | 75d3e9d | 2016-02-07 18:48:20 -0800 | [diff] [blame] | 99 | - tools/[fileslower](tools/fileslower.py): Trace slow synchronous file reads and writes. [Examples](tools/fileslower_example.txt). |
| Brendan Gregg | 08c2981 | 2016-02-09 00:36:43 -0800 | [diff] [blame] | 100 | - tools/[filetop](tools/filetop.py): File reads and writes by filename and process. Top for files. [Examples](tools/filetop_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 101 | - tools/[funccount](tools/funccount.py): Count kernel function calls. [Examples](tools/funccount_example.txt). |
| Sasha Goldshtein | a466c46 | 2016-10-06 21:17:59 +0300 | [diff] [blame] | 102 | - tools/[funclatency](tools/funclatency.py): Time functions and show their latency distribution. [Examples](tools/funclatency_example.txt). |
| Brendan Gregg | 5a06c2c | 2016-01-28 23:00:00 -0800 | [diff] [blame] | 103 | - tools/[gethostlatency](tools/gethostlatency.py): Show latency for getaddrinfo/gethostbyname[2] calls. [Examples](tools/gethostlatency_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 104 | - tools/[hardirqs](tools/hardirqs.py): Measure hard IRQ (hard interrupt) event time. [Examples](tools/hardirqs_example.txt). |
| 105 | - tools/[killsnoop](tools/killsnoop.py): Trace signals issued by the kill() syscall. [Examples](tools/killsnoop_example.txt). |
| Brendan Gregg | 715f7e6 | 2016-10-20 22:50:08 -0700 | [diff] [blame] | 106 | - tools/[llcstat](tools/llcstat.py): Summarize CPU cache references and misses by process. [Examples](tools/llcstat_example.txt). |
| Brendan Gregg | a691c54 | 2016-02-14 18:22:57 -0800 | [diff] [blame] | 107 | - tools/[mdflush](tools/mdflush.py): Trace md flush events. [Examples](tools/mdflush_example.txt). |
| Brendan Gregg | d602d6b | 2016-08-01 16:18:40 -0700 | [diff] [blame] | 108 | - tools/[mysqld_qslower](tools/mysqld_qslower.py): Trace MySQL server queries slower than a threshold. [Examples](tools/mysqld_qslower_example.txt). |
| Sasha Goldshtein | 5687579 | 2016-02-14 07:53:59 -0800 | [diff] [blame] | 109 | - tools/[memleak](tools/memleak.py): Display outstanding memory allocations to find memory leaks. [Examples](tools/memleak_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 110 | - tools/[offcputime](tools/offcputime.py): Summarize off-CPU time by kernel stack trace. [Examples](tools/offcputime_example.txt). |
| Brendan Gregg | af2b46a | 2016-01-30 11:02:29 -0800 | [diff] [blame] | 111 | - tools/[offwaketime](tools/offwaketime.py): Summarize blocked time by kernel off-CPU stack and waker stack. [Examples](tools/offwaketime_example.txt). |
| Brendan Gregg | fe430e5 | 2016-02-10 01:34:53 -0800 | [diff] [blame] | 112 | - tools/[oomkill](tools/oomkill.py): Trace the out-of-memory (OOM) killer. [Examples](tools/oomkill_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 113 | - tools/[opensnoop](tools/opensnoop.py): Trace open() syscalls. [Examples](tools/opensnoop_example.txt). |
| 114 | - tools/[pidpersec](tools/pidpersec.py): Count new processes (via fork). [Examples](tools/pidpersec_example.txt). |
| Brendan Gregg | f4bf275 | 2016-07-21 18:13:24 -0700 | [diff] [blame] | 115 | - tools/[profile](tools/profile.py): Profile CPU usage by sampling stack traces at a timed interval. [Examples](tools/profile_example.txt). |
| Brendan Gregg | 72027c1 | 2016-10-19 18:48:17 -0700 | [diff] [blame] | 116 | - tools/[reset-trace](tools/reset-trace.sh): Reset the state of tracing. Maintenance tool only. [Examples](tools/reset-trace_example.txt). |
| Brendan Gregg | 3a391c2 | 2016-02-08 01:20:31 -0800 | [diff] [blame] | 117 | - tools/[runqlat](tools/runqlat.py): Run queue (scheduler) latency as a histogram. [Examples](tools/runqlat_example.txt). |
| Brendan Gregg | 251823a | 2016-12-14 12:10:59 -0800 | [diff] [blame] | 118 | - tools/[runqlen](tools/runqlen.py): Run queue length as a histogram. [Examples](tools/runqlen_example.txt). |
| Sasha Goldshtein | 2161e75 | 2017-02-09 10:25:20 -0500 | [diff] [blame] | 119 | - tools/[slabratetop](tools/slabratetop.py): Kernel SLAB/SLUB memory cache allocation rate top. [Examples](tools/slabratetop_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 120 | - tools/[softirqs](tools/softirqs.py): Measure soft IRQ (soft interrupt) event time. [Examples](tools/softirqs_example.txt). |
| Jean-Tiare Le Bigot | a1ac2f9 | 2016-03-04 21:45:32 +0100 | [diff] [blame] | 121 | - tools/[solisten](tools/solisten.py): Trace TCP socket listen. [Examples](tools/solisten_example.txt). |
| Adrian Lopez | d496d5c | 2016-08-16 17:49:49 +0200 | [diff] [blame] | 122 | - tools/[sslsniff](tools/sslsniff.py): Sniff OpenSSL written and readed data. [Examples](tools/sslsniff_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 123 | - tools/[stackcount](tools/stackcount.py): Count kernel function calls and their stack traces. [Examples](tools/stackcount_example.txt). |
| 124 | - tools/[stacksnoop](tools/stacksnoop.py): Trace a kernel function and print all kernel stack traces. [Examples](tools/stacksnoop_example.txt). |
| Brendan Gregg | ad341c9 | 2016-02-09 00:31:24 -0800 | [diff] [blame] | 125 | - tools/[statsnoop](tools/statsnoop.py): Trace stat() syscalls. [Examples](tools/statsnoop_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 126 | - tools/[syncsnoop](tools/syncsnoop.py): Trace sync() syscall. [Examples](tools/syncsnoop_example.txt). |
| Sasha Goldshtein | 8e583cc | 2017-02-09 10:11:50 -0500 | [diff] [blame] | 127 | - tools/[syscount](tools/syscount.py): Summarize syscall counts and latencies. [Examples](tools/syscount_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 128 | - tools/[tcpaccept](tools/tcpaccept.py): Trace TCP passive connections (accept()). [Examples](tools/tcpaccept_example.txt). |
| 129 | - tools/[tcpconnect](tools/tcpconnect.py): Trace TCP active connections (connect()). [Examples](tools/tcpconnect_example.txt). |
| Brendan Gregg | afc9725 | 2016-02-19 16:07:36 -0800 | [diff] [blame] | 130 | - tools/[tcpconnlat](tools/tcpconnlat.py): Trace TCP active connection latency (connect()). [Examples](tools/tcpconnlat_example.txt). |
| Brendan Gregg | 797c3ec | 2016-10-19 18:55:10 -0700 | [diff] [blame] | 131 | - tools/[tcplife](tools/tcplife.py): Trace TCP sessions and summarize lifespan. [Examples](tools/tcplife_example.txt). |
| Brendan Gregg | 553f2aa | 2016-02-14 18:15:24 -0800 | [diff] [blame] | 132 | - tools/[tcpretrans](tools/tcpretrans.py): Trace TCP retransmits and TLPs. [Examples](tools/tcpretrans_example.txt). |
| Brendan Gregg | 60393ea | 2016-10-04 15:18:11 -0700 | [diff] [blame] | 133 | - tools/[tcptop](tools/tcptop.py): Summarize TCP send/recv throughput by host. Top for TCP. [Examples](tools/tcptop_example.txt). |
| Sasha Goldshtein | 3e39a08 | 2016-03-24 08:39:47 -0700 | [diff] [blame] | 134 | - tools/[tplist](tools/tplist.py): Display kernel tracepoints or USDT probes and their formats. [Examples](tools/tplist_example.txt). |
| Sasha Goldshtein | 2161e75 | 2017-02-09 10:25:20 -0500 | [diff] [blame] | 135 | - tools/[trace](tools/trace.py): Trace arbitrary functions, with filters. [Examples](tools/trace_example.txt). |
| 136 | - tools/[ttysnoop](tools/ttysnoop.py): Watch live output from a tty or pts device. [Examples](tools/ttysnoop_example.txt). |
| 137 | - tools/[ucalls](tools/ucalls.py): Summarize method calls or Linux syscalls in high-level languages. [Examples](tools/ucalls_example.txt). |
| 138 | - tools/[uflow](tools/uflow.py): Print a method flow graph in high-level languages. [Examples](tools/uflow_example.txt). |
| 139 | - tools/[ugc](tools/ugc.py): Trace garbage collection events in high-level languages. [Examples](tools/ugc_example.txt). |
| 140 | - tools/[uobjnew](tools/uobjnew.py): Summarize object allocation events by object type and number of bytes allocated. [Examples](tools/uobjnew_example.txt). |
| 141 | - tools/[ustat](tools/ustat.py): Collect events such as GCs, thread creations, object allocations, exceptions and more in high-level languages. [Examples](tools/ustat_example.txt). |
| 142 | - tools/[uthreads](tools/uthreads.py): Trace thread creation events in Java and raw pthreads. [Examples](tools/uthreads_example.txt). |
| Brendan Gregg | 7bf0e49 | 2016-01-27 23:17:40 -0800 | [diff] [blame] | 143 | - tools/[vfscount](tools/vfscount.py) tools/[vfscount.c](tools/vfscount.c): Count VFS calls. [Examples](tools/vfscount_example.txt). |
| 144 | - tools/[vfsstat](tools/vfsstat.py) tools/[vfsstat.c](tools/vfsstat.c): Count some VFS calls, with column output. [Examples](tools/vfsstat_example.txt). |
| 145 | - tools/[wakeuptime](tools/wakeuptime.py): Summarize sleep to wakeup time by waker kernel stack. [Examples](tools/wakeuptime_example.txt). |
| Brendan Gregg | 157fee3 | 2016-02-14 23:31:14 -0800 | [diff] [blame] | 146 | - tools/[xfsdist](tools/xfsdist.py): Summarize XFS operation latency distribution as a histogram. [Examples](tools/xfsdist_example.txt). |
| Brendan Gregg | 23c96fe | 2016-02-12 02:25:32 -0800 | [diff] [blame] | 147 | - tools/[xfsslower](tools/xfsslower.py): Trace slow XFS operations. [Examples](tools/xfsslower_example.txt). |
| Brendan Gregg | 157fee3 | 2016-02-14 23:31:14 -0800 | [diff] [blame] | 148 | - tools/[zfsdist](tools/zfsdist.py): Summarize ZFS operation latency distribution as a histogram. [Examples](tools/zfsdist_example.txt). |
| Brendan Gregg | bc54bb6 | 2016-02-14 23:13:13 -0800 | [diff] [blame] | 149 | - tools/[zfsslower](tools/zfsslower.py): Trace slow ZFS operations. [Examples](tools/zfsslower_example.txt). |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 150 | |
| 151 | ### Networking |
| 152 | |
| 153 | Examples: |
| 154 | |
| Dr.Z | d978a0d | 2015-11-12 04:45:21 +0900 | [diff] [blame] | 155 | - examples/networking/[distributed_bridge/](examples/networking/distributed_bridge): Distributed bridge example. |
| Bertrone Matteo | 46974b1 | 2016-02-18 12:36:28 +0100 | [diff] [blame] | 156 | - examples/networking/[http_filter/](examples/networking/http_filter): Simple HTTP filter example. |
| Dr.Z | d978a0d | 2015-11-12 04:45:21 +0900 | [diff] [blame] | 157 | - examples/networking/[simple_tc.py](examples/networking/simple_tc.py): Simple traffic control example. |
| 158 | - examples/networking/[simulation.py](examples/networking/simulation.py): Simulation helper. |
| 159 | - examples/networking/neighbor_sharing/[tc_neighbor_sharing.py](examples/networking/neighbor_sharing/tc_neighbor_sharing.py) examples/networking/neighbor_sharing/[tc_neighbor_sharing.c](examples/networking/neighbor_sharing/tc_neighbor_sharing.c): Per-IP classification and rate limiting. |
| 160 | - examples/networking/[tunnel_monitor/](examples/networking/tunnel_monitor): Efficiently monitor traffic flows. [Example video](https://www.youtube.com/watch?v=yYy3Cwce02k). |
| 161 | - examples/networking/vlan_learning/[vlan_learning.py](examples/networking/vlan_learning/vlan_learning.py) examples/[vlan_learning.c](examples/networking/vlan_learning/vlan_learning.c): Demux Ethernet traffic into worker veth+namespaces. |
| Brendan Gregg | 493fd62 | 2015-09-10 14:46:52 -0700 | [diff] [blame] | 162 | |
| Brenden | c3c4fc1 | 2015-05-03 08:33:53 -0700 | [diff] [blame] | 163 | ## Motivation |
| 164 | |
| 165 | BPF guarantees that the programs loaded into the kernel cannot crash, and |
| Brenden Blanco | 452de20 | 2015-05-03 10:43:07 -0700 | [diff] [blame] | 166 | cannot run forever, but yet BPF is general purpose enough to perform many |
| 167 | arbitrary types of computation. Currently, it is possible to write a program in |
| Brenden | c3c4fc1 | 2015-05-03 08:33:53 -0700 | [diff] [blame] | 168 | C that will compile into a valid BPF program, yet it is vastly easier to |
| 169 | write a C program that will compile into invalid BPF (C is like that). The user |
| Brenden Blanco | 452de20 | 2015-05-03 10:43:07 -0700 | [diff] [blame] | 170 | won't know until trying to run the program whether it was valid or not. |
| Brenden | c3c4fc1 | 2015-05-03 08:33:53 -0700 | [diff] [blame] | 171 | |
| 172 | With a BPF-specific frontend, one should be able to write in a language and |
| 173 | receive feedback from the compiler on the validity as it pertains to a BPF |
| 174 | backend. This toolkit aims to provide a frontend that can only create valid BPF |
| 175 | programs while still harnessing its full flexibility. |
| 176 | |
| Brenden Blanco | 46176a1 | 2015-07-07 13:05:22 -0700 | [diff] [blame] | 177 | Furthermore, current integrations with BPF have a kludgy workflow, sometimes |
| 178 | involving compiling directly in a linux kernel source tree. This toolchain aims |
| 179 | to minimize the time that a developer spends getting BPF compiled, and instead |
| 180 | focus on the applications that can be written and the problems that can be |
| 181 | solved with BPF. |
| 182 | |
| Brenden | c3c4fc1 | 2015-05-03 08:33:53 -0700 | [diff] [blame] | 183 | The features of this toolkit include: |
| 184 | * End-to-end BPF workflow in a shared library |
| Brenden Blanco | 46176a1 | 2015-07-07 13:05:22 -0700 | [diff] [blame] | 185 | * A modified C language for BPF backends |
| Brenden Blanco | 452de20 | 2015-05-03 10:43:07 -0700 | [diff] [blame] | 186 | * Integration with llvm-bpf backend for JIT |
| Brenden | c3c4fc1 | 2015-05-03 08:33:53 -0700 | [diff] [blame] | 187 | * Dynamic (un)loading of JITed programs |
| 188 | * Support for BPF kernel hooks: socket filters, tc classifiers, |
| 189 | tc actions, and kprobes |
| 190 | * Bindings for Python |
| 191 | * Examples for socket filters, tc classifiers, and kprobes |
| Brenden Blanco | 3232620 | 2015-09-03 16:31:47 -0700 | [diff] [blame] | 192 | * Self-contained tools for tracing a running system |
| Brenden Blanco | 46176a1 | 2015-07-07 13:05:22 -0700 | [diff] [blame] | 193 | |
| 194 | In the future, more bindings besides python will likely be supported. Feel free |
| 195 | to add support for the language of your choice and send a pull request! |
| 196 | |
| Brendan Gregg | 239e863 | 2016-07-25 15:02:32 -0700 | [diff] [blame] | 197 | ## Tutorials |
| Brenden Blanco | 46176a1 | 2015-07-07 13:05:22 -0700 | [diff] [blame] | 198 | |
| Brendan Gregg | 239e863 | 2016-07-25 15:02:32 -0700 | [diff] [blame] | 199 | - [docs/tutorial.md](docs/tutorial.md): Using bcc tools to solve performance, troubleshooting, and networking issues. |
| 200 | - [docs/tutorial_bcc_python_developer.md](docs/tutorial_bcc_python_developer.md): Developing new bcc programs using the Python interface. |
| Brendan Gregg | fc5332a | 2016-07-26 13:25:53 -0700 | [diff] [blame] | 201 | - [docs/reference_guide.md](docs/reference_guide.md): Reference guide to the bcc and bcc/BPF APIs. |
| Brenden Blanco | 46176a1 | 2015-07-07 13:05:22 -0700 | [diff] [blame] | 202 | |
| 203 | ### Networking |
| 204 | |
| Alex Bagehot | 3b9679a | 2016-02-06 16:01:02 +0000 | [diff] [blame] | 205 | At Red Hat Summit 2015, BCC was presented as part of a [session on BPF](http://www.devnation.org/#7784f1f7513e8542e4db519e79ff5eec). |
| Brenden Blanco | 3151843 | 2015-07-07 17:38:30 -0700 | [diff] [blame] | 206 | A multi-host vxlan environment is simulated and a BPF program used to monitor |
| 207 | one of the physical interfaces. The BPF program keeps statistics on the inner |
| 208 | and outer IP addresses traversing the interface, and the userspace component |
| 209 | turns those statistics into a graph showing the traffic distribution at |
| Dr.Z | d978a0d | 2015-11-12 04:45:21 +0900 | [diff] [blame] | 210 | multiple granularities. See the code [here](examples/networking/tunnel_monitor). |
| Brenden Blanco | 3151843 | 2015-07-07 17:38:30 -0700 | [diff] [blame] | 211 | |
| 212 | [](https://youtu.be/yYy3Cwce02k) |
| Brenden Blanco | 46176a1 | 2015-07-07 13:05:22 -0700 | [diff] [blame] | 213 | |
| Suchakra Sharma | 09de7bb | 2015-09-24 13:16:26 -0400 | [diff] [blame] | 214 | ## Contributing |
| Brendan Gregg | 87d2f69 | 2016-02-05 13:36:06 -0800 | [diff] [blame] | 215 | |
| Suchakra Sharma | 4949f1a | 2015-09-24 14:27:46 -0400 | [diff] [blame] | 216 | Already pumped up to commit some code? Here are some resources to join the |
| 217 | discussions in the [IOVisor](https://www.iovisor.org/) community and see |
| 218 | what you want to work on. |
| Suchakra Sharma | 09de7bb | 2015-09-24 13:16:26 -0400 | [diff] [blame] | 219 | |
| 220 | * _Mailing List:_ http://lists.iovisor.org/mailman/listinfo/iovisor-dev |
| 221 | * _IRC:_ #iovisor at irc.oftc.net |
| 222 | * _IRC Logs:_ https://scrollback.io/iovisor/all |
| 223 | * _BCC Issue Tracker:_ [Github Issues](https://github.com/iovisor/bcc/issues) |
| Brendan Gregg | 87d2f69 | 2016-02-05 13:36:06 -0800 | [diff] [blame] | 224 | * _A guide for contributing scripts:_ [CONTRIBUTING-SCRIPTS.md](CONTRIBUTING-SCRIPTS.md) |