SSD/emmc 存储设备discard命令的使用意义及使用方法,请参考xfs官网上的这篇文章,描述详细。
http://xfs.org/index.php/FITRIM/discard
FITRIM/discard我的理解是:discard命令,只是将page标识为dirty状态,并未做真正的block erase操作。
而当一个block大部份page都标识为dirty时,为重新利用该block,就得将数据有效page(none dirty page)迁移到别的block,同时整个block擦除掉。
这个过程我们称之为:垃圾页回收。============》FITRIM就是做此工作的。
为什么它能提升emmc write performance 呢?
因为nand读、写规则是: 以page为读、写单元,而以block作为擦除单元。 写一个已经写过的page之前,必须将该页所在的block先擦除。
那么如果能在系统空闲时将一些垃圾页提前回收,并将block预先擦除作为写的准备。当然可以提升write performance,同时也可以提高page利用率。
下面我重点介绍disdcard在android系统中的实时使用和批量使用方式:
Realtime discard
init.rc 可以看到mount时,就带了disdcard flag ,这样kernel emmc /block 就会做很多不同的处理。
注:kernel需3.0以后版本。
mount ext4 /emmc@usrdata /data noatime nosuid nodev wait noauto_da_alloc,discard
Batch Mode
android4.4 在系统满足如下条件的情况,通过FSTRIM ioctl的方式对device进行垃圾回收的处理,条件如下:
1)设备已经闲置了至少一小时;
2)在过去24小时内没有进行清理回收工作;
3)电池电量大于 30%(充电中)或者80%(未进行充电)。
具体代码分析如下;
IdleMaintenanceService.java
private void updateIdleMaintenanceState(boolean noisy) {
if (mIdleMaintenanceStarted) {
// Idle ma