This is the fourth post on a serie of postings on how to get measurements out of the cell server, which is the storage layer of the Oracle Exadata database machine. Up until now, I have looked at the measurement of the kind of IOs Exadata receives, the latencies of the IOs as as done by the cell server, and the mechanism Exadata uses to overcome overloaded CPUs on the cell layer.
This post is about the statistics on the disk devices on the operating system, which the cell server also collects and uses. The disk statistics are ideal to combine with the IO latency statistics.
This is how a dump of the collected statistics (which is called “devio_stats”) is invoked on the cell server, using cellcli:
alter cell events="immediate cellsrv.cellsrv_dump('devio_stats',0)";
This will output the name of the thread-log file, in which the “devio_stats” dump has been made.
This is a quick peek at the statistics this dump provides (first 10 lines):
[IOSTAT] Dump IO device stats for the last 1800 seconds 2013-10-28 04:57:39.679590*: Dump sequence #34: [IOSTAT] Device - /dev/sda ServiceTime Latency AverageRQ numReads numWrites DMWG numDmwgPeers numDmwgPeersFl trigerConfine avgSrvcTimeDmwg avgSrvcTimeDmwgFl 0.000000 0.000000 10 0 6 0 0 0 0 0.000000 0.000000 0.111111 0.111111 15 7 38 0 0 0 0 0.000000 0.000000 0.000000 0.000000 8 4 8 0 0 0 0 0.000000 0.000000 0.000000 0.000000 31 0 23 0 0 0 0 0.000000 0.000000 0.000000 0.000000 8 0 1 0 0 0 0 0.000000 0.000000 0.058824 0.058824 25 0 17 0 0 0 0 0.000000 0.000000 etc.
These are the devices for which the cell server keeps statistics:
grep \/dev\/ /opt/oracle/cell22.214.171.124.1_LINUX.X64_130109/log/diag/asm/cell/enkcel01/trace/svtrc_15737_85.trc [IOSTAT] Device - /dev/sda [IOSTAT] Device - /dev/sda3 [IOSTAT] Device - /dev/sdb [IOSTAT] Device - /dev/sdb3 [IOSTAT] Device - /dev/sdc [IOSTAT] Device - /dev/sde [IOSTAT] Device - /dev/sdd [IOSTAT] Device - /dev/sdf [IOSTAT] Device - /dev/sdg [IOSTAT] Device - /dev/sdh [IOSTAT] Device - /dev/sdi [IOSTAT] Device - /dev/sdj [IOSTAT] Device - /dev/sdk [IOSTAT] Device - /dev/sdl [IOSTAT] Device - /dev/sdm [IOSTAT] Device - /dev/sdn [IOSTAT] Device - /dev/sdo [IOSTAT] Device - /dev/sdp [IOSTAT] Device - /dev/sdq [IOSTAT] Device - /dev/sdr [IOSTAT] Device - /dev/sds [IOSTAT] Device - /dev/sdt [IOSTAT] Device - /dev/sdu
What is of interest here is that if the cell disk is allocated inside a partition instead of the whole disk, the cell server will keep statistics on both the entire device (/dev/sda, dev/sdb) and the partition (/dev/sda3, dev/sdb3). Also, the statistics are kept on both the rotating disks and the flash disks, as you would expect.
When looking in the “devio_stats” dump, there are a few other things which are worthy to notice. The lines with statistics do not have timestamp or other time indicator, it’s only statistics. The lines are displayed per device, with the newest line on top. The dump indicates it dumps the IO device statistics which the cell keeps for the last 1800 seconds (30 minutes). If you count the number of lines which (apparently) are kept by the cell server, the count is 599, not 1800. If you divide the time by the number of samples, it appears the cell takes a device statistics snapshot every 3 seconds. The cell server picks up the disk statistics from /proc/diskstats. Also, mind the cell measures the differences between two periods in time, which means the numbers are averages over a period of 3 seconds.
Two other things are listed in the statistics: ‘trigerConfine’ (which probably should be “triggerConfine”), which is a mechanism for Oracle to manage under performing disks.
The other thing is “DMWG”. At this moment I am aware DMWG means “Disk Media Working Group”, and works with the concept of peers.
To get a better understanding of what the difference is between the ServiceTime and Latency columns, see this excellent writeup on IO statistics from Bart Sjerps. You can exchange the ServiceTime for svctm of iostat or storage wait as Bart calls it, and Latency for await or host wait as Bart calls it.