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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

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

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

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

top

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

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

什么是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 請求完成時(shí),處于空閑狀態(tài)的時(shí)間百分比(此時(shí)正在運(yùn)行著idle進(jìn)程)。

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

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

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

iowait統(tǒng)計(jì)原理

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

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

cat/proc/stat

命令輸出如下圖所示:

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

stat

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

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

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

在內(nèi)核中,每個(gè) CPU 都有一個(gè)cpu_usage_stat結(jié)構(gòu),主要用于統(tǒng)計(jì) 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)的時(shí)間。

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

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

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

增加iowait時(shí)間

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

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

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

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

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

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

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

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

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

如果當(dāng)前有進(jìn)程在等待 I/O 請求的話,那么增加iowait的時(shí)間。

如果當(dāng)前沒有進(jìn)程在等待 I/O 請求的話,那么增加idle的時(shí)間。

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

當(dāng)前進(jìn)程是idle進(jìn)程,也就是說 CPU 處于空閑狀態(tài)。

有進(jìn)程在等待 I/O 請求完成。

進(jìn)一步說,當(dāng) CPU 處于iowait狀態(tài)時(shí),說明 CPU 處于空閑狀態(tài),并且系統(tǒng)中有進(jìn)程因?yàn)榈却?I/O 請求而阻塞,也說明了 CPU 的利用率不夠充分。

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






審核編輯:劉清

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

    關(guān)注

    68

    文章

    10782

    瀏覽量

    210544
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    316

    瀏覽量

    21588
  • 時(shí)鐘中斷
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    7684

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用吉時(shí)利DMM的比率功能測量功率

    在TSP腳本和低電阻電流傳感電阻器的幫助下,我們實(shí)現(xiàn)了一個(gè)有趣的應(yīng)用,即使用DMM6500這樣的數(shù)字萬用表,通過比率功能測量功率。腳本基于的原理是,比率功能在一個(gè)讀數(shù)中同時(shí)存儲(chǔ)傳感和輸入電壓的電壓測量數(shù)據(jù),然后顯示輸入電壓與傳感電壓的比值。
    發(fā)表于 08-01 11:54 ?531次閱讀
    使用吉時(shí)利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 ?1470次閱讀

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

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

    linux統(tǒng)計(jì)文件個(gè)數(shù)

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

    比率法電阻測量電路圖

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

    一體化速印機(jī)的縮小比率/放大比率

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

    用于比率計(jì)算的除法運(yùn)算電路

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

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

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

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

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

    RTD比率式溫度測量應(yīng)用

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

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

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

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

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

    比特幣的庫存與流動(dòng)比率分析

    庫存與流動(dòng)比率(STF)較大的商品比庫存與流動(dòng)比率較小的商品更受青睞,因?yàn)樗鼈儽徽J(rèn)為更稀缺。黃金的比例最高,為62。這意味著,以目前的生產(chǎn)水平,需要62年才能生產(chǎn)出目前的黃金總供應(yīng)量。
    發(fā)表于 12-06 11:26 ?1288次閱讀

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

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

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

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