0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

看看Linux是怎么統(tǒng)計iowait比率的?

Linux愛好者 ? 來源:Linux內(nèi)核那些事 ? 2023-04-27 09:28 ? 次閱讀

我們對系統(tǒng)性能進行優(yōu)化時,一般會使用top命令來查看系統(tǒng)負載和系統(tǒng)中各個進程的運行情況,從而找出影響系統(tǒng)性能的因素。如下圖所示:

f050fede-e47b-11ed-ab56-dac502259ad0.png

top

top命令會輸出很多系統(tǒng)相關的信息,如:系統(tǒng)負載、系統(tǒng)中的進程數(shù)、CPU使用率和內(nèi)存使用率等,這些信息對排查系統(tǒng)性能問題起著至關重要的作用。

本文主要介紹top命令中的iowait指標(如上圖中紅色方框所示)的含義和作用。

什么是iowait

什么是iowait?我們來看看 Linux 的解釋:

Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.

中文翻譯的意思就是:CPU 在等待磁盤 I/O 請求完成時,處于空閑狀態(tài)的時間百分比(此時正在運行著idle進程)。

可以看出,如果系統(tǒng)處于iowait狀態(tài),那么必須滿足以下兩個條件:

系統(tǒng)中存在等待 I/O 請求完成的進程。

系統(tǒng)當前正處于空閑狀態(tài),也就是說沒有可運行的進程。

iowait統(tǒng)計原理

既然我們知道了iowait的含義,那么接下來看看 Linux 是怎么統(tǒng)計iowait的比率的。

Linux 會把iowait占用的時間輸出到/proc/stat文件中,我們可以通過一下命令來獲取到iowait占用的時間:

cat/proc/stat

命令輸出如下圖所示:

f098ae5a-e47b-11ed-ab56-dac502259ad0.png

stat

紅色方框中的數(shù)據(jù)就是iowait占用的時間。

我們可以每隔一段時間讀取一次/proc/stat文件,然后把兩次獲取到的iowait時間進行相減,得到的結(jié)果是這段時間內(nèi),CPU處于iowait狀態(tài)的時間。接著再將其除以總時間,得到iowait占用總時間的比率。

現(xiàn)在我們來看看/proc/stat文件是怎樣獲取iowait的時間的。

在內(nèi)核中,每個 CPU 都有一個cpu_usage_stat結(jié)構(gòu),主要用于統(tǒng)計 CPU 一些信息,其定義如下:

structcpu_usage_stat{
cputime64_tuser;
cputime64_tnice;
cputime64_tsystem;
cputime64_tsoftirq;
cputime64_tirq;
cputime64_tidle;
cputime64_tiowait;
cputime64_tsteal;
cputime64_tguest;
cputime64_tguest_nice;
};

cpu_usage_stat結(jié)構(gòu)的iowait字段記錄了 CPU 處于iowait狀態(tài)的時間。

所以要獲取系統(tǒng)處于iowait狀態(tài)的總時間,只需要將所有 CPU 的iowait時間相加即可,代碼如下(位于源文件fs/proc/stat.c):

staticintshow_stat(structseq_file*p,void*v)
{
u64iowait;
...
//1.遍歷系統(tǒng)中的所有CPU
for_each_possible_cpu(i){
...
//2.獲取CPU對應的iowait時間,并相加
iowait=cputime64_add(iowait,kstat_cpu(i).cpustat.iowait);
...
}
...
return0;
}

show_stat()函數(shù)首先會遍歷所有 CPU,然后讀取其iowait時間,并且將它們相加。

增加iowait時間

從上面的分析可知,每個 CPU 都有一個用于統(tǒng)計iowait時間的計數(shù)器,那么什么時候會增加這個計數(shù)器呢?

答案是:系統(tǒng)時鐘中斷。

在系統(tǒng)時鐘中斷中,會調(diào)用account_process_tick()函數(shù)來更新 CPU 的時間,代碼如下:

