Skip to content

Commit

Permalink
f2fsslower: track IO operations that are slower than a given threshol…
Browse files Browse the repository at this point in the history
…d in F2FS file system (iovisor#4782)

Co-authored-by: Ting Zhang <[email protected]>
  • Loading branch information
zhangting9756 and Ting Zhang authored Dec 19, 2023
1 parent 3e27096 commit 2ac4a63
Show file tree
Hide file tree
Showing 4 changed files with 708 additions and 0 deletions.
113 changes: 113 additions & 0 deletions man/man8/f2fsslower.8
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
.TH f2fsslower 8 "2022-08-15" "USER COMMANDS"
.SH NAME
f2fsslower \- Trace slow f2fs file operations, with per-event details.
.SH SYNOPSIS
.B f2fsslower [\-h] [\-s] [\-p PID] [min_ms]
.SH DESCRIPTION
This tool traces common f2fs file operations: reads, writes, opens, and
syncs. It measures the time spent in these operations, and prints details
for each that exceeded a threshold.

WARNING: See the OVERHEAD section.

By default, a minimum millisecond threshold of 10 is used. If a threshold of 0
is used, all events are printed (warning: verbose).

Since this works by tracing the f2fs_file_operations interface functions, it
will need updating to match any changes to these functions.

Since this uses BPF, only the root user can use this tool.
.SH REQUIREMENTS
CONFIG_BPF and bcc.
.SH OPTIONS
\-p PID
Trace this PID only.
.TP
min_ms
Minimum I/O latency (duration) to trace, in milliseconds. Default is 10 ms.
.SH EXAMPLES
.TP
Trace synchronous file reads and writes slower than 10 ms:
#
.B f2fsslower
.TP
Trace slower than 1 ms:
#
.B f2fsslower 1
.TP
Trace slower than 1 ms, and output just the fields in parsable format (csv):
#
.B f2fsslower \-s 1
.TP
Trace all file reads and writes (warning: the output will be verbose):
#
.B f2fsslower 0
.TP
Trace slower than 1 ms, for PID 181 only:
#
.B f2fsslower \-p 181 1
.SH FIELDS
.TP
TIME(s)
Time of I/O completion since the first I/O seen, in seconds.
.TP
COMM
Process name.
.TP
PID
Process ID.
.TP
T
Type of operation. R == read, W == write, O == open, S == fsync.
.TP
OFF_KB
File offset for the I/O, in Kbytes.
.TP
BYTES
Size of I/O, in bytes.
.TP
LAT(ms)
Latency (duration) of I/O, measured from when it was issued by VFS to the
filesystem, to when it completed. This time is inclusive of block device I/O,
file system CPU cycles, file system locks, run queue latency, etc. It's a more
accurate measure of the latency suffered by applications performing file
system I/O, than to measure this down at the block device interface.
.TP
FILENAME
A cached kernel file name (comes from dentry->d_name.name).
.TP
ENDTIME_us
Completion timestamp, microseconds (\-s only).
.TP
OFFSET_b
File offset, bytes (\-s only).
.TP
LATENCY_us
Latency (duration) of the I/O, in microseconds (\-s only).
.SH OVERHEAD
This adds low-overhead instrumentation to these f2fs operations,
including reads and writes from the file system cache. Such reads and writes
can be very frequent (depending on the workload; eg, 1M/sec), at which
point the overhead of this tool (even if it prints no "slower" events) can
begin to become significant. Measure and quantify before use. If this
continues to be a problem, consider switching to a tool that prints in-kernel
summaries only.
.PP
Note that the overhead of this tool should be less than fileslower(8), as
this tool targets f2fs functions only, and not all file read/write paths
(which can include socket I/O).
.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
Ting Zhang
.SH SEE ALSO
biosnoop(8), funccount(8), fileslower(8)
4 changes: 4 additions & 0 deletions tests/python/test_tools_smoke.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,10 @@ def test_ext4dist(self):
def test_ext4slower(self):
self.run_with_int("ext4slower.py")

@skipUnless(kernel_version_ge(4,4), "requires kernel >= 4.4")
def test_f2fsslower(self):
self.run_with_int("f2fsslower.py")

@skipUnless(kernel_version_ge(4,4), "requires kernel >= 4.4")
def test_filelife(self):
self.run_with_int("filelife.py")
Expand Down
Loading

0 comments on commit 2ac4a63

Please sign in to comment.