好久沒有更新了,加一篇。。。。
1.驅動方面
1.1內容點
位寬(決定了單次時序傳輸的最大位寬):
SPL階段:4bit width(可以改爲8bit width)
Uboot階段:8bit width
Kernel階段:8bit width
時鐘(決定了時序的快慢):
SPL階段:13M
Uboot階段:52M
Kernel階段:52M
總結:
通過調整爲最大時鐘和最大位寬可以將emmc的性能發揮到最大
另外修改emmc的block大小也可以提高訪問的速度,但是block設置太大容易造成浪費,默認都是512Byte,這樣可以減少系統文件的碎片化
1.2修改的地方
時鐘:kernel/include/linux/mmc/card.h
位寬:kernel/include/linux/mmc/mmc.h
2.掛載參數方面
2.1mount參數(加粗的爲推薦掛載參數)
loglevel的級別,測試IO性能時,將log級別設爲1
nodelalloc和delalloc
delalloc, 這是默認值, 就是說把所有的block分配推後到真正要寫數據的時候,當有sync調用的時候纔會分配block.這樣會造成寫等待,因此爲了提高性能掛載時需關閉delalloc.
discard 和nodiscard
discard向下級塊設備通知塊已釋放,nodiscard不向下級塊設備通知塊已釋放,通知的過程會降低IO性能
noauto_da_alloc和auto_da_alloc
noauto_da_alloc不使用延遲分配功能,而是在當時立刻確保塊,和2中類似
2.2修改方法
文件系統的掛載是在解析init.rc的時候進行的掛載./scx35/init.sc8830.rc
mount_all/fstab.sc8830
修改路徑:device/sprd/scx35x/emmc/fstabxxx.sc8830
3.block層的一些參數
3.1內容點
max_sectors_kb:
參數意義:決定了IO單次的最大數據請求量
可以通過修改MMC_QUEUE_BOUNCESZ的值進而修改max_sectors_kb
dirty_background_bytes
當髒頁所佔的內存數量超過dirty_background_bytes時,內核的pdflush線程開始回寫髒頁。
dirty_background_ratio(非阻塞)
參數意義:當髒頁所佔的百分比(MemFree + Cached - Mapped)達到dirty_background_ratio時內核的pdflush線程開始回寫髒頁。增大會使用更多內存用於緩衝,可以提高系統的讀寫性能。當需要持續、恆定的寫入場合時,應該降低該數值。
dirty_bytes(阻塞)
當髒頁所佔的內存數量達到dirty_bytes時,執行磁盤寫操作的進程自己開始回寫髒數據。
dirty_ratio
參數意義:當髒頁所佔的百分比(所有內存)達到dirty_ratio時,進程pdflush會自己開始回寫髒數據。增大會使用更多系統內存用於緩衝,可以提高系統的讀寫性能。當需要持續、恆定的寫入場合時,應該降低該數值。
dirty_expire_centisecs
參數意義:用來指定內存中數據是多長時間纔算髒(dirty)數據。指定的值是按100算做一秒計算。只有當超過這個值後,纔會觸發內核進程pdflush將dirty數據寫到磁盤。
dirty_writeback_centisecs
這個參數會觸發pdflush回寫進程定期喚醒並將old數據寫到磁盤。每次的喚醒的間隔,是以數字100算做1秒。如果將這項值設爲500就相當5秒喚醒pdflush進程。如果將這項值設爲0就表示完全禁止定期回寫數據。
3.2修改方法
路徑:kernel/Documentation/laptops/laptop-mode.txt
393# kernel default dirty buffer age
394DEF_AGE=${DEF_AGE:-'30'} // dirty_expire_centisecs
395DEF_UPDATE=${DEF_UPDATE:-'5'}// dirty_writeback_centisecs
396DEF_DIRTY_BACKGROUND_RATIO=${DEF_DIRTY_BACKGROUND_RATIO:-'10'}////dirty_background_ratio
397DEF_DIRTY_RATIO=${DEF_DIRTY_RATIO:-'40'}//dirty_ratio
路徑:system/core/rootdir/init.rc
write/proc/sys/vm/dirty_background_bytes 4194304 // dirty_background_bytes