極客時間-linux性能優化 31.套路篇:磁盤 I O 性能優化的幾個思路

31.套路篇:磁盤 I O 性能優化的幾個思路

一、磁盤和文件系統的基準測試

首先,對磁盤和文件系統進行基準測試

然後,根據公司對磁盤和文件系統的應用場景,評估出性能優化的指標是多少?

推薦fio測試工具

隨機讀,順序讀,隨機寫,順序寫

direct:是否跳過系統緩存

iodepth:表示使用異步io時,同時發出的io請求上限

rw:io模式,順序讀寫還是隨機讀寫

ioengine:io引擎

bs:表示IO的大小

filename:文件路徑

結果輸出

slat,clat,lat都是指io延遲

slat:指從IO提交到實際執行IO的時長

clat:指從IO提交到IO完成的時長

lat:指從fio創建IO到IO完成的總時長

對於同步IO來說,IO提交和IO完成是同一個動作。

 

bw:吞吐量

iops:每秒IO的次數

 

二、模擬公司應用程序的IO場景

想盡可能模擬應用程序的IO場景,可使用fio的IO重放功能

你需要先用 blktrace ,記錄磁盤設備的 I/O訪問情況;然後使用 fio ,重放 blktrace 的記錄。

 

# 使用blktrace跟蹤磁盤I/O,注意指定應用程序正在操作的磁盤

$ blktrace /dev/sdb

 

# 查看blktrace記錄的結果

# ls sdb.blktrace.0 sdb.blktrace.1

 

# 將結果轉化爲二進制文件 $ blkparse sdb -d sdb.bin

 

# 使用fio重放日誌 $ fio --name=replay --filename=/dev/sdb --direct=1 --read_iolog=sdb.bin

 

三、應用程序優化

1、追加寫代替隨機寫,減少尋址開銷,加快IO寫的速度。

2、充分利用系統緩存,降低實際IO的次數

3、在應用程序內部建立自己的緩存系統,有利於控制緩存數據內容,數據大小,緩存數據的生命週期,也能降低其他應用程序使用內存對應用程序自身的影響。

4、頻繁讀寫同一塊磁盤空間時,可以用mmap代替read/write,減少內存的拷貝次數。

5、在需要同步寫的場景時,儘量將寫請求合併,而不是讓每個請求都同步寫入磁盤,即可以用fsync取代O_SYNC

6、在多個應用程序共享相同磁盤時,爲了保證IO不被某個應用完全佔用,推薦使用cgroup的IO子系統,來限制進程/進程組的IOPS以及吞吐量。

7、在使用CFQ調度器時,可以用ionice值來調整進程的IO調度優先級,特別是提高核心應用的IO優先級。

 

四、文件系統優化

1、根據實際負載場景不同,選擇合適的文件系統,ubuntu默認ext4,centos7默認是xfs系統

xfs支持更大的磁盤分區和更大的文件數量,缺點在於無法收縮。

2、優化文件系統的配置選項

3、優化文件系統的緩存

優化pdflush髒頁的刷新頻率以及髒頁的限額

優化內核回收目錄項緩存和索引節點緩存的傾向,調整vfs_cache_pressure,數值越大,表示越容易回收。

4、不需要持久化時,可以用內存文件系統tmpfs,以獲得更好的IO性能。tmpfs把數據直接存儲在內存中,而不是磁盤中。比如/dev/shm

 

五、磁盤優化

1、換機械硬盤

2、RAID磁盤陣列

3、根據磁盤和應用程序IO模式的特徵,選擇最適合的IO調度算法。SSD和虛擬機中的磁盤,通常用noop調度算法;數據庫應用,更推薦採用deadline算法。

4、爲數據庫和日誌等IO壓力比較重的應用,配置單獨的磁盤。

5、順序讀多的場景,可增大磁盤的預讀數據

調整內核選項/sys/block/sdb/queue/read_ahead_kb,默認是128KB

使用blockdev工具設置,比如blockdev --setra 8192 /dev/sdb,注意這裏的單位是0.5kb

6、優化內核塊設備IO的選項,適當增加磁盤隊列的長度,/sys/block/sdb/queue/nr_requests,適當增加隊列長度,可以提升磁盤的吞吐量(也會導致IO延遲增大)

7、注意磁盤是否出現了硬件錯誤,也會導致IO性能急劇下降。

查看 dmesg 中是否有硬件 I/O故障的日誌。 還可以使用 badblocks、smartctl等工

具,檢測磁盤的硬件問題,或用 e2fsck 等來檢測文件系統的錯誤。如果發現問題,你可以使用

fsck 等工具來修復。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章