| Demonstrations of syscount, the Linux/eBPF version. | |
| syscount summarizes syscall counts across the system or a specific process, | |
| with optional latency information. It is very useful for general workload | |
| characterization, for example: | |
| # syscount | |
| Tracing syscalls, printing top 10... Ctrl+C to quit. | |
| [09:39:04] | |
| SYSCALL COUNT | |
| write 10739 | |
| read 10584 | |
| wait4 1460 | |
| nanosleep 1457 | |
| select 795 | |
| rt_sigprocmask 689 | |
| clock_gettime 653 | |
| rt_sigaction 128 | |
| futex 86 | |
| ioctl 83 | |
| ^C | |
| These are the top 10 entries; you can get more by using the -T switch. Here, | |
| the output indicates that the write and read syscalls were very common, followed | |
| immediately by wait4, nanosleep, and so on. By default, syscount counts across | |
| the entire system, but we can point it to a specific process of interest: | |
| # syscount -p $(pidof dd) | |
| Tracing syscalls, printing top 10... Ctrl+C to quit. | |
| [09:40:21] | |
| SYSCALL COUNT | |
| read 7878397 | |
| write 7878397 | |
| ^C | |
| Indeed, dd's workload is a bit easier to characterize. Occasionally, the count | |
| of syscalls is not enough, and you'd also want an aggregate latency: | |
| # syscount -L | |
| Tracing syscalls, printing top 10... Ctrl+C to quit. | |
| [09:41:32] | |
| SYSCALL COUNT TIME (us) | |
| select 16 3415860.022 | |
| nanosleep 291 12038.707 | |
| ftruncate 1 122.939 | |
| write 4 63.389 | |
| stat 1 23.431 | |
| fstat 1 5.088 | |
| [unknown: 321] 32 4.965 | |
| timerfd_settime 1 4.830 | |
| ioctl 3 4.802 | |
| kill 1 4.342 | |
| ^C | |
| The select and nanosleep calls are responsible for a lot of time, but remember | |
| these are blocking calls. This output was taken from a mostly idle system. Note | |
| the "unknown" entry -- syscall 321 is the bpf() syscall, which is not in the | |
| table used by this tool (borrowed from strace sources). | |
| Another direction would be to understand which processes are making a lot of | |
| syscalls, thus responsible for a lot of activity. This is what the -P switch | |
| does: | |
| # syscount -P | |
| Tracing syscalls, printing top 10... Ctrl+C to quit. | |
| [09:58:13] | |
| PID COMM COUNT | |
| 13820 vim 548 | |
| 30216 sshd 149 | |
| 29633 bash 72 | |
| 25188 screen 70 | |
| 25776 mysqld 30 | |
| 31285 python 10 | |
| 529 systemd-udevd 9 | |
| 1 systemd 8 | |
| 494 systemd-journal 5 | |
| ^C | |
| This is again from a mostly idle system over an interval of a few seconds. | |
| Sometimes, you'd only care about failed syscalls -- these are the ones that | |
| might be worth investigating with follow-up tools like opensnoop, execsnoop, | |
| or trace. Use the -x switch for this; the following example also demonstrates | |
| the -i switch, for printing at predefined intervals: | |
| # syscount -x -i 5 | |
| Tracing failed syscalls, printing top 10... Ctrl+C to quit. | |
| [09:44:16] | |
| SYSCALL COUNT | |
| futex 13 | |
| getxattr 10 | |
| stat 8 | |
| open 6 | |
| wait4 3 | |
| access 2 | |
| [unknown: 321] 1 | |
| [09:44:21] | |
| SYSCALL COUNT | |
| futex 12 | |
| getxattr 10 | |
| [unknown: 321] 2 | |
| wait4 1 | |
| access 1 | |
| pause 1 | |
| ^C | |
| Similar to -x/--failures, sometimes you only care about certain syscall | |
| errors like EPERM or ENONET -- these are the ones that might be worth | |
| investigating with follow-up tools like opensnoop, execsnoop, or | |
| trace. Use the -e/--errno switch for this; the following example also | |
| demonstrates the -e switch, for printing ENOENT failures at predefined intervals: | |
| # syscount -e ENOENT -i 5 | |
| Tracing syscalls, printing top 10... Ctrl+C to quit. | |
| [13:15:57] | |
| SYSCALL COUNT | |
| stat 4669 | |
| open 1951 | |
| access 561 | |
| lstat 62 | |
| openat 42 | |
| readlink 8 | |
| execve 4 | |
| newfstatat 1 | |
| [13:16:02] | |
| SYSCALL COUNT | |
| lstat 18506 | |
| stat 13087 | |
| open 2907 | |
| access 412 | |
| openat 19 | |
| readlink 12 | |
| execve 7 | |
| connect 6 | |
| unlink 1 | |
| rmdir 1 | |
| ^C | |
| USAGE: | |
| # syscount -h | |
| usage: syscount.py [-h] [-p PID] [-i INTERVAL] [-T TOP] [-x] [-e ERRNO] [-L] | |
| [-m] [-P] [-l] | |
| Summarize syscall counts and latencies. | |
| optional arguments: | |
| -h, --help show this help message and exit | |
| -p PID, --pid PID trace only this pid | |
| -i INTERVAL, --interval INTERVAL | |
| print summary at this interval (seconds) | |
| -d DURATION, --duration DURATION | |
| total duration of trace, in seconds | |
| -T TOP, --top TOP print only the top syscalls by count or latency | |
| -x, --failures trace only failed syscalls (return < 0) | |
| -e ERRNO, --errno ERRNO | |
| trace only syscalls that return this error (numeric or | |
| EPERM, etc.) | |
| -L, --latency collect syscall latency | |
| -m, --milliseconds display latency in milliseconds (default: | |
| microseconds) | |
| -P, --process count by process and not by syscall | |
| -l, --list print list of recognized syscalls and exit |