def get_other_iostat(self):
curr_stat = psutil.disk_io_counters(True)
curr_cpu_time = self.sum_cpu_time(psutil.cpu_times()) / self.cpu_count
if self.last_cpu_time == 0: #???
self.last_stat = curr_stat
self.last_cpu_time = curr_cpu_time
return {}, 0
data_per_disk = {k: 0 for k in self.metric_define}
count = 0
ts = curr_cpu_time - self.last_cpu_time
for disk, nval in curr_stat.iteritems():
oval = self.last_stat.get(disk)# ?????
if not oval:
continue
total_time = nval.write_time - oval.write_time + nval.read_time - oval.read_time
total_count = nval.write_count - oval.write_count + nval.read_count - oval.read_count
if not total_count: # ?????IO????????
continue
data_per_disk['io.w_s'] += (nval.write_count - oval.write_count) / ts
data_per_disk['io.wkbyte_s'] += (nval.write_bytes - oval.write_bytes) / 1024 / ts
data_per_disk['io.r_s'] += (nval.read_count - oval.read_count) / ts
data_per_disk['io.rkbyte_s'] += (nval.read_bytes - oval.read_bytes) / 1024 / ts
data_per_disk['io.await'] += total_time / total_count if total_count else 0.0
if hasattr(oval, 'busy_time'):# linux?psutil==4.0.0??busy_time
data_per_disk['io.svctm'] += (nval.busy_time - oval.busy_time) / total_count if total_count else 0.0
io_util = (nval.busy_time - oval.busy_time) * 100.0 / (ts*1000)
if io_util > data_per_disk['io.util']:# ?????
data_per_disk['io.util'] = io_util if io_util < 100 else 100
data_per_disk['io.queue_time_percent'] = (data_per_disk['io.await'] - data_per_disk['io.svctm']) * 100 / data_per_disk['io.await'] if data_per_disk['io.await'] else 0
count += 1
self.last_stat = curr_stat
self.last_cpu_time = curr_cpu_time
return data_per_disk, count
评论列表
文章目录