voidaccount_process_tick(structtask_struct*p,intuser_tick)
{
cputime_tone_jiffy_scaled=cputime_to_scaled(cputime_one_jiffy);
structrq*rq=this_rq();

//1.如果當前進程處于用戶態(tài),那么增加用戶態(tài)的CPU時間
if(user_tick){
account_user_time(p,cputime_one_jiffy,one_jiffy_scaled);
}
//2.如果前進程處于內(nèi)核態(tài),并且不是idle進程,那么增加內(nèi)核態(tài)CPU時間
elseif((p!=rq->idle)||(irq_count()!=HARDIRQ_OFFSET)){
account_system_time(p,HARDIRQ_OFFSET,cputime_one_jiffy,
one_jiffy_scaled);
}
//3.如果當前進程是idle進程,那么調(diào)用account_idle_time()函數(shù)進行處理
else{
account_idle_time(cputime_one_jiffy);
}
}

我們主要關注當前進程是idle進程的情況,這是內(nèi)核會調(diào)用account_idle_time()函數(shù)進行處理,其代碼如下:

voidaccount_idle_time(cputime_tcputime)
{
structcpu_usage_stat*cpustat=&kstat_this_cpu.cpustat;
cputime64_tcputime64=cputime_to_cputime64(cputime);
structrq*rq=this_rq();

//1.如果當前有進程在等待IO請求的話,那么增加iowait的時間
if(atomic_read(&rq->nr_iowait)>0){
cpustat->iowait=cputime64_add(cpustat->iowait,cputime64);
}
//2.否則增加idle的時間
else{
cpustat->idle=cputime64_add(cpustat->idle,cputime64);
}
}

account_idle_time()函數(shù)的邏輯比較簡單,主要分以下兩種情況進行處理:

如果當前有進程在等待 I/O 請求的話,那么增加iowait的時間。

如果當前沒有進程在等待 I/O 請求的話,那么增加idle的時間。

所以,從上面的分析可知,要增加iowait的時間需要滿足以下兩個條件:

當前進程是idle進程,也就是說 CPU 處于空閑狀態(tài)。

有進程在等待 I/O 請求完成。

進一步說,當 CPU 處于iowait狀態(tài)時,說明 CPU 處于空閑狀態(tài),并且系統(tǒng)中有進程因為等待 I/O 請求而阻塞,也說明了 CPU 的利用率不夠充分。

這時,我們可以使用異步 I/O(如iouring)來優(yōu)化程序,使得進程不會被 I/O 請求阻塞。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10803

    瀏覽量

    210786
  • LINUX內(nèi)核

    關注

    1

    文章

    316

    瀏覽量

    21605
  • 時鐘中斷
    +關注

    關注

    0

    文章

    4

    瀏覽量

    7684

