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