精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

看看Linux是怎么統計iowait比率的?

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

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

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

top

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

本文主要介紹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 請求完成時,處于空閑狀態的時間百分比(此時正在運行著idle進程)。

可以看出,如果系統處于iowait狀態,那么必須滿足以下兩個條件:

系統中存在等待 I/O 請求完成的進程。

系統當前正處于空閑狀態,也就是說沒有可運行的進程。

iowait統計原理

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

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

cat/proc/stat

命令輸出如下圖所示:

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

stat

紅色方框中的數據就是iowait占用的時間。

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

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

在內核中,每個 CPU 都有一個cpu_usage_stat結構,主要用于統計 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結構的iowait字段記錄了 CPU 處于iowait狀態的時間。

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

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

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

增加iowait時間

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

答案是:系統時鐘中斷。

在系統時鐘中斷中,會調用account_process_tick()函數來更新 CPU 的時間,代碼如下:

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

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

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

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()函數的邏輯比較簡單,主要分以下兩種情況進行處理:

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

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

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

當前進程是idle進程,也就是說 CPU 處于空閑狀態。

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

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

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






審核編輯:劉清

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

    關注

    68

    文章

    10826

    瀏覽量

    211162
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21619
  • 時鐘中斷
    +關注

    關注

    0

    文章

    4

    瀏覽量

    7692

原文標題:系統性能分析之|iowait是什么?

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

收藏 人收藏

    評論

    相關推薦

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

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

    如何在Linux使用iostat命令

    IO等待或者`iowait`,`wait`,`wa`,`%iowait`,或者`wait%`通常可以通過Linux系統監控工具查看。例如命令行工具top、sar、atop等。
    的頭像 發表于 01-04 17:17 ?1524次閱讀

    統計工具箱函數匯總

    對matlab中的統計工具箱函數都有所介紹,比較詳細,大家可以看看
    發表于 11-15 10:07

    linux統計文件個數

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

    比率法電阻測量電路圖

    比率法電阻測量電路圖
    發表于 04-08 09:03 ?1054次閱讀

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

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

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

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

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

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

    算法大全_數據的統計描述和分析

    算法大全第10章_數據的統計描述和分析,有需要的下來看看
    發表于 01-14 17:47 ?0次下載

    RTD比率式溫度測量應用

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

    小差比率制動系數校驗的優化

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

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

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

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

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

    帶大家看看Linux內核如何調度進程的

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

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

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