原文標題:系統(tǒng)性能分析之|iowait是什么?

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    使用吉時利DMM的比率功能測量功率

    在TSP腳本和低電阻電流傳感電阻器的幫助下,我們實現(xiàn)了一個有趣的應用,即使用DMM6500這樣的數(shù)字萬用表,通過比率功能測量功率。腳本基于的原理是,比率功能在一個讀數(shù)中同時存儲傳感和輸入電壓的電壓測量數(shù)據(jù),然后顯示輸入電壓與傳感電壓的比值。
    發(fā)表于 08-01 11:54 ?536次閱讀
    使用吉時利DMM的<b class='flag-5'>比率</b>功能測量功率

    如何在Linux使用iostat命令

    IO等待或者`iowait`,`wait`,`wa`,`%iowait`,或者`wait%`通??梢酝ㄟ^Linux系統(tǒng)監(jiān)控工具查看。例如命令行工具top、sar、atop等。
    的頭像 發(fā)表于 01-04 17:17 ?1497次閱讀

    統(tǒng)計工具箱函數(shù)匯總

    對matlab中的統(tǒng)計工具箱函數(shù)都有所介紹,比較詳細,大家可以看看
    發(fā)表于 11-15 10:07

    linux統(tǒng)計文件個數(shù)

    這篇文章主要介紹了Linux統(tǒng)計當前文件夾下的文件個數(shù)、目錄個數(shù),本文使用ls命令配合管理、grep命令實現(xiàn)統(tǒng)計需求,需要的朋友可以參考下
    發(fā)表于 07-24 08:40

    比率法電阻測量電路圖

    比率法電阻測量電路圖
    發(fā)表于 04-08 09:03 ?1052次閱讀

    一體化速印機的縮小比率/放大比率

    一體化速印機的縮小比率/放大比率    一體化速印機的縮小比率      &
    發(fā)表于 12-31 09:59 ?1374次閱讀

    用于比率計算的除法運算電路

    用于比率計算的除法運算電路 電路的功能 本電路是用X除輸入信號Z
    發(fā)表于 05-08 15:29 ?1711次閱讀
    用于<b class='flag-5'>比率</b>計算的除法運算電路

    絕對輸出iMEMS陀螺儀與比率ADC的配合使用

    iMEMS陀螺儀常常與許多集成在微控制器中的低成本比率ADC配合使用。本應用筆記將簡要介紹如何實現(xiàn)陀螺儀的絕對(不隨電源電壓變化而變化)輸出與比率ADC的連接。
    發(fā)表于 02-02 17:26 ?21次下載

    算法大全_數(shù)據(jù)的統(tǒng)計描述和分析

    算法大全第10章_數(shù)據(jù)的統(tǒng)計描述和分析,有需要的下來看看。
    發(fā)表于 01-14 17:47 ?0次下載

    RTD比率式溫度測量應用

    比率式測量中使用RTD有一定優(yōu)勢,因為它能消除激勵電流源的精度和漂移等誤差源。下面是4線RTD比率式測量的典型電路。4線式配置的優(yōu)勢是可消除由引腳電阻產(chǎn)生的誤差。
    發(fā)表于 03-23 15:56 ?3595次閱讀
    RTD<b class='flag-5'>比率</b>式溫度測量應用

    小差比率制動系數(shù)校驗的優(yōu)化

    針對傳統(tǒng)小差比率制動系數(shù)校驗方法存在校驗結(jié)果可能不準確的問題,從固定相位調(diào)節(jié)幅值校驗方法出發(fā),得到了其簡化的等價模型,并根據(jù)校驗需滿足的條件,提出了一種小差比率制動系數(shù)校驗新方法。該方法能保證校驗
    發(fā)表于 03-16 11:21 ?0次下載
    小差<b class='flag-5'>比率</b>制動系數(shù)校驗的優(yōu)化

    加密貨幣交易中采用的夏普比率是什么

    夏普比率(Sharpe Ratio),又被稱為夏普指數(shù) --- 基金績效評價標準化指標。夏普比率在現(xiàn)代投資理論的研究表明,風險的大小在決定組合的表現(xiàn)上具有基礎性的作用。風險調(diào)整后的收益率就是一個可以同時對收益與風險加以考慮的綜合指標,以期能夠排除風險因素對績效評估的不利影
    發(fā)表于 08-29 10:33 ?1219次閱讀

    比特幣的庫存與流動比率分析

    庫存與流動比率(STF)較大的商品比庫存與流動比率較小的商品更受青睞,因為它們被認為更稀缺。黃金的比例最高,為62。這意味著,以目前的生產(chǎn)水平,需要62年才能生產(chǎn)出目前的黃金總供應量。
    發(fā)表于 12-06 11:26 ?1299次閱讀

    帶大家看看Linux內(nèi)核如何調(diào)度進程的

    部分,打開調(diào)度器的黑匣子,來看看Linux內(nèi)核如何調(diào)度進程的。實際上,進程調(diào)度器主要做兩件事:選擇下一個進程,然后進行上下文切換。 而何時調(diào)用主調(diào)度器調(diào)度進程那是調(diào)度時機所關注的問題,而調(diào)度時機在之前的內(nèi)核搶占文章已經(jīng)做了詳細講解,在此不在贅述,而本文關注的調(diào)度時機是真正
    的頭像 發(fā)表于 07-26 15:14 ?1984次閱讀

    深入探究Linux系統(tǒng)噪音統(tǒng)計(osnoise tracer)

    Linux系統(tǒng)中作為一個普通線程是非??啾频?。不僅NMI 、硬中斷、軟中斷可以打斷它,甚至其它普通線程也可以來打斷干擾到它的運行。 如果沒有這些打斷事件,一個普通線程執(zhí)行while循環(huán),可以
    的頭像 發(fā)表于 09-18 10:53 ?1762次閱讀
    深入探究<b class='flag-5'>Linux</b>系統(tǒng)噪音<b class='flag-5'>統(tǒng)計</b>(osnoise tracer)