iostat命令介紹及C++對其返回值的提取處理
常用的命令為 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++對其返回值的提取處理