在檔案系統的工作原理篇中,我曾經介紹了阻塞、非阻塞 i/o 以及同步、非同步 i/o 的含義,這裡我們再簡單回顧一下。
首先我們來看阻塞和非阻塞 i/o。根據應用程式是否阻塞自身執行,可以把 i/o 分為阻塞i/o 和非阻塞 i/o。
再來看同步 i/o 和非同步 i/o。根據 i/o 響應的通知方式的不同,可以把檔案 i/o 分為同步i/o 和非同步 i/o。
你可以看出,阻塞 / 非阻塞和同步 / 非同步,其實就是兩個不同角度的 i/o 劃分方式。它們描述的物件也不同,阻塞 / 非阻塞針對的是 i/o 呼叫者(即應用程式),而同步 / 非同步針
對的是 i/o 執行者(即系統)。
我舉個例子來進一步解釋下。比如在 linux i/o 呼叫中,
再如,在網路套接字的介面中,
在 檔案系統原理 文章的最後,我給你留了一道思考題,那就是執行 find 命令時,會不會導致系統的快取公升高呢?如果會導致,公升高的又是哪種型別的快取呢?
關於這個問題,白華和 coyang 的答案已經很準確了。通過學習 linux 檔案系統的原理,我們知道,檔名以及檔案之間的目錄關係,都放在目錄項快取中。而這是乙個基於記憶體
的資料結構,會根據需要動態構建。所以,查詢檔案時,linux 就會動態構建不在快取中的目錄項結構,導致 dentry 快取公升高。
事實上,除了目錄項快取增加,buffer 的使用也會增加。如果你用 vmstat 觀察一下,會發現 buffer 和 cache 都在增長:
vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd
free
buff cache si so bi bo
in
cs us sy
id
wa st
0 1 0 7563744 6024 225944 0 0 3736 0 574 3249 3 5 89 3 0
1 0 0 7542792 14736 236856 0 0 8708 0 13494 32335 8 19 66 7 0
0 1 0 7494452 27280 272284 0 0 12544 0 4550 17084 5 15 68 13 0
0 1 0 7475084 42380 276320 0 0 15096 0 2541 14253 2 6 78 13 0
0 1 0 7455728 57600 280436 0 0 15220 0 2025 14518 2 6 70 22 0
這裡,buffer 的增長是因為,構建目錄項快取所需的元資料(比如檔名稱、索引節點等),需要從檔案系統中讀取。
在 磁碟 i/o 延遲案例的最後,我給你留了一道思考題。
我們通過 iostat ,確認磁碟 i/o 已經出現了效能瓶頸,還用 pidstat 找出了大量磁碟 i/o的程序。但是,隨後使用 strace 跟蹤這個程序,卻找不到任何 write 系統呼叫。這是為什麼呢?
你看,僅僅是不恰當的選項,都可能會導致效能工具「犯錯」,呈現這種看起來不合邏輯的結果。非常高興看到,這麼多同學已經掌握了效能工具使用的核心思路——弄清楚工具
本身的原理和問題。
在 mysql 案例的最後,我給你留了乙個思考題。
為什麼 dataservice 應用停止後,即使仍沒有索引,mysql 的查詢速度還是快了很多,並且磁碟 i/o 瓶頸也消失了呢?
所以,如果你用 vmstat 工具,觀察快取和 i/o 的變化趨勢,就會發現下面這樣的結果:
vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd
free
buff cache si so bi bo
in
cs us sy
id
wa st
# 備註: dataservice 正在執行
0 1 0 7293416 132 366704 0 0 32516 12 36 546 1 3 49 48 0
0 1 0 7260772 132 399256 0 0 32640 0 37 463 1 1 49 48 0
0 1 0 7228088 132 432088 0 0 32640 0 30 477 0 1 49 49 0
0 0 0 7306560 132 353084 0 0 20572 4 90 574 1 4 69 27 0
0 2 0 7282300 132 368536 0 0 15468 0 32 304 0 0 79 20 0
# 備註:dataservice 從這裡開始停止
0 0 0 7241852 1360 424164 0 0 864 320 133 1266 1 1 94 5 0
0 1 0 7228956 1368 437400 0 0 13328 0 45 366 0 0 83 17 0
0 1 0 7196320 1368 470148 0 0 32640 0 33 413 1 1 50 49 0
...
0 0 0 6747540 1368 918576 0 0 29056 0 42 568 0 0 56 44 0
0 0 0 6747540 1368 918576 0 0 0 0 40 141 1 0 100 0 0
在 dataservice 停止前,cache 會連續增長三次後再降回去,這正是因為 dataservice 每隔 3 秒清理一次頁快取。而 dataservice 停止後,cache 就會不停地增長,直到增長為
918576 後,就不再變了。
這時,磁碟的讀(bi)降低到 0,同時,iowait(wa)也降低到 0,這說明,此時的所有資料都已經在系統的快取中了。我們知道,快取是記憶體的一部分,它的訪問速度比磁碟快
得多,這也就能解釋,為什麼 mysql 的查詢速度變快了很多。
從這個案例,你會發現,mysql 的 myisam 引擎,本身並不快取資料,而要依賴系統快取來加速磁碟 i/o 的訪問。一旦系統中還有其他應用同時執行,myisam 引擎就很難充分
利用系統快取。因為系統快取可能被其他應用程式占用,甚至直接被清理掉。
所以,一般來說,我並不建議,把應用程式的效能優化完全建立在系統快取上。還是那句話,最好能在應用程式的內部分配記憶體,構建完全自主控制的快取,比如 mysql 的
innodb 引擎,就同時快取了索引和資料;或者,可以使用第三方的快取應用,比如memcached、redis 等。
LinuxIO效能優化實戰學習筆記
以下內容來自極客課程,如對您有幫助,詳細課程請見海報 1.檔案系統 為了方便管理,linux 檔案系統為每個檔案都分配兩個資料結構,索引節點 index node 和目錄項 directory entry 它們主要用來記錄檔案的元資訊和目錄結構。2.slab cache cached sreclai...
學習Linux效能優化實戰 1
程序排程 軟中斷測試工具 最近在極客時間上面發現了倪鵬飛老師的linux效能優化實戰,自己感覺講得很好,有興趣的朋友可以去極客時間上面訂閱。部落格是自己總結學習到的一些命令,記錄下來,以備後面使用。侵刪。uptime 用來看系統過去的 1 5 15 分鐘的平均負載。mpstat p all inte...
Linux效能優化實戰學習筆記 第三講
上下文切換是對任務當前執行狀態的暫存和恢復 當多個程序競爭cpu的時候,cpu為了保證每個程序能公平被排程執行,採取了處理任務時間分片的機制,輪流處理多個程序,由於cpu處理速度非常快,在人類的感官上認為是並行處理,實際是 偽 並行,同一時間只有乙個任務在執行處理。根據 tsuna 的測試報告,每次...