pfilestat_example.txt revision 1.1 1 1.1 christos The following are sample outputs of the pfilestat tool for various scenarios.
2 1.1 christos
3 1.1 christos
4 1.1 christos
5 1.1 christos Starting with something simple,
6 1.1 christos
7 1.1 christos Running: dd if=/dev/rdsk/c0d0s0 of=/dev/null bs=56k # x86, 32-bit
8 1.1 christos
9 1.1 christos # ./pfilestat `pgrep -x dd`
10 1.1 christos
11 1.1 christos STATE FDNUM Time Filename
12 1.1 christos read 3 2% /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
13 1.1 christos write 4 3% /devices/pseudo/mm@0:null
14 1.1 christos waitcpu 0 7%
15 1.1 christos running 0 16%
16 1.1 christos sleep-r 0 69%
17 1.1 christos
18 1.1 christos STATE FDNUM KB/s Filename
19 1.1 christos write 4 53479 /devices/pseudo/mm@0:null
20 1.1 christos read 3 53479 /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
21 1.1 christos
22 1.1 christos Total event time (ms): 4999 Total Mbytes/sec: 104
23 1.1 christos
24 1.1 christos Most of the time we are sleeping on read, which is to be expected as dd on
25 1.1 christos the raw device is simple -> read:entry, strategy, biodone, read:return.
26 1.1 christos CPU time in read() itself is small.
27 1.1 christos
28 1.1 christos
29 1.1 christos
30 1.1 christos Now for the dsk device,
31 1.1 christos
32 1.1 christos Running: dd if=/dev/dsk/c0d0s0 of=/dev/null bs=56k # x86, 32-bit
33 1.1 christos
34 1.1 christos # ./pfilestat `pgrep -x dd`
35 1.1 christos
36 1.1 christos STATE FDNUM Time Filename
37 1.1 christos write 4 5% /devices/pseudo/mm@0:null
38 1.1 christos waitcpu 0 8%
39 1.1 christos running 0 15%
40 1.1 christos sleep-r 0 18%
41 1.1 christos read 3 53% /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
42 1.1 christos
43 1.1 christos STATE FDNUM KB/s Filename
44 1.1 christos read 3 53492 /devices/pci@0,0/pci-ide@1f,1/ide@0/cmdk@0,0
45 1.1 christos write 4 53492 /devices/pseudo/mm@0:null
46 1.1 christos
47 1.1 christos Total event time (ms): 4914 Total Mbytes/sec: 102
48 1.1 christos
49 1.1 christos Woah, we are now spending much more time in read()! I imagine segmap is
50 1.1 christos a busy bee. The "running" and "write" times are hardly different.
51 1.1 christos
52 1.1 christos
53 1.1 christos
54 1.1 christos Now for a SPARC demo of the same,
55 1.1 christos
56 1.1 christos Running: dd if=/dev/dsk/c0d0s0 of=/dev/null bs=56k # SPARC, 64-bit
57 1.1 christos
58 1.1 christos # ./pfilestat `pgrep -x dd`
59 1.1 christos
60 1.1 christos STATE FDNUM Time Filename
61 1.1 christos write 4 3% /devices/pseudo/mm@0:zero
62 1.1 christos waitcpu 0 7%
63 1.1 christos running 0 17%
64 1.1 christos read 3 24% /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a
65 1.1 christos sleep-r 0 54%
66 1.1 christos
67 1.1 christos STATE FDNUM KB/s Filename
68 1.1 christos read 3 13594 /devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a
69 1.1 christos write 4 13606 /devices/pseudo/mm@0:zero
70 1.1 christos
71 1.1 christos Total event time (ms): 4741 Total Mbytes/sec: 25
72 1.1 christos
73 1.1 christos I did prime the cache by running this a few times first. There is less
74 1.1 christos read() time than with the x86 32-bit demo, as I would guess that the
75 1.1 christos process is more often exhausting the (faster) segmap cache and getting
76 1.1 christos to the point where it must sleep. (However, do take this comparison with
77 1.1 christos a grain of salt - my development servers aren't ideal for comparing
78 1.1 christos statistics: one is a 867 MHz Pentium, and the other a 360 MHz Ultra 5).
79 1.1 christos
80 1.1 christos The file system cache is faster on 64-bit systems due to the segkpm
81 1.1 christos enhancement in Solaris 10. For details see,
82 1.1 christos http://blogs.sun.com/roller/page/rmc?entry=solaris_10_fast_filesystem_cache
83 1.1 christos
84 1.1 christos
85 1.1 christos
86 1.1 christos Now, back to x86.
87 1.1 christos
88 1.1 christos Running: tar cf /dev/null /
89 1.1 christos
90 1.1 christos # ./pfilestat `pgrep -x tar`
91 1.1 christos
92 1.1 christos STATE FDNUM Time Filename
93 1.1 christos read 11 0% /extra1/test/amd64/libCstd.so.1
94 1.1 christos read 11 0% /extra1/test/amd64/libXm.so
95 1.1 christos read 11 0% /extra1/test/amd64/libXm.so.4
96 1.1 christos read 11 1% /extra1/test/amd64/libgtk-x11-2.0.so
97 1.1 christos read 11 2% /extra1/test/amd64/libgtk-x11-2.0.so.0
98 1.1 christos waitcpu 0 2%
99 1.1 christos read 9 4% /extra1/5000
100 1.1 christos write 3 7% /devices/pseudo/mm@0:null
101 1.1 christos running 0 19%
102 1.1 christos sleep-r 0 46%
103 1.1 christos
104 1.1 christos STATE FDNUM KB/s Filename
105 1.1 christos read 11 293 /extra1/test/amd64/libgdk-x11-2.0.so
106 1.1 christos read 11 295 /extra1/test/amd64/libgdk-x11-2.0.so.0
107 1.1 christos read 9 476 /extra1/1000
108 1.1 christos read 11 526 /extra1/test/amd64/libCstd.so.1
109 1.1 christos read 11 594 /extra1/test/amd64/libXm.so.4
110 1.1 christos read 11 594 /extra1/test/amd64/libXm.so
111 1.1 christos read 11 1603 /extra1/test/amd64/libgtk-x11-2.0.so.0
112 1.1 christos read 11 1606 /extra1/test/amd64/libgtk-x11-2.0.so
113 1.1 christos read 9 4078 /extra1/5000
114 1.1 christos write 3 21254 /devices/pseudo/mm@0:null
115 1.1 christos
116 1.1 christos Total event time (ms): 4903 Total Mbytes/sec: 41
117 1.1 christos
118 1.1 christos Fair enough. tar is crusing along at 21 Mbytes/sec (writes to fd 3!).
119 1.1 christos
120 1.1 christos
121 1.1 christos
122 1.1 christos More interesting is to do the following,
123 1.1 christos
124 1.1 christos Running: tar cf - / | gzip > /dev/null
125 1.1 christos
126 1.1 christos # ./pfilestat `pgrep -x tar`
127 1.1 christos
128 1.1 christos STATE FDNUM Time Filename
129 1.1 christos read 11 0% /extra1/test/amd64/libm.so
130 1.1 christos read 11 0% /extra1/test/amd64/libm.so.2
131 1.1 christos read 11 0% /extra1/test/amd64/libnsl.so
132 1.1 christos read 11 0% /extra1/test/amd64/libnsl.so.1
133 1.1 christos read 11 0% /extra1/test/amd64/libc.so.1
134 1.1 christos write 3 2% <none>
135 1.1 christos waitcpu 0 4%
136 1.1 christos sleep-r 0 4%
137 1.1 christos running 0 6%
138 1.1 christos sleep-w 0 78%
139 1.1 christos
140 1.1 christos STATE FDNUM KB/s Filename
141 1.1 christos read 11 74 /extra1/test/amd64/libldap.so
142 1.1 christos read 11 75 /extra1/test/amd64/libldap.so.5
143 1.1 christos read 11 75 /extra1/test/amd64/libresolv.so.2
144 1.1 christos read 11 76 /extra1/test/amd64/libresolv.so
145 1.1 christos read 11 97 /extra1/test/amd64/libm.so.2
146 1.1 christos read 11 98 /extra1/test/amd64/libm.so
147 1.1 christos read 11 174 /extra1/test/amd64/libnsl.so
148 1.1 christos read 11 176 /extra1/test/amd64/libnsl.so.1
149 1.1 christos read 11 216 /extra1/test/amd64/libc.so.1
150 1.1 christos write 3 3022 <none>
151 1.1 christos
152 1.1 christos Total event time (ms): 4911 Total Mbytes/sec: 6
153 1.1 christos
154 1.1 christos Woah now, tar is writing 3 Mbytes/sec - AND spending 78% of it's time on
155 1.1 christos sleep-w, sleeping on writes! Of course, this is because we are piping the
156 1.1 christos output to gzip, which is spending a while compressing the data. 78%
157 1.1 christos matches the time gzip was on the CPU (using either "prstat -m" or dtrace
158 1.1 christos to measure; procfs's pr_pctcpu would take too long to catch up).
159 1.1 christos
160 1.1 christos
161 1.1 christos
162 1.1 christos
163 1.1 christos Also interesting is,
164 1.1 christos
165 1.1 christos Running: perl -e 'while (1) {;}' &
166 1.1 christos Running: perl -e 'while (1) {;}' &
167 1.1 christos Running: perl -e 'while (1) {;}' &
168 1.1 christos Running: perl -e 'while (1) {;}' &
169 1.1 christos Running: tar cf /dev/null /
170 1.1 christos
171 1.1 christos # ./pfilestat `pgrep -x tar`
172 1.1 christos
173 1.1 christos STATE FDNUM Time Filename
174 1.1 christos read 11 0% /extra1/test/amd64/libxml2.so.2
175 1.1 christos read 11 0% /extra1/test/amd64/libgdk-x11-2.0.so.0
176 1.1 christos read 11 0% /extra1/test/amd64/libgdk-x11-2.0.so
177 1.1 christos read 11 0% /extra1/test/amd64/libCstd.so.1
178 1.1 christos read 11 0% /extra1/test/amd64/libgtk-x11-2.0.so.0
179 1.1 christos read 11 2% /extra1/test/amd64/libgtk-x11-2.0.so
180 1.1 christos write 3 2% /devices/pseudo/mm@0:null
181 1.1 christos running 0 8%
182 1.1 christos sleep-r 0 22%
183 1.1 christos waitcpu 0 65%
184 1.1 christos
185 1.1 christos STATE FDNUM KB/s Filename
186 1.1 christos read 11 182 /extra1/test/amd64/libsun_fc.so
187 1.1 christos read 11 264 /extra1/test/amd64/libglib-2.0.so
188 1.1 christos read 11 266 /extra1/test/amd64/libglib-2.0.so.0
189 1.1 christos read 11 280 /extra1/test/amd64/libxml2.so.2
190 1.1 christos read 11 293 /extra1/test/amd64/libgdk-x11-2.0.so
191 1.1 christos read 11 295 /extra1/test/amd64/libgdk-x11-2.0.so.0
192 1.1 christos read 11 526 /extra1/test/amd64/libCstd.so.1
193 1.1 christos read 11 761 /extra1/test/amd64/libgtk-x11-2.0.so.0
194 1.1 christos read 11 1606 /extra1/test/amd64/libgtk-x11-2.0.so
195 1.1 christos write 3 7881 /devices/pseudo/mm@0:null
196 1.1 christos
197 1.1 christos Total event time (ms): 4596 Total Mbytes/sec: 13
198 1.1 christos
199 1.1 christos Now we have "waitcpu" as tar competes for CPU cycles along with the greedy
200 1.1 christos infinite perl processes.
201