磁盤優化思路

磁盤優化思路

 

性能定位套路
和以前相似,咱們不可能出現性能問題就把全部工具都跑一遍,而是先運行那幾個支持指標較多的工具,如 top,iostat,vmstat等來縮小範圍ios

  1. 先用top, iostat 發現磁盤 I/O 性能瓶頸;
  2. 再借助 iotop, pidstat 等定位出致使瓶頸的進程;
  3. 隨後用strace, lsof等分析進程的 I/O 行爲;
  4. 最後,結合應用程序的原理,分析這些 I/O 的來源。
    磁盤優化思路
    性能優化思路
    因爲影響磁盤I/O性能的因素衆多,咱們對磁盤I/O優化分應用程序,文件系統,磁盤三方面來講
    1.應用程序優化
    應用程序處於整個 I/O 棧的最上端,它能夠經過系統調用,來調整 I/O 模式(如順序仍是隨機、同步仍是異步), 同時,它也是 I/O 數據的最終來源。
    在我看來,能夠有這麼幾種方式來優化應用程序的 I/O 性能:
    1).能夠用追加寫代替隨機寫,減小尋址開銷,加快 I/O 寫的速度。
    2).能夠藉助緩存 I/O ,充分利用系統緩存,下降實際 I/O 的次數。
    3).能夠在應用程序內部構建本身的緩存,或者用 Redis 這類外部緩存系統。這樣,一方面,能在應用程序內部,控制緩存的數據和生命週期;另外一方面,也能下降其餘應用程序使用緩存對自身的影響。
    4).在須要頻繁讀寫同一塊磁盤空間時,能夠用 mmap 代替 read/write,減小內存的拷貝次數。
    5).在須要同步寫的場景中,儘可能將寫請求合併,而不是讓每一個請求都同步寫入磁盤,便可以用 fsync() 取代 O_SYNC。
    6).在多個應用程序共享相同磁盤時,爲了保證 I/O 不被某個應用徹底佔用,推薦你使用 cgroups 的 I/O 子系統,來限制進程 / 進程組的 IOPS 以及吞吐量。
    7).在使用 CFQ 調度器時,能夠用 ionice 來調整進程的 I/O 調度優先級,特別是提升核心應用的 I/O 優先級。ionice 支持三個優先級類:Idle、Best-effort 和 Realtime。其中, Best-effort 和 Realtime 還分別支持 0-7 的級別,數值越小,則表示優先級別越高。

2.文件系統優化
應用程序訪問普通文件時,實際是由文件系統間接負責,文件在磁盤中的讀寫。因此,跟文件系統中相關的也有不少優化 I/O 性能的方式:
1).你能夠根據實際負載場景的不一樣,選擇最適合的文件系統。好比xfs比ext4支持更大的磁盤分區和更大的文件數量,xfs 支持大於 16TB 的磁盤。可是 xfs 文件系統的缺點在於沒法收縮,而 ext4 則能夠。
2).在選好文件系統後,還能夠進一步優化文件系統的配置選項,包括文件系統的特性(如 ext_attr、dir_index)、日誌模式(如 journal、ordered、writeback)、掛載選項(如 noatime)等等。
3).能夠優化文件系統的緩存。如能夠優化 pdflush 髒頁的刷新頻率(好比設置 dirty_expire_centisecs 和 dirty_writeback_centisecs)以及髒頁的限額(好比調整 dirty_background_ratio 和 dirty_ratio 等)。
4).還能夠優化內核回收目錄項緩存和索引節點緩存的傾向,即調整 vfs_cache_pressure(/proc/sys/vm/vfs_cache_pressure,默認值 100),數值越大,就表示越容易回收。
5).在不須要持久化時,你還能夠用內存文件系統 tmpfs,以得到更好的 I/O 性能 。tmpfs 把數據直接保存在內存中,而不是磁盤中。好比 /dev/shm/ ,就是大多數 Linux 默認配置的一個內存文件系統,它的大小默認爲總內存的一半。算法

3.磁盤優化
數據的持久化存儲,最終仍是要落到具體的物理磁盤中,同時,磁盤也是整個 I/O 棧的最底層。從磁盤角度出發,天然也有不少有效的性能優化方法。
1).最簡單有效的優化方法,就是換用性能更好的磁盤,好比用 SSD 替代 HDD。
2).使用 RAID ,把多塊磁盤組合成一個邏輯磁盤,構成冗餘獨立磁盤陣列。這樣作既能夠提升數據的可靠性,又能夠提高數據的訪問性能。
3).針對磁盤和應用程序 I/O 模式的特徵,咱們能夠選擇最適合的 I/O 調度算法。比方說,SSD 和虛擬機中的磁盤,一般用的是 noop 調度算法。而數據庫應用,則更推薦使用 deadline 算法。
4).咱們能夠對應用程序的數據,進行磁盤級別的隔離。好比,咱們能夠爲日誌、數據庫等 I/O 壓力比較重的應用,配置單獨的磁盤。
5).在順序讀比較多的場景中,咱們能夠增大磁盤的預讀數據,如能夠經過調整內核選項 /sys/block/sdb/queue/read_ahead_kb來調整 /dev/sdb 的預讀大小。
6).能夠優化內核塊設備 I/O 的選項。好比,能夠調整磁盤隊列的長度 /sys/block/sdb/queue/nr_requests,適當增大隊列長度,能夠提高磁盤的吞吐量(固然也會致使 I/O 延遲增大)。
7).要注意,磁盤自己出現硬件錯誤,也會致使 I/O 性能急劇降低,因此發現磁盤性能急劇降低時,你還須要確認,磁盤自己是否是出現了硬件錯誤。好比,你能夠查看 dmesg 中是否有硬件 I/O 故障的日誌。 還可使用 badblocks、smartctl 等工具,檢測磁盤的硬件問題,或用 e2fsck 等來檢測文件系統的錯誤。若是發現問題,你可使用 fsck 等工具來修復。數據庫

相關文章
相關標籤/搜索