iostat命令介紹及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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章