码迷,mamicode.com
首页 > 移动开发 > 详细

iostat命令介绍及C++对其返回值的提取处理

时间:2018-02-27 21:22:56      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:linux   运维   C++   

1、命令介绍

常用的命令为 iostat -xk

x参数表示返回全部参数

k参数表示返回的数据单位为kb

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00

vdb               0.00     0.00    0.00   71.00     0.00   284.00     8.00     0.07    0.96   0.04   0.30

每一列的内容分别为:

 

如果需要获取实时数值 还需要再加两个参数 

iostat -xk 10 2

10表示: 采样间隔为10秒

2表示  : 采集两次(第一次为总的,等同于直接调用 iostat -xk, 因此要获取实时数值这个参数至少传2 )

  • rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并

  • wrqm/s: 每秒对该设备的写请求被合并次数

  • r/s: 每秒完成的读次数

  • w/s: 每秒完成的写次数

  • rkB/s: 每秒读数据量(kB为单位)

  • wkB/s: 每秒写数据量(kB为单位)

  • avgrq-sz:平均每次IO操作的数据量(扇区数为单位)

  • avgqu-sz: 平均等待处理的IO请求队列长度

  • await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)

  • svctm: 平均每次IO请求的处理时间(毫秒为单位)

  • %util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率

2、提取

这里针对实现了两个C++的函数

首先将返回值按行分割开,可以用这个方法:

void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c)     
{                                                                                             
    std::string::size_type pos1, pos2;                                                         
    pos2 = s.find(c);                                                                         
    pos1 = 0;                                                                                 
    while(std::string::npos != pos2) {                                                         
        v.push_back(s.substr(pos1, pos2-pos1));                                               
        pos1 = pos2 + c.size();                                                               
        pos2 = s.find(c, pos1);                                                               
    }                                                                                         
    if(pos1 != s.length()) {                                                                   
        v.push_back(s.substr(pos1));                                                           
    }                                                                                         
}

分割之后每一行的提取就比较麻烦了,因为这些数值之间都是用不等数目的空格进行分割的,因此实现一个方法:

/* 读取字符串,提取其中的所有数字(包括小数) */
std::vector<double> digDigit(const std::string& src) {
    std::vector<double> ret;
    std::string num = "";
    bool hasPoint = false;
    for(std::string::const_iterator s_it = src.begin(); s_it != src.end(); ++s_it) {
        char cur = *s_it;
        if( (cur >= '0' && cur <= '9') || cur == '.') {
            if(cur == '.') {  // 小数点
                if(hasPoint) {
                    num = "";
                    continue;
                }else {
                    hasPoint = true;
                    num += cur;
                }
           }else {  // 数字
               num += cur;
           }
        }else {
            if(num != "") {
                // std::cout << num << std::endl;
                ret.push_back(atof(num.c_str()));
                hasPoint = false;
                num = "";
            }
        }
    }
    if(num != "") {
        // std::cout << num << std::endl;
        ret.push_back(atof(num.c_str()));
    }
    return ret;
}


iostat命令介绍及C++对其返回值的提取处理

标签:linux   运维   C++   

原文地址:http://blog.51cto.com/zhweizhi/2073692

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!