Using top file
The top file gadget is used to visualize reads and writes by file, with container details.
On Kubernetes
This guide will deploy an example workload that performs some disk I/O
activity to show how to use top file
.
Before starting our workload, let's start our top file gadget to be sure it captures all the events from the beginning:
$ kubectl gadget top file -p mypod
K8S.NODE K8S.NAMESPACE K8S.PODNAME K8S.CONTAINERNAME PID COMM READS WRITES R_Kb W_Kb T FILE
...
The T
column indicates the type of the file: R
for regular files, S
for
sockets, and O
for other (including pipes). By default only regular files are
shown; use the --all-files
option to show all file types.
In another terminal, let's create our pod. It'll install git
and then
clone the linux source code.
$ kubectl run -it mypod --image ubuntu -- /bin/sh -c "apt-get update && apt-get install -y git && git clone https://github.com/torvalds/linux"
We can see how the top file
terminal shows the files that are read and
written by the pod. For instace, apt-get is reading a lot of files in
when updating the packages list and installing packages.
K8S.NODE K8S.NAMESPACE K8S.PODNAME K8S.CONTAINERNAME PID COMM READS WRITES R_Kb W_Kb T FILE
ubuntu-hirsute default mypod mypod 642727 apt-get 425 0 27022 0 R archive.ubuntu.com_ubuntu_dists_focal-updates_main_binary-amd64_Packages.lz4
ubuntu-hirsute default mypod mypod 642727 apt-get 278 0 17775 0 R archive.ubuntu.com_ubuntu_dists_focal_main_binary-amd64_Packages.lz4
ubuntu-hirsute default mypod mypod 642727 apt-get 244 0 15594 0 R security.ubuntu.com_ubuntu_dists_focal-security_main_binary-amd64_Packages.lz4
ubuntu-hirsute default mypod mypod 642727 apt-get 93 0 5921 0 R archive.ubuntu.com_ubuntu_dists_focal_universe_binary-amd64_Packages.lz4
ubuntu-hirsute default mypod mypod 642727 apt-get 91 0 5797 0 R archive.ubuntu.com_ubuntu_dists_focal-updates_universe_binary-amd64_Packages.lz4
ubuntu-hirsute default mypod mypod 642727 apt-get 82 0 5160 0 R archive.ubuntu.com_ubuntu_dists_focal-updates_restricted_binary-amd64_Packages.lz4
ubuntu-hirsute default mypod mypod 642727 apt-get 73 0 4568 0 R security.ubuntu.com_ubuntu_dists_focal-security_restricted_binary-amd64_Packages.lz4
ubuntu-hirsute default mypod mypod 642727 apt-get 70 0 4435 0 R security.ubuntu.com_ubuntu_dists_focal-security_universe_binary-amd64_Packages.lz4
ubuntu-hirsute default mypod mypod 642727 apt-get 19 0 1172 0 R archive.ubuntu.com_ubuntu_dists_focal_multiverse_binary-amd64_Packages.lz4
After the initial installation is done, we can see how git uses a temporary file to store the repository being cloned.
K8S.NODE K8S.NAMESPACE K8S.PODNAME K8S.CONTAINERNAME PID COMM READS WRITES R_Kb W_Kb T FILE
ubuntu-hirsute default mypod mypod 647042 git 0 1070 0 4280 R tmp_pack_2rpZd
Finally, we need to clean up our pod, press Ctrl + C on its terminal and them remove it:
$ kubectl delete pod mypod
By default the top file gadget prints a summary each second. It can be customized
with the --interval
flag. For example, to print a summary each 5 seconds:
$ kubectl gadget top file --interval 5
This gadget also supports the following flags to customize the output:
$ kubectl gadget top file --help
Periodically report read/write activity by file
Usage:
kubectl-gadget top file [flags]
Flags:
--all-files include non-regular file types (sockets, FIFOs, etc)
...
-m, --max-rows uint32 Maximum number of rows to return (default 50)
...
With ig
Start a container that performs some write operations to a file:
$ docker run --rm --name test-top-file busybox /bin/sh -c 'while true; do echo foo > bar; sleep 1; done'
Start the gadget and it'll show those operations:
$ sudo ig top file -c test-top-file
RUNTIME.CONTAINERNAME PID COMM READS WRITES RBYTES WBYTES T FILE
test-top-file 139255 sh 0 1 0B 4B R bar