一、命令介紹ios
經常使用的命令爲 iostat -xkgit
x參數表示返回所有參數ide
k參數表示返回的數據單位爲kb函數
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %utilspa
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字符串
每一列的內容分別爲:string
若是須要獲取實時數值 還須要再加兩個參數 it
iostat -xk 10 2io
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隊列非空的時間比率
二、提取
這裏針對實現了兩個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; }