Linux 記憶體子系統常見引數以及調優
- 調優的幾個模組:
- 程序管理,
CPU
; - 記憶體調優,
IO
調優- 檔案系統;
- 網路子系統;
- 程序管理,
- 調優思路:效能指標,定位瓶頸,;
- 系統調優是一種
black art
; rhel6
提供的效能評估的軟體:SystemTap
:用於觀察系統上面每一個系統呼叫或者應用程式和核心互動時的狀態;Oprofile
:表示用於進行系統評估的工具;Valgrind
:是一個非常強大的記憶體檢測工具,以及對於快取的使用率的一個工具;Perf
:也是一個系統性能評估工具
- 記憶體的子系統元件:
slab allocator
:buddy system
:kswapd
:pdflush
:mmu
:
- 記憶體子系統的虛擬化
- 將程序地址成為
PA
,虛擬主機的地址成為HA
,實體地址稱為MA
,虛擬機器對於地址的轉換通常需要從PA-->HA-->MA
,效率低下,大多數虛擬機器都是需要這樣進行轉換的,支援硬體虛擬化的CPU
,可以通過PA
直接轉換到MA
; - 現在的支援硬體虛擬化的
CPU
都支援shadow Page
,通過提供虛擬的MMU
,Guest OS
在需要轉換時,通過硬體MMU
晶片,OS
自動的同步完成HA-->MA
的轉換,通過這種機制可以一步完成從PA-->MA
的轉換;
TLB
:TLB(Translation Lookaside Buffer)
轉換檢測緩衝區是一個記憶體管理單元,用於改進虛擬地址到實體地址轉換速度的快取,TLB
是一個小的,虛擬定址的快取,其中每一行都儲存著一個由單個PTE(Page Table Entry
,頁表項)組成的塊。如果沒有TLB
,則每次取資料都需要兩次訪問記憶體,即查頁表獲得實體地址和取資料。
- 提高
TLB
效能 Hugetblfs
:大表頁檔案系統,可以使用多種不同大小的頁面,對應的檔案系統是HugeFS
,
- 上面的引數表示的含義是大頁面的大小為
2M
,但是總數為0
,表示沒有啟用; - 啟用大頁面的方法:
- 1.通過更改配置檔案
[email protected]:~# vim /etc/sysctl.conf vm.nr_hugepages=n; 上面的方式等價於: sysctl -w vm.nr_hugepages=10
- 2.或者通過向核心傳遞引數的方式進行
hugepages=n
-
更改之後進行檢視
-
這些大頁面可以被某些應用程式使用;通常來說某些應用程式是可以自動使用大頁面的,例如
sshm mysqld
,如果需要手動的指定某些應用程式使用大頁面,可以通過掛載的方式實現;
[email protected]:~# mkdir /hugepages
[email protected]:~# mount -t hugetlbfs none /hugepages/
[email protected]:~# ls /hugepages/
-
這個地址空間是不允許使用者直接使用的;
-
對於
Mysql
的InnoDB
儲存引擎存在一個引數InnoDB_Buffer
,這個空間主要是用來快取InnoDB
的索引檔案,需要的空間特別大,這個建議使用大頁面,可以有效的提高效能; -
檢視系統呼叫
-
starce
用來檢視一個程序到底是如何執行的,並且執行了那些系統呼叫
-
追蹤某個命令執行的系統呼叫,輸出的主要是摘要資訊;
-
通過
-i
選項檢視系統呼叫資訊
[email protected]:~# strace -i cat /etc/fstab
[00007f4b1b1d3607] execve("/bin/cat", ["cat", "/etc/fstab"], [/* 19 vars */]) = 0
[00007fa5502f1879] brk(NULL) = 0x55e661629000
[00007fa5502f25a7] access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
[00007fa5502f269a] mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5504f9000
[00007fa5502f25a7] access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
[00007fa5502f2547] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[00007fa5502f24d2] fstat(3, {st_mode=S_IFREG|0644, st_size=121277, ...}) = 0
[00007fa5502f269a] mmap(NULL, 121277, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa5504db000
[00007fa5502f2647] close(3) = 0
[00007fa5502f25a7] access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
[00007fa5502f2547] open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[00007fa5502f2567] read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\3\2\0\0\0\0\0"..., 832) = 832
[00007fa5502f24d2] fstat(3, {st_mode=S_IFREG|0755, st_size=1689360, ...}) = 0
[00007fa5502f269a] mmap(NULL, 3795360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa54ff3a000
[00007fa5502f2737] mprotect(0x7fa5500cf000, 2097152, PROT_NONE) = 0
[00007fa5502f269a] mmap(0x7fa5502cf000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x195000) = 0x7fa5502cf000
[00007fa5502f269a] mmap(0x7fa5502d5000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fa5502d5000
[00007fa5502f2647] close(3) = 0
[00007fa5502f269a] mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5504d9000
[00007fa5502d9bb8] arch_prctl(ARCH_SET_FS, 0x7fa5504d9700) = 0
[00007fa5502f2737] mprotect(0x7fa5502cf000, 16384, PROT_READ) = 0
[00007fa5502f2737] mprotect(0x55e65fc41000, 4096, PROT_READ) = 0
[00007fa5502f2737] mprotect(0x7fa5504fc000, 4096, PROT_READ) = 0
[00007fa5502f2717] munmap(0x7fa5504db000, 121277) = 0
[00007fa55001ac69] brk(NULL) = 0x55e661629000
[00007fa55001ac69] brk(0x55e66164a000) = 0x55e66164a000
[00007fa54ff64e9f] open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
[00007fa550015062] fstat(3, {st_mode=S_IFREG|0644, st_size=3468304, ...}) = 0
[00007fa55001e3ca] mmap(NULL, 3468304, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa54fbeb000
[00007fa54ff64f51] close(3) = 0
[00007fa550015062] fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 0), ...}) = 0
[00007fa550015470] open("/etc/fstab", O_RDONLY) = 3
[00007fa550015062] fstat(3, {st_mode=S_IFREG|0644, st_size=196, ...}) = 0
[00007fa55001976d] fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
[00007fa55001e3ca] mmap(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa5504b7000
[00007fa550015690] read(3, "# /dev/sdd1\nUUID=4cc08fc5-b4e5-4"..., 131072) = 196
[00007fa5500156f0] write(1, "# /dev/sdd1\nUUID=4cc08fc5-b4e5-4"..., 196# /dev/sdd1
UUID=4cc08fc5-b4e5-40f3-8545-9746f8ba0b0e / ext4 rw,relatime,data=ordered 0 1
/swapfile none swap defaults 0 0
cpuset /cpusets cpuset defaults 0 0
) = 196
[00007fa550015690] read(3, "", 131072) = 0
[00007fa55001e467] munmap(0x7fa5504b7000, 139264) = 0
[00007fa550015cb0] close(3) = 0
[00007fa54ffaba1b] close(1) = 0
[00007fa54ffaba1b] close(2) = 0
[00007fa54fff25d8] exit_group(0) = ?
[????????????????] +++ exited with 0 +++
strace COMMAND
:檢視命令的系統呼叫;strace -p PID
:檢視已經啟動的程序的syscall
;-c
:只輸出概括資訊;-o FILE
:將追蹤結果儲存至檔案中,用來參考;- 使用這個命令是用於追蹤
LNMP
或者其他服務將大量的時間用在哪些方面;通常還可以用於鎖競爭,用於定位IO
故障; - 記憶體的使用策略
- 1.儘量降低小記憶體物件的開銷,可以使用
slab cache
slab cache
通常是事先在記憶體中劃分出來的片段,通常這些是鏈式結構,並且每個kmem_cache
分為三個段slab_full slab_partial slabs_empty
;- 檢視
slab
的資訊
[email protected]:~# cat /proc/slabinfo
slabinfo - version: 2.1
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
xfs_dqtrx 0 0 528 7 1 : tunables 54 27 8 : slabdata 0 0 0
xfs_rui_item 0 0 672 6 1 : tunables 54 27 8 : slabdata 0 0 0
xfs_rud_item 0 0 152 26 1 : tunables 120 60 8 : slabdata 0 0 0
xfs_ili 0 0 168 24 1 : tunables 120 60 8 : slabdata 0 0 0
xfs_inode 15 20 960 4 1 : tunables 54 27 8 : slabdata 5 5 0
xfs_buf_item 0 0 248 16 1 : tunables 120 60 8 : slabdata 0 0 0
xfs_da_state 0 0 480 8 1 : tunables 54 27 8 : slabdata 0 0 0
bio-4 32 36 320 12 1 : tunables 54 27 8 : slabdata 3 3 0
kvm_async_pf 0 0 136 30 1 : tunables 120 60 8 : slabdata 0 0 0
kvm_vcpu 0 0 19264 1 8 : tunables 8 4 0 : slabdata 0 0 0
kvm_mmu_page_header 0 0 168 24 1 : tunables 120 60 8 : slabdata 0 0 0
pte_list_desc 0 0 32 124 1 : tunables 120 60 8 : slabdata 0 0 0
fuse_request 0 0 400 10 1 : tunables 54 27 8 : slabdata 0 0 0
fuse_inode 1 9 832 9 2 : tunables 54 27 8 : slabdata 1 1 0
ext4_groupinfo_4k 459 476 144 28 1 : tunables 120 60 8 : slabdata 17 17 0
ext4_inode_cache 23316 23358 1080 3 1 : tunables 24 12 8 : slabdata 7786 7786 0
ext4_allocation_context 8 32 128 32 1 : tunables 120 60 8 : slabdata 1 1 0
ext4_extent_status 4503 9999 40 99 1 : tunables 120 60 8 : slabdata 101 101 0
- 對於上面顯示的內容是存在
tunables
,表示這個slab
是可以進行調整的 - 對於記憶體物件來說都是不一樣的,所以分配的
slab
的大小也不應該是一樣的,所以每一種物件可能需要準備多個slab
空間; - 所以使用
slab
應該是提前申請,對於某個物件被刪除slab
並不會被刪除,而是會被清空,留給以後使用; - 2.降低或者延遲慢速子系統的時間:
- 檔案系統元資料
filesystem medata:
通過提供buffer
或者cache
,將檔案元資料直接快取在buffer
;; DIsk IO
:通過提供page cache
;Interprocess communication
通過提供shared memory
;Network IO
:通過提供buffer, cache, arp cache,connection tracking
;slab_cache
的引數:- 檢視
slabtop
- 通常來說
dentry
,和ext4_innodb
的使用量是比較大的,這個使用百分比在deepin
上面顯示的好像不正常,手動來算兩個
- 這個值建議對於某些服務根據上面的情況來調整變大
; - 通過
echo
命令來調整上面的引數:
[email protected]:~# echo "cache_name limit batchcount shared" > /proc/slabinfo
limit
:表示可以被每個CPU
快取的最大object
數目batchcount
:全域性快取物件中最多允許多少個在某個CPU
快取為空時,進行傳送的個數;shared
:在對稱多處理器架構中,允許多少個快取物件;
[email protected]:~# echo 'ext4_inode_cache 54 27 8' > /proc/slabinfo
-
再次檢視這個值就已經改變
-
關於
vm_min_free_kbytes
:- 這個引數是用於定義最少需要空閒出來多少記憶體,用於確保記憶體不會被使用完,而導致系統崩潰;這個引數在硬碟裝置比較差,並且
CPU
效能也比較差時,需要考慮使用,通常是調小這個引數; - 這個引數可以用於減少請求分頁的響應時間;
- 這段
memory
對於其他的應用程式不可用
- 這個引數是用於定義最少需要空閒出來多少記憶體,用於確保記憶體不會被使用完,而導致系統崩潰;這個引數在硬碟裝置比較差,並且
-
vm.overcommit_memory
: -
用於防止記憶體的過量使用,可以在
swap
的程度上面允許記憶體的一部分過量使用; -
0
:表示heuristic overcommit
:表示啟發式過量,用於自動決定記憶體過量使用的時機,以及大小; -
1
:表示always overcommit
,表示一直允許過量使用,在資料庫伺服器上面,儘可能的不要使用swap
,也就是不要使用這個選項,但是在hadoop
對於記憶體的量要求大,但是速度要求不強; -
2
:表示使用一部分的實體記憶體加上一部分的swap
記憶體,這個大於的百分比是可以自行進行定義的overcommit_ratio
百分比;並且建議不要超過50%
;這個範圍在確定的時候,不應該超過實體記憶體和swap
分割槽的大小,通常計算方法是swap+RAM*raito
; -
為了防止實體記憶體不能夠充分被使用,需要使用:
- 1.
swap
和RAM
一樣大,並且swapiness=0
; - 2.或者設定
overcommit_memory=2
,並且設定,overcommit_ratio=100
;,並且還需要設定swappiness=0
;
;
- 1.
-
核心中的
OOMK Out Of Memory Kill
殺手,當應用程式使用的記憶體佔據了核心空間的記憶體的時候,核心就會優先殺死那些佔用記憶體空間最多的程序,無論是否重要; -
當然上面這個殺死進行的方式是可以進行定義的,核心維護了對於所有程序的一個評分,用於確定那個程序優先被殺死;
-
1
這個程序肯定是不能夠優先被殺死的
-
換一個程序來檢視
-
好像預設的都是一樣的
-
調整網路IO
-
預設情況下,
arp
的解析結果快取在/proc/net/arp
檔案中 ,預設情況下這個檔案裡面可以快取512
個條目,硬限制是1024
個條目;一旦超出軟限制,核心子系統Garbage collection
會自動移除一些過期的條目
-
可以通過命令
ip neighbor list
顯示已經快取的條目
-
如果需要清空某個裝置上面的快取條目
[email protected]:~# ip neigh flush dev enp0s25
-
net.ipv4.neigh.default.gc_thresh1=128
:當裡面的快取條目少於128
時,garbage collection
不會進行任何操作; -
net.ipv4.neigh.default.gc_thresh2=512
:表示軟限制,可以允許超過,當選項net.ipv4.neigh.default.gc_interval
啟用時,清除超過硬限制清理時間的條目,超過軟限制的做多不允許超過5
秒鐘; -
net.ipv4.neigh.default.gc_thresh1=1024
:表示硬限制,這個值是不允許超過的; -
net.ipv4.neigh.default.gc_interval
,表示每隔多長時間來檢查一次,並且進行清理; -
PAGE CACHE
-
頁快取的主要目的使用來降低磁碟快取的,也就是儘量將檔案放在記憶體中進行讀,主要是用來加速讀操作的;
-
page cache
降低IO
請求:Directory Read
:目錄讀取;Reading and Write regular file
: 讀寫[表示對於檔案內容的修改]普通檔案;- 可以加快讀和寫塊裝置;
- 通常還是可以使用記憶體對映的
mmap
;
-
vm.lowmem_reserve_ratio
-
表示記憶體中為
page Cache
預留多大的空間; -
vfs_cache_pressure
-
用於控制核心控制記憶體裝置中那些被用於快取目錄以及
inode
物件的的趨勢,一般來說為了加快訪問,這些內容是不應該回收的; -
100
表示在dentries innodes
和pagecache swapcache
更加公平的在兩者之家選擇回收策略,如果減少這個值,表示更加傾向於保留dentry
和innode cache
; -
0
:表示不會依賴於記憶體的使用情況來回收dentry
以及innode
,這樣容易導致記憶體溢位; -
1-->99
:傾向於不回收dentry
以及innode
; -
>100
:表示更加傾向於回收dentry
以及innode
;
-
page-cluster
-
表示頁面組,專業說法是頁簇;表示在將資料需要存放在交換頁面上面的時候,每一次拿出多少個頁面放在交換記憶體上面去;如果這個值為
n
,那麼表示的含義是每次交換出2^n
個,一般來收只有在系統頻繁使用交換分割槽的時候,需要調大這個值,並且不應該大於4
-
這個引數需要在虛擬化時,需要調大這個值;
-
zone_reclaim_mode
-
表示在記憶體回收的模型,表示在進行記憶體回收時,更加傾向於回收哪一段的記憶體;
-
1
:表示開啟記憶體回收的功能,具體的回收策略交給核心進行限定; -
2
:表示回收寫操作產生的髒頁; -
4
:表示回收swap
頁面;
-
anonymous page
-
表示匿名頁,這裡面通常包含:
-
1.程式自身產生的資料,陣列和堆裡面的資料;
-
2.通常匿名記憶體區域也稱為匿名頁;
-
3.程式私有記憶體頁面對映的髒頁面;
-
4.程序間通訊的共享記憶體頁面;
-
Anonymous page
的計算方法:anonymous pages = RSS[實際記憶體集合] - Shared[共享記憶體集合]
; -
通常來說匿名頁面是不能夠被交換出去的;
-
對於程序間通訊的調優
-
檢視當前的
IPC
的限定
-
min seg size
:表示每一個段最小使用的位元組數; -
通常來說使用較多的通訊機制是
shared memory
以及Messages
; -
ipcrm
:如果某個程序使用程序間通訊陷入睡眠,無法被喚醒,使用這個命令可以移除一個訊息佇列; -
shared memory
的調優: -
kernel.shmmni
:表示在全系統內部允許使用多少個共享記憶體段;,資料庫伺服器上面經常需要調整這個引數,這個值通常需要被調大;
-
kernel.shmall
:表示的是全系統範圍內,一次可以最大為共享記憶體使用的最大頁面數;
-
this should be at least kernel.mmax/PAGE_SIZE
; -
kernel.shamax
:共享記憶體段可以被建立的最大大小
-
關於
msgmnb
: -
kernel.msgmnb
:表示單個訊息佇列的最大位元組數;
-
kernel.msgmni
:系統級別,表示訊息佇列個數的的上限;
-
kernel.msgmax
: 表示訊息佇列中,單個訊息的上限,單位是位元組; -
一般來說這些值是需要調大的,對於上面的記憶體空間是不能夠被交換出去的;
-
記憶體空間的清寫
-
記憶體空間的清寫是交給
pdflush
這個執行緒來完成的,這個執行緒是按照需求進行啟動的,當出現需要進行磁碟刷寫的時候,這個執行緒是會自動啟動的,這個執行緒一般最少是兩個;
-
一般來說核心會自動優化,一塊磁碟裝置是一個執行緒;這塊進行修改,出現了許可權不夠的錯誤,所以不建議手動進行修改;
-
建議進行修改的是
pdflush
的工作屬性 -
vm.dirty_background_ratio
髒頁佔據記憶體的比例達到多少,需要啟動pdflush
執行緒;這個值是個百分比;
-
vm.dirty_ratio
:表示的是單個程序的髒頁佔據記憶體達到的百分比,應該啟動pdflush
執行緒進行刷寫;
-
vm.dirty_bytes
:表示使用的髒頁的位元組數來進行控制;
-
0
表示沒有進行定義,使用vm.dirty_ratio
來進行控制 -
vm.dirty.expire.centisecs
:單位是百分之一秒,表示如果上面的時間沒有得到滿足,那麼每隔多長時間進行一次清寫操作,底下這個表示的是30
秒,其中0
表示禁止;
-
vm.dirty.Writeback.centisecs
:表示用於定義系統中某些髒頁存在的最長時間,一旦到達這個時間,就會啟動執行緒刷寫髒頁; -
FLUSHall dirty buffers and pages
-
這個通常來說是通過呼叫
sync command
來執行的,syn
主要實現的是將dirty page
同步到磁碟上面; -
echo s > /proc/sysrq-trigger
-
Reclaim clean pages
-
echo 3 > /proc/sys/vm/drop_cache
:1
:表示free pagecache
;2
表示free dentries and inodes
;3
表示free pagecache dentries and inodes
;
-
Out Of memory Kill
-
通常在 所有的
memory
以及swap
都被使用的時候; -
在
ZONE_NORMAL
裡面沒有可以使用的page
; -
沒有足夠的記憶體用於頁表
mapping
; -
通常來說殺死程序是按照
oom_score
這個分數為標準的,數值越高,越優先被殺死; -
當這個值為
0
時,表示記憶體耗盡時,就可以啟動OOMK
-
這個
oom_score
是系統自動計算得到的,並且需要主動的參照於oom_adj
,通常範圍是-17-->15
,可用的表示範圍是-16--->15
,如果設定為-17
,表示無論任何情況,這個程序都是不會被kill
掉的;可以用於保護某些程序; -
通常來說
oom_score=2^oom_adj
的值; -
通常來說子程序是繼承父程序的
oom_score
的值的,如果需要關閉這個選項,
sysctl -w vm.panic_on_oom=1
- 評估記憶體子系統
valgrind
:通常是一個包含各個子元件的,記憶體狀態監測工具,建議安裝上這個軟體包
- 記憶體洩漏就是,記憶體再被分配出去,無法進行回收,也無法重新分配進行使用
- SWAP頁面
swap-out
表示從記憶體上面寫入,交換分割槽中;swap-in
:表示從交換分割槽中寫入記憶體中;- 滿足
swap
的要求:- 1.首先是
inactive pages
; - 2.其次是
anonymous pages
;
- 1.首先是
swap cache
:從swap
載入進來的,但是沒有進行任何修改的資料, 通常使用來避免多程序同時訪問同一個記憶體頁框的情況;- 提供
swap
效能:
* 儘可能降低swap
的訪問次數;
* 可以通過多個磁碟裝置提供多個swap
分割槽,可以提供負載均衡的效果;
* 降低服務時間;
* 使用SSD
盤;
* 可以講swap
分區劃分在最外道的分割槽,用於加快交換分割槽的訪問速度; - 調整
swap
的使用:
- 通常來說使用交換記憶體是因為
% of memory mapped into page table + vm.swappiness >= 100
,時就會使用swap
分割槽,如果更加傾向於使用交換出anonymous pages
可以通過提高vm.swappiness
;在記憶體足夠使用,的情況下,應該儘可能的降低這個值; - 使用交換分割槽的情況:
batch compute server
:通常是4*RAM
;Database server
:<= 1GB
;Application server
:通常是>=0.5 * RAM
;
- 通過提供多個裝置,並且提供同樣的優先順序
[email protected]:~# mkswap -L SWAP_LABEL /path/to/some/device
vim /etc/fstab
/dev/sda1 swap swap pri=5 0 0
/dev/sdb1 swap swap pri=5 0 0
LABEL=testswap swap swap pri=5 0 0
/swap/swapfile1 swap swap pri=5 0 0
//掛載使用
swapon -a
-
如果需要檢視交換分割槽,
-
關於網路的幾個變數:
-
tcp_max_tw_buckets
:表示的含義是用於儲存所有處於TIME_WAIT
的會話的個數,這個值建議調大,而不是調小;
-
tcp_fin_timeout
:表示的含義是tcp_fin
的超時時間; -
tcp_mem
:表示的含義是tcp sockets
的tcp_wmem
傳送和接受tcp_rmem
緩衝的大小;,關於這兩個值的最大值,在檔案core/rmem_max core/wmem_max core/mem_default
; -
可能使用的命令
sar dstat vmstat mpstat iostat top free iotop uptime cat /proc/meminfo ss netstat lsof blktrace blkparse btt time perf
; -
對檔案系統進行壓力測試的工具:
dd iozone io-stress fio
;