Linux效能優化實戰學習筆記 第三十二講

2021-10-10 15:20:47 字數 4684 閱讀 2632

在檔案系統的工作原理篇中,我曾經介紹了阻塞、非阻塞 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   swpdfreebuff  cache   si   so    bi    boincs us syidwa 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   swpdfreebuff  cache   si   so    bi    boincs us syidwa 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 的測試報告,每次...