"Fossies" - the Fresh Open Source Software Archive

Member "dstat-0.7.4/plugins/dstat_disk_tps.py" (17 Jan 2019, 2713 Bytes) of package /linux/privat/dstat-0.7.4.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. For more information about "dstat_disk_tps.py" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 0.7.3_vs_0.7.4.

    1 ### Author: Dag Wieers <dag$wieers,com>
    2 
    3 class dstat_plugin(dstat):
    4     """
    5     Number of read and write transactions per device.
    6 
    7     Displays the number of read and write I/O transactions per device.
    8     """
    9 
   10     def __init__(self):
   11         self.nick = ('#read', '#writ' )
   12         self.type = 'd'
   13         self.width = 5
   14         self.scale = 1000
   15         self.diskfilter = re.compile('^([hsv]d[a-z]+\d+|cciss/c\d+d\d+p\d+|dm-\d+|md\d+|mmcblk\d+p\d0|VxVM\d+)$')
   16         self.open('/proc/diskstats')
   17         self.cols = 2
   18 
   19     def discover(self, *objlist):
   20         ret = []
   21         for l in self.splitlines():
   22             if len(l) < 13: continue
   23             if l[3:] == ['0',] * 11: continue
   24             name = l[2]
   25             ret.append(name)
   26         for item in objlist: ret.append(item)
   27         if not ret:
   28             raise Exception('No suitable block devices found to monitor')
   29         return ret
   30 
   31     def vars(self):
   32         ret = []
   33         if op.disklist:
   34             varlist = op.disklist
   35         elif not op.full:
   36             varlist = ('total',)
   37         else:
   38             varlist = []
   39             for name in self.discover:
   40                 if self.diskfilter.match(name): continue
   41                 if name not in blockdevices(): continue
   42                 varlist.append(name)
   43 #           if len(varlist) > 2: varlist = varlist[0:2]
   44             varlist.sort()
   45         for name in varlist:
   46             if name in self.discover + ['total'] or name in op.diskset:
   47                 ret.append(name)
   48         return ret
   49 
   50     def name(self):
   51         return ['dsk/'+sysfs_dev(name) for name in self.vars]
   52 
   53     def extract(self):
   54         for name in self.vars: self.set2[name] = (0, 0)
   55         for l in self.splitlines():
   56             if len(l) < 13: continue
   57             if l[3] == '0' and l[7] == '0': continue
   58             if l[3:] == ['0',] * 11: continue
   59             name = l[2]
   60             if not self.diskfilter.match(name):
   61                 self.set2['total'] = ( self.set2['total'][0] + int(l[3]), self.set2['total'][1] + int(l[7]) )
   62             if name in self.vars and name != 'total':
   63                 self.set2[name] = ( self.set2[name][0] + int(l[3]), self.set2[name][1] + int(l[7]))
   64             for diskset in self.vars:
   65                 if diskset in op.diskset:
   66                     for disk in op.diskset[diskset]:
   67                         if re.match('^'+disk+'$', name):
   68                             self.set2[diskset] = ( self.set2[diskset][0] + int(l[3]), self.set2[diskset][1] + int(l[7]) )
   69 
   70         for name in self.set2:
   71             self.val[name] = list(map(lambda x, y: (y - x) / elapsed, self.set1[name], self.set2[name]))
   72 
   73         if step == op.delay:
   74             self.set1.update(self.set2)