IO性能篇-學習筆記

(說明:本文是《極客時間-linux性能優化實戰》的讀書筆記)

問題:磁盤和文件系統的關係?

答:磁盤爲系統提供了最基本的持久化存儲。
文件系統則在磁盤的基礎上,提供了一個用來管理文件的樹狀結構。
文件系統,自己是對存儲設備上的文件,進行組織管理的機制。組織方式不一樣,就會造成不一樣的文件系統。node

問題:索引節點和目錄項的功能與關係?

答:Linux 文件系統爲每一個文件都分配兩個數據結構,索引節點(index node)和目錄項(directory entry)。
索引節點( inode),用來記錄文件的元數據,好比 inode 編號、文件大小、訪問權限、修改日期、數據的位置等。索引節點和文件一一對應,它也會被持久化存儲到磁盤中,索引節點一樣佔用磁盤空間。
目錄項( dentry),用來記錄文件的名字、索引節點指針以及與其餘目錄項的關聯關係。多個關聯的目錄項,就構成了文件系統的目錄結構。不一樣於索引節點,目錄項是由內核維護的一個內存數據結構,一般也被叫作目錄項緩存。
索引節點是每一個文件的惟一標誌,目錄項維護的是文件系統的樹狀結構。
目錄項和索引節點的關係是多對一,能夠簡單理解爲,一個文件能夠有多個別名。linux

問題:linux中文件數據究竟是怎麼存儲的呢?

答:磁盤讀寫的最小單位是扇區,每一個扇區512B. 文件系統把連續的扇區組成邏輯塊,每次都以邏輯塊爲最小單元,來管理數據。常見的邏輯塊大小爲4KB,也就是連續的8個扇區組成。數據庫

問題:目錄項(dentry)和索引節點(inode) 分別存儲在哪裏?

答:dentry自己就是一個內存緩存,inode是存儲在磁盤中的數據。爲了加速文件訪問,inode會緩存到索引節點緩存cache中。緩存

問題:磁盤作文件系統格式化時,會被分紅哪幾個區域?

答:會被分紅超級塊區、索引節點區、數據塊區。
超級塊,存儲整個文件系統的狀態。
索引節點區,用來存儲索引節點。
數據塊區,則用來存儲文件數據。性能優化

問題:linux文件系統的四大基本要素是什麼?

答:目錄項(dentry),索引節點,邏輯塊(數據塊),超級塊。網絡

問題:VFS存在的必要性是什麼?
答:爲了支持不一樣的文件系統,Linux 內核在用戶進程和文件系統的中間,引入了抽象層——虛擬文件系統VFS。
VFS 定義了一組全部文件系統都支持的數據結構和標準接口。用戶進程和內核中的其餘子系統,只須要跟 VFS 提供的統一接口進行交互,不用再關心底層各類文件系統的實現細節。數據結構

問題:按照存儲位置的維度,文件系統的分類?

答: 基於磁盤的文件系統。常見的 Ext四、XFS、OverlayFS 等。
基於內存的文件系統。不須要任何磁盤分配存儲空間,但會佔用內存。如/proc文件系統、/sys文件系統。
網絡文件系統。好比 NFS、SMB、iSCSI 等。
這些文件系統,要先掛載到 VFS 目錄樹中的某個子目錄(稱爲掛載點),而後才能訪問其中的文件。拿第一類,也就是基於磁盤的文件系統爲例,在安裝系統時,要先掛載一個根目錄(/),在根目錄下再把其餘文件系統(好比其餘的磁盤分區、/proc 文件系統、/sys 文件系統、NFS 等)掛載進來。
異步

問題:文件IO的分類?

答:緩衝與非緩衝 I/O、直接與非直接 I/O、阻塞與非阻塞 I/O、同步與異步 I/O。性能

 

問題:緩衝I/O與非緩衝I/O的區別?

答:根據是否利用標準庫緩存,能夠把文件 I/O 分爲緩衝 I/O 與非緩衝 I/O。
緩衝 I/O,是指利用標準庫緩存來加速文件的訪問,而標準庫內部再經過系統調度訪問文件。
非緩衝 I/O,是指直接經過系統調用來訪問文件,再也不通過標準庫緩存。優化

 

問題:直接IO與非直接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,是指應用程序執行 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 完成後,響應會用事件通知的方式,告訴應用程序。

問題:怎麼觀察頁緩存的大小?(待解)

在前面 Cache 案例中,我已經介紹過,能夠用 free 或 vmstat,來觀察頁緩存的大小。複習一下,free 輸出的 Cache,是頁緩存和可回收 Slab 緩存的和,你能夠從 /proc/meminfo ,直接獲得它們的大小

問題:怎麼觀察文件系統中的目錄項和索引節點緩存?

內核使用 Slab 機制,管理目錄項和索引節點的緩存。/proc/meminfo 只給出了 Slab 的總體大小,具體到每一種 Slab 緩存,還要查看 /proc/slabinfo 這個文件。好比,運行下面的命令,能夠獲得全部目錄項和各類文件系統索引節點的緩存狀況。
命令1:查看全部目錄項和各類文件系統索引節點的緩存狀況
$ cat /proc/slabinfo | grep -E '^#|dentry|inode'
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
xfs_inode 0 0 960 17 4 : tunables 0 0 0 : slabdata 0 0 0
...
ext4_inode_cache 32104 34590 1088 15 4 : tunables 0 0 0 : slabdata 2306 2306 0hugetlbfs_inode_cache 13 13 624 13 2 : tunables 0 0 0 : slabdata 1 1 0
sock_inode_cache 1190 1242 704 23 4 : tunables 0 0 0 : slabdata 54 54 0
shmem_inode_cache 1622 2139 712 23 4 : tunables 0 0 0 : slabdata 93 93 0
proc_inode_cache 3560 4080 680 12 2 : tunables 0 0 0 : slabdata 340 340 0
inode_cache 25172 25818 608 13 2 : tunables 0 0 0 : slabdata 1986 1986 0
dentry 76050 121296 192 21 1 : tunables 0 0 0 : slabdata 5776 5776 0

命令2:實際性能分析中常使用 slabtop ,來找到佔用內存最多的緩存類型
# 按下c按照緩存大小排序,按下a按照活躍對象數排序
$ slabtop
Active / Total Objects (% used) : 277970 / 358914 (77.4%)
Active / Total Slabs (% used) : 12414 / 12414 (100.0%)
Active / Total Caches (% used) : 83 / 135 (61.5%)
Active / Total Size (% used) : 57816.88K / 73307.70K (78.9%)
Minimum / Average / Maximum Object : 0.01K / 0.20K / 22.88K

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
69804 23094 0% 0.19K 3324 21 13296K dentry
16380 15854 0% 0.59K 1260 13 10080K inode_cache
58260 55397 0% 0.13K 1942 30 7768K kernfs_node_cache
485 413 0% 5.69K 97 5 3104K task_struct
1472 1397 0% 2.00K 92 16 2944K kmalloc-2048

問題:什麼是頁緩存和可回收Slab緩存?

相關文章
相關標籤/搜索