Psio is a open source tool for Solaris that runs ps and inserts an I/O column to reflect disk I/O on a per process basis. Extended forms of output can show I/O time, size and count of operations as a percent or a value, as well as a breakdown by filesystem. This is a performance tuning or troubleshooting tool.
Note: This page was last updated in 2005 and is no longer maintained. It is now part of my Crypt.
Psio was my first disk I/O by process tool. Since writing it I have written many more that use different techniques, each having their own pros and cons. They are all on this site in the Download section below. The following table compares features. This is listed from most to least recommended.
| Program | Language | Solaris | Needs root | Impact | Technique | I/O Size | I/O Time | Events | Summary |
|---|---|---|---|---|---|---|---|---|---|
| prusage | Perl, procfs | All | No | Minimal | blk count | Maybe* | No | No | Yes |
| iosnoop | Shell, DTrace | 10+ | Yes | Minimal | bio events | Yes | Yes | Yes | No |
| iotop | Shell, DTrace | 10+ | Yes | Minimal | bio events | Yes | Yes | No | Yes |
| psio10 | Perl, DTrace | 10+ | Yes | Minimal | bio events | Yes | Yes | Yes | Yes |
| psio | Perl, prex | 2.6 - 9 | Yes | Moderate? | bio events | Yes | Yes | Yes | Yes |
| psio.se | SE Toolkit | 2.6 - 9 | No | Minimal | blk count | Maybe* | No | No | Yes |
| listprusage | C, procfs | All | No | Minimal | blk count | Maybe* | No | No | Yes |
For troubleshooting I start with prusage as it doesn't require root access. Then I'll use iosnoop and iotop if it is Solaris 10, or psio for older Solaris.
* This is the pr_inblk and pr_oublk block counts from procfs. Originally they may well have tracked, say, 8 Kb blocks, however now they no longer take into account the event size - so they serve more as a disk event count. If you know generally how large the events should be, then the count can help you estimate the actual size. Sound vague? Even accurate size info is vague - you can't tell if it's random or sequential bytes... I/O Time turns out to be the most useful measurement.
iosnoop - Solaris 10 a program that uses DTrace to snoop I/O events live, example here.
iotop - Solaris 10 a program that uses DTrace to print an I/O summary, example here.
Psio - Solaris 9 (and older) This version is written in Perl and works by running "prex -k" for a short period of time (default is 1 second) and enabling kernel tracing for disk I/O operations. Running prex on a kernel is not an everyday event, and this version is not designed as an everyday tool - more a demonstration program. WARNING: This version runs prex on the kernel to activate kernel tracing - use with caution. Best to run for short periods only, eg less than a minute.
Psio10 - Solaris 10
This version is written in Perl and runs DTrace to examine I/O events,
which is only available
in Solaris 10. This version is reliable and well featured, and will
likely be the most developed version in the future.
Psio.se - SE Toolkit is a version written in the SE Toolkit language. This version is reliable and can be run for long periods of time; however it has less features and includes all types of I/O (disk, network, streams, ...) unlike the psio versions above which only target disk I/O. The SE Toolkit must be installed (see Further Info below).
listprusage - Any Solaris prints process resource usage statistics such as in blocks and out blocks by PID. It's written in C. here.
# ./psio
UID PID PPID %I/O STIME TTY TIME CMD
brendan 25768 24654 1.7 23:26:22 pts/4 0:00 pine
root 0 0 0.4 Mar 16 ? 0:16 sched
root 5857 5856 0.3 Nov 08 ? 5:09 (squid) -s
root 3 0 0.2 Mar 16 ? 18:44:10 fsflush
brendan 6094 10068 0.1 Nov 11 pts/15 7:34 opera
root 1 0 0.0 Mar 16 ? 0:10 /etc/init -
root 2 0 0.0 Mar 16 ? 0:01 pageout
[...]
|
while running grep on a large file,
# ./psio
UID PID PPID %I/O STIME TTY TIME CMD
brendan 13271 10093 65.4 23:20:16 pts/20 0:01 grep brendan contents
root 0 0 0.0 Mar 16 ? 0:16 sched
root 1 0 0.0 Mar 16 ? 0:10 /etc/init -
root 2 0 0.0 Mar 16 ? 0:00 pageout
[...]
|
the following prints I/O stats due to the "-x" option
(time, size and count),
# ./psio -x
UID PID %CPU %I/Ot %I/Os %I/Oc %MEM S TIME CMD
brendan 25426 1.1 60.8 96.9 94.4 0.2 R 0:00 grep brendan contents
brendan 25425 0.8 3.5 3.1 5.6 1.0 S 0:00 pine
root 0 0.0 0.0 0.0 0.0 0.0 T 0:16 sched
root 1 0.0 0.0 0.0 0.0 0.1 S 0:10 /etc/init -
[...]
|
the "-n" switch produces a numerical output,
# ./psio -n 10
UID PID IOTIME IOSIZE IOCOUNT CMD
root 0 2825 2260992 462 sched
brendan 25489 368 843776 52 pine
brendan 25491 121 90112 11 find /usr
root 5857 5 1024 1 (squid) -s
root 1 0 0 0 /etc/init -
root 2 0 0 0 pageout
root 3 0 0 0 fsflush
[...]
|
the "-f" switch will print a break down of I/O per filesystem,
# ./psio -xf 10
UID PID %CPU %I/Ot %I/Os %I/Oc %MEM S TIME CMD
brendan 25259 2.7 6.3 23.3 56.9 0.3 S 0:01 find /var
" " " 6.3 23.3 56.9 /dev/dsk/c0t0d0s5, /var
brendan 25257 0.6 2.1 73.5 28.6 1.0 S 0:00 pine
" " " 2.1 73.5 28.6 /dev/dsk/c0t0d0s6, /export/home
root 3 0.5 1.6 3.1 14.1 0.0 S 18:44:00 fsflush
" " " 0.7 1.1 9.3 /dev/dsk/c0t0d0s3, /usr
" " " 0.4 0.3 2.4 /dev/dsk/c0t0d0s1, /
" " " 0.3 0.9 1.6 /dev/dsk/c0t0d0s5, /var
" " " 0.2 0.9 0.8 /dev/dsk/c0t0d0s6, /export/home
brendan 6094 0.0 0.0 0.1 0.4 5.5 S 7:34 opera
" " " 0.0 0.1 0.4 /dev/dsk/c0t0d0s6, /export/home
root 0 0.0 0.0 0.0 0.0 0.0 T 0:16 sched
root 1 0.0 0.0 0.0 0.0 0.1 S 0:10 /etc/init -
root 2 0.0 0.0 0.0 0.0 0.0 S 0:01 pageout
[...]
|
See More Examples for analysis
using output files.
iosnoop
is able to snoop I/O events live, (more examples
here)
# ./iosnoop
UID PID D BLOCK SIZE COMM PATHNAME
100 15795 R 3808 8192 tar /usr/bin/eject
100 15795 R 35904 6144 tar /usr/bin/eject
100 15795 R 39828 6144 tar /usr/bin/env
100 15795 R 3872 8192 tar /usr/bin/expr
100 15795 R 21120 7168 tar /usr/bin/expr
100 15795 R 43680 6144 tar /usr/bin/false
100 15795 R 44176 6144 tar /usr/bin/fdetach
100 15795 R 3920 8192 tar /usr/bin/fdformat
100 15795 R 3936 8192 tar /usr/bin/fdformat
100 15795 R 4080 8192 tar /usr/bin/fdformat
100 15795 R 9680 3072 tar /usr/bin/fdformat
100 15795 R 4096 8192 tar /usr/bin/fgrep
100 15795 R 46896 6144 tar /usr/bin/fgrep
100 15795 R 4112 8192 tar /usr/bin/file
100 15795 R 4128 8192 tar /usr/bin/file
100 15795 R 4144 8192 tar /usr/bin/file
[...]
|
prusage the default output prints a process listing with I/O as in blocks, out blocks and character I/O, sorted on total block I/O, and is printing the summary since boot data (historic),
$ ./prusage
PID MINF MAJF INBLK OUBLK CHAR-kb COMM
3 0 0 58001 1685914 0 fsflush
7204 0 6236 10919 5396 2467294 (squid)
253 0 970 2425 5273 441901 /usr/sbin/syslogd
19368 0 5338 5499 2 930786 /usr/local/bin/Xvnc
2 0 0 0 3105 0 pageout
427 0 62 65 2406 74953 tail
388 0 827 1231 948 3707 /usr/lib/inet/in.dhcpd
19448 0 1709 2011 0 301024 dtwm
[...]
|
the following limits the output to the top 5 (-t5), and prints
an output every 3 secounds (the first is historic),
$ ./prusage -t5 3
PID MINF MAJF INBLK OUBLK CHAR-kb COMM
3 0 0 58001 1685943 0 fsflush
7204 0 6236 10919 5396 2467294 (squid)
253 0 970 2425 5273 441903 /usr/sbin/syslogd
19368 0 5338 5499 2 932108 /usr/local/bin/Xvnc
2 0 0 0 3105 0 pageout
PID MINF MAJF INBLK OUBLK CHAR-kb COMM
7158 0 0 36 0 540 find
288 0 0 0 0 0 /usr/lib/utmpd
19657 0 0 0 0 0 -sh
2623 0 0 0 0 0 /usr/lib/power/powerd
7203 0 0 0 0 0 /opt/sfw/squid/bin/squid
[...]
|
the following is printing a USR/SYS times report (-u), with the
top 5 processes sorted on CPU usage every 2 seconds,
$ ./prusage -ut5 2
PID USR SYS WAIT LOCK TRAP COMM
19368 2474.42 1155.67 0.00 0.00 0.00 /usr/local/bin/Xvnc
438 1591.23 1884.77 0.00 0.00 0.00 mibiisa
19479 1864.98 1436.97 2759.56 0.00 0.03 sdtperfmeter
19480 1129.24 1163.68 4689.23 0.00 0.02 /usr/dt/bin/sdtperfmeter
19460 307.31 685.86 2954.27 0.00 0.01 /usr/dt/bin/dtterm
PID USR SYS WAIT LOCK TRAP COMM
7231 0.12 0.60 0.70 0.00 0.00 find
6962 0.20 0.39 0.00 0.00 0.00 /usr/lib/ssh/sshd
19479 0.00 0.00 0.00 0.00 0.00 sdtperfmeter
19467 0.00 0.00 0.01 0.00 0.00 /usr/dt/bin/dtterm
19452 0.00 0.00 0.01 0.00 0.00 /usr/dt/bin/dtterm
[...]
|
the following is printing the context switch report (-x), with the
top 5 processes sorted on context swithes every 2 seconds,
$ ./prusage -xt5 2
PID USR SYS VCTX ICTX SYSC COMM
19368 2474.67 1156.29 84991843 3266777 1782490550 /usr/local/bin/Xvnc
15722 4.66 7.19 59544651 5073 101418323 /usr/dt/bin/dtterm
397 2.51 3.07 34422624 1141 38116238 /usr/apache/bin/httpd
15237 243.06 268.69 34301887 60734 563346823 /usr/local/bin/Xvnc
19479 1869.46 1440.45 30893642 9584 93519499 sdtperfmeter
PID USR SYS VCTX ICTX SYSC COMM
6962 0.36 0.45 965 811 11581 /usr/lib/ssh/sshd
9223 0.22 0.84 564 1078 23574 find
9224 0.03 0.19 289 27 3374 tar
19368 0.00 0.00 41 2 897 /usr/local/bin/Xvnc
288 0.00 0.00 40 0 0 /usr/lib/utmpd
[...]
|
the following prints the top 5 processes (-t5) from three reports
(-iux), every 30 seconds, while clearing the screen (-c). The output
refreshes similar to "top",
$ ./prusage -ciux -t5 30
PID MINF MAJF INBLK OUBLK CHAR-kb COMM
3 0 0 20 26 0 fsflush
7204 0 2 12 10 669 (squid)
7205 0 0 4 2 1 (unlinkd)
9233 0 0 0 2 81 vi
6729 0 0 0 0 0 /usr/lib/saf/ttymon
PID USR SYS VCTX ICTX SYSC COMM
7204 0.14 0.13 506 26 3895 (squid)
19368 0.00 0.01 513 13 11305 /usr/local/bin/Xvnc
19452 0.01 0.02 339 1 586 /usr/dt/bin/dtterm
19460 0.01 0.01 340 0 586 /usr/dt/bin/dtterm
15722 0.00 0.00 340 0 586 /usr/dt/bin/dtterm
PID USR SYS WAIT LOCK TRAP COMM
7204 0.14 0.13 0.00 0.00 0.00 (squid)
19479 0.02 0.01 0.05 0.00 0.00 sdtperfmeter
239 0.02 0.01 0.00 0.00 0.00 /usr/sbin/in.named
19452 0.01 0.02 0.06 0.00 0.00 /usr/dt/bin/dtterm
19480 0.01 0.01 0.02 0.00 0.00 /usr/dt/bin/sdtperfmeter
|
the following examines one process only (7204) every 2 seconds,
8 times. The first line is historic.
$ ./prusage -x -p7204 2 8
PID USR SYS VCTX ICTX SYSC COMM
7204 190.14 170.44 2649662 26074 12859733 (squid)
PID USR SYS VCTX ICTX SYSC COMM
7204 0.00 0.00 10 0 23 (squid)
PID USR SYS VCTX ICTX SYSC COMM
7204 0.01 0.00 15 0 100 (squid)
PID USR SYS VCTX ICTX SYSC COMM
7204 0.01 0.02 47 1 355 (squid)
PID USR SYS VCTX ICTX SYSC COMM
7204 0.01 0.03 55 4 514 (squid)
PID USR SYS VCTX ICTX SYSC COMM
7204 0.02 0.00 40 4 350 (squid)
PID USR SYS VCTX ICTX SYSC COMM
7204 0.01 0.00 74 0 564 (squid)
PID USR SYS VCTX ICTX SYSC COMM
7204 0.00 0.00 4 0 4 (squid)
|
These have been tested on Solaris 9 and 10, and so far have been written for Solaris only.
Feature List
* %I/O time per process (I/O service time, % of sample time)
* %I/O size per process (bytes transferred by process, % of total seen)
* %I/O count per process (number of I/O operations, % of total seen)
* I/O time per process (milliseconds)
* I/O size per process (bytes transferred)
* I/O count per process (number of operations)
* All of the above, per filesystem per process
* I/O time, size & count per I/O event
Further Info
For more performance tuning on Solaris see,
Back to Brendan Gregg's Homepage