#!/usr/bin/env stap # vim: set sw=2: # # Track bytes read between each "far seek" for each block device. # This is intended to be useful when choosing and verifying a RAID stripe size. # To minimize seeks, the stripe size should be sufficiently large that most # operations do not span stripe boundaries. # # Author: Scott Lamb global cursector_by_device global cursize_by_device global sizestats_by_device function abs(n) { if (n < 0) return -n else return n } probe begin { printf("starting\n") } probe timer.ms(10000) { /* every 10 sec */ foreach (dev in sizestats_by_device) { printf("%s\n", dev) print(@hist_log(sizestats_by_device[dev])) } printf("--------\n") delete sizestats_by_device } probe ioblock.end { cursector = cursector_by_device[devname] if (abs(sector - cursector) > 1048576) { /* far seek heuristic: 512 MiB */ sizestats_by_device[devname] <<< cursize_by_device[devname] cursize_by_device[devname] = 0 } cursector_by_device[devname] = sector + size/512 cursize_by_device[devname] += size }