今天繼續拜讀「深刻淺出計算機組成原理」專欄,以爲講 IO_WAIT 這篇頗有意思,正好能夠結合前面的一篇講物理硬件存速度的一起看。ios
如今咱們看硬盤廠商出品的性能報告,一般會看到兩個指標,一個是響應時間(Response Time) 另一個是 數據傳輸速率 (Data Transfer Rate) 。nginx
目前硬盤分兩種,一種是 HDD 硬盤,也就是傳統的機械硬盤.使用的是傳統的 SATA3.0 的接口,而另一種是 SSD 盤,也就是如今被咱們成爲固態硬盤的東西。它既可使用 SATA3.0 接口,還可使用另一種叫作 PCI EXPRESS 的接口(如下稱爲 PCI 接口)。這裏要補充一下 PCI 接口的吞吐率大幅高於 SATA3.0 的接口。 使用 SATA3.0 口的固態硬盤可能面臨 接口的傳輸速率極限而限制了硬盤自己讀寫速度的發揮。服務器
如今咱們 SATA3.0 的貸款大體是 6Gbit/s 也就是 6 * 1024 / 8 約768 MB/s 的速度。這是一個很高的理論帶寬值,根據專欄提供的數據,咱們平時使用傳輸速率差很少只有 200MB/s多線程
這裏我插入一個 訪問延時的比較圖併發
這是咱們平時常常接觸的存儲器的訪問延時狀況,能夠看到 上面提到的 HDD 和 SSD 盤是最便宜的兩種,隨機訪問延時 SSD 差很少是 150 微秒, HDD 則已經到毫秒級別。速度越快的存儲,存量越小,越貴。性能
下面咱們繼續回到 HDD 和 SSD 這種通用外部存儲上來。這裏有一張使用 PCI 接口的 SSD 傳輸圖spa
第一行參數 Seq 表明 SSD 進行順序讀寫時候的速度,能夠看到 - - 真是很是快啊。.net
第二行 4k 表明對 4k 大小文件進行隨機讀寫的效率。能夠看到- - 真是很是慢啊,對比 seq 的速度真是慢了不知道多少。線程
第三行 4K-64 64thrd表示多線程併發操做的性能,通常我的使用狀況下不會用到如此多線程,通常也就qd=3,可是這個指標對服務器應用很重要。code
第四行 acc表明咱們以前說的響應時間能夠看到 0.066ms ,還記得咱們上面的隨機讀取延時圖嗎,就跟這個時間差很少。
另外還有一個指標也是衡量吞吐量很重要的指標, IOPS(每秒讀寫次數)
好比隨機讀寫,咱們隨機讀性能是 40MB/S 那麼咱們讀 4kb 文件
40*1024 / 4 ~= 10000 IOPS 寫入差很少 20000
由於咱們在實際應用的開發中,對於數據的訪問,更多的是隨機讀寫,而不是順序讀寫。咱們平時說的服務器承受的 「併發」,實際上是在說,會有不少個不一樣的進程和請求來訪問服務器。天然,它們在硬盤上訪問的數據,是很難順序放在一塊兒的。在這種狀況下,隨機讀寫的 IOPS 纔是服務器性能的核心指標。
根據專欄給出的數據,正常的 HDD IOPS 僅有 100 左右。
這個 100 應該是這麼計算的,首先咱們假設是一個 每分鐘 7200 轉的 HDD 盤
在隨機讀取的狀況下,每轉半圈大概能夠找到一個目標幾何區 也就是每分鐘能夠轉 240 個半圈
1s/240 = 4.17 這是平均延時(Average Latency)
另外咱們還須要進行尋道,在盤面旋轉以後咱們懸臂定位到指定扇區的時間,如今 HDD 盤平均尋道時間在 4-10ms
因此咱們平均每 4.17 + 4 - 4.17 + 10 = 8 - 14 ms 完成一次數據存取。
那麼對應 IOPS 就是 70 - 125 ,平均一下 100 就是這麼來的。
上面介紹了那麼多如何衡量硬盤的讀寫,下面咱們來回歸到主題,如何定位 IO_WAIT
使用
top
top - 06:26:30 up 4 days, 53 min, 1 user, load average: 0.79, 0.69, 0.65 Tasks: 204 total, 1 running, 203 sleeping, 0 stopped, 0 zombie %Cpu(s): 20.0 us, 1.7 sy, 0.0 ni, 77.7 id, 0.0 wa, 0.0 hi, 0.7 si, 0.0 st KiB Mem: 7679792 total, 6646248 used, 1033544 free, 251688 buffers KiB Swap: 0 total, 0 used, 0 free. 4115536 cached Mem
第三行 wa 就表明 cpu 的 io_wait 狀況。這裏能夠用把這些簡寫都大概介紹一下
us:用戶佔用 cpu 比例
sy:內核空間佔用 cpu 比例
ni:用戶進程空間內改變過優先級的進程佔用CPU百分比
id:空閒CPU百分比
wa: 等待 io 的 cpu 時間佔比
hi:硬件中斷
si:軟件中斷
st: 不知道是啥- - 不知道作什麼用
若是咱們看到 wa 很是高,說明 cpu 等待 io 的狀況比較嚴重。若是咱們發現了 wa 很高能夠繼續執行 iostat 查看詳情。
iostat
Linux 3.10.0-514.21.1.el7.x86_64 (iZ2ze3vworsqn8xb3m9zn5Z) 09/26/2019 _x86_64_ (8 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 1.02 0.00 0.59 0.21 0.00 98.18 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn vda 18.59 29.85 200.15 1033068029 6926347580 vdb 0.23 5.13 78.92 177419637 2731053200
這是一臺我部署了 kafka 的機器執行 iostat 的狀況。
能夠看到 iowait 的狀況,以及單個磁盤 tps(iops)的狀況。這時候咱們要找出究竟是哪一個程序這麼吃 io 咱們使用
iotop
注意 iotop 在 CentOS7.X 版本上好像不是默認安裝的,能夠安裝一下 yum -i install iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 15.75 K/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 35.44 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 104 be/3 root 0.00 B/s 7.88 K/s 0.00 % 0.18 % [jbd2/sda1-8] 383 be/4 root 0.00 B/s 3.94 K/s 0.00 % 0.00 % rsyslogd -n [rs:main Q:Reg] 1514 be/4 www-data 0.00 B/s 3.94 K/s 0.00 % 0.00 % nginx: worker process
若是有應用一直在前排 且 IO> 一直很是大,咱們能夠從 COMMAND 列定位到該程序進行查看。
以上。
Ref:
https://blog.csdn.net/Sasoritattoo/article/details/9318893 CPU狀態信息us,sy,ni,id,wa,hi,si,st含義
https://serverfault.com/questions/155882/wa-waiting-for-i-o-from-top-command-is-big wa (Waiting for I/O) from top command is big
https://time.geekbang.org/column/article/113809 極客時間「深刻淺出計算機組成原理」44講「理解 IO_WAIT」: I/O 性能究竟是怎麼回事兒?
https://en.wikipedia.org/wiki/IOPS