Linux文件系統性能優化


本文絕大部分是轉載自CSDN劉愛貴專欄: http://blog.csdn.net/liuben/archive/2010/04/13/5482167.aspx另外根據參考文檔增補了一部分內容。

由於各種的I/O負載情形各異,Linux系統中文件系統的缺省配置一般來說都比較中庸,強調普遍適用性。然而在特定應用下,這種配置往往在I/O 性能方面不能達到最優。因此,如果應用對I/O性能要求較高,除了采用性能更高的硬件(如磁盤、HBA卡、CPU、MEM等)外,我們還可以通過對文件系統進行性能調優,來獲得更高的I/O性能提升。總的來說,主要可以從三個方面來做工作:

1、Disk相關參數調優
2、文件系統本身參數調優
3、文件系統掛載(mount)參數調優

當然,負載情況不同,需要結合理論分析與充分的測試和實驗來得到合理的參數。下面以SAS(Serial attached SCSI)磁盤上的EXT3文件系統為例,給出Linux文件系統性能優化的一般方法。請根據自身情況作適合調整,不要生搬硬套。
1、Disk相關參數
1.1 Cache mode:啟用WCE=1(Write Cache Enable), RCD=0(Read Cache Disable)模式

sdparm -s WCE=1, RCD=0 -S /dev/sdb

1.2 Linux I/O scheduler算法
經過實驗,在重負載情形下,deadline調度方式對squidI/O負載具有更好的性能表現。其他三種為noop(fifo), as, cfq,noop多用於SAN/RAID存儲系統,as多用於大文件順序讀寫,
cfq適於桌面應用。

echo deadline > /sys/block/sdb/queue/scheduler

1.3 deadline調度參數
對於redhat linux建議 read_expire = 1/2 write_expire,對於大量頻繁的小文件I/O負載,應當這兩者取較小值。更合適的值,需要通過實驗測試得到。
echo 500 > /sys/block/sdb/queue/iosched/read_expire
echo 1000 > /sys/block/sdb/queue/iosched/write_expire

1.4 readahead 預讀扇區數
預讀是提高磁盤性能的有效手段,目前對順序讀比較有效,主要利用數據的局部性特點。比如在我的系統上,通過實驗設置通讀256塊扇區性能較優。
blockdev --setra 256 /dev/sdb

但這個參數對於隨機讀則沒有作用,在SSD硬盤甚至有害,因此在SSD上需要關閉預讀。

1.5 磁盤隊列長度
/sys/block/sda/queue/nr_requests 默認只有 128 個隊列,可以提高到 512 個。
會更加占用內存,但能更加多的合並讀寫操作,速度變慢,但能讀寫更加多的量

2、EXT3文件系統參數
2.1 block size = 4096 (4KB)
mkfs.ext3 -b指定,大的數據塊會浪費一定空間,但會提升I/O性能。EXT3文件系統塊大小可以為1KB、2KB、4KB。

2.2 inode size
這是一個邏輯概念,即一個inode所對應的文件相應占用多大物理空間。mkfs.ext3 -i指定,可用文件系統文件大小平均值來設定,可減少磁盤尋址和元數據操作時間。

2.3 reserved block
mkfs.ext3 -m指定,缺省為5%,可調小該值以增大部分可用存儲空間。

2.4 disable journal
對數據安全要求不高的應用(如web cache),可以關閉日志功能,以提高I/O性能。
tune2fs -O^has_journal /dev/sdb

3、mount參數
3.1 noatime, nodirtime
訪問文件目錄,不修改訪問文件元信息,對於頻繁的小文件負載,可以有效提高性能。

3.2 async
異步I/O方式,提高寫性能。

3.3 data=writeback (if journal)
日志模式下,啟用寫回機制,可提高寫性能。數據寫入順序不再保護,可能會造成文件系統數據不一致性,重要數據應用慎用。

3.4 barrier=0 (if journal)
barrier=1,可以保證文件系統在日志數據寫入磁盤之后才寫commit記錄,但影響性能。重要數據應用慎用,有可能造成數據損壞。

4、小結
以/dev/sdb為例,優化操作方法如下,參數請自行調整。

sdparm -s WCE=1, RCD=0 -S /dev/sdb
echo deadline > /sys/block/sdb/queue/scheduler
echo 500 > /sys/block/sdb/queue/iosched/read_expire
echo 1000 > /sys/block/sdb/queue/iosched/write_expire
echo 512 > /sys/block/sda/queue/nr_requests
blockdev --setra 256 /dev/sdb
mkfs.ext3 -b 4096 -i 16384 -m 2 /dev/sdb1
tune2fs -O^has_journal /dev/sdb1
mount /dev/sdb1 /cache1 -o defaults,noatime,nodirtime,async,data=writeback,barrier=0 (if with journal)
mount /dev/sdb1 /cache1 -o defaults,noatime,nodirtime,async (if without journal)

參考文檔:
http://kezeodsnx.pixnet.net/blog/post/25428632-performance-tuning
http://www.addalab.it/oracle-and-linux-io-schedulers-part-1
http://www.addalab.it/oracle-and-linux-io-schedulers-part-2
http://www.monperrus.net/martin/scheduler+queue+size+and+resilience+to+heavy+IO
http://hi.baidu.com/roxws/item/76c6819adac1ef8d581461eb


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM