61 lines
3.2 KiB
Plaintext
61 lines
3.2 KiB
Plaintext
Demonstration of readahead, the Linux eBPF/bcc version
|
|
|
|
Read-ahead mechanism is used by operation sytems to optimize sequential operations
|
|
by reading ahead some pages to avoid more expensive filesystem operations. This tool
|
|
shows the performance of the read-ahead caching on the system under a given load to
|
|
investigate any caching issues. It shows a count for unused pages in the cache and
|
|
also prints a histogram showing how long they have remianed there.
|
|
|
|
Usage Scenario
|
|
==============
|
|
|
|
Consider that you are developing a React Native application which performs aggressive
|
|
reads while re-encoding a video in local-storage. Usually such an app would be multi-
|
|
layered and have transitional library dependencies. The actual read may be performed
|
|
by some unknown native library which may or may not be using hints to the OS, such as
|
|
madvise(p, LEN, MADV_SEQUENTIAL). If high IOPS is observed in such an app, running
|
|
readahead may pin the issue much faster in this case as the developer digs deeper
|
|
into what may be causing this.
|
|
|
|
An example where such an issue can surface is: https://github.com/boltdb/bolt/issues/691
|
|
|
|
# readahead -d 30
|
|
Tracing... Hit Ctrl-C to end.
|
|
^C
|
|
Read-ahead unused pages: 6765
|
|
Histogram of read-ahead used page age (ms):
|
|
|
|
age (ms) : count distribution
|
|
0 -> 1 : 4236 |****************************************|
|
|
2 -> 3 : 394 |*** |
|
|
4 -> 7 : 1670 |*************** |
|
|
8 -> 15 : 2132 |******************** |
|
|
16 -> 31 : 401 |*** |
|
|
32 -> 63 : 1256 |*********** |
|
|
64 -> 127 : 2352 |********************** |
|
|
128 -> 255 : 357 |*** |
|
|
256 -> 511 : 369 |*** |
|
|
512 -> 1023 : 366 |*** |
|
|
1024 -> 2047 : 181 |* |
|
|
2048 -> 4095 : 439 |**** |
|
|
4096 -> 8191 : 188 |* |
|
|
|
|
In the example above, we recorded system-wide stats for 30 seconds. We can observe that
|
|
while most of the pages stayed in the readahead cache for quite less time, after 30
|
|
seconds 6765 pages still remained in the cache, yet unaccessed.
|
|
|
|
Note on Kprobes Usage
|
|
=====================
|
|
|
|
This tool uses Kprobes on the following kernel functions:
|
|
|
|
__do_page_cache_readahead()/do_page_cache_ra() (After kernel version 5.10 (include), __do_page_cache_readahead was renamed to do_page_cache_ra)
|
|
__page_cache_alloc()
|
|
mark_page_accessed()
|
|
|
|
Since the tool uses Kprobes, depending on your linux kernel's compilation, these
|
|
functions may be inlined and hence not available for Kprobes. To see whether you have
|
|
the functions available, check vmlinux source and binary to confirm whether inlining is
|
|
happening or not. You can also check /proc/kallsyms on the host and verify if the target
|
|
functions are present there before using this tool.
|