1. 程式人生 > >iostat命令介紹及C++對其返回值的提取處理

iostat命令介紹及C++對其返回值的提取處理

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++對其返回值的提取處理