主要是Bugly团队分析的见: TRIM对卡顿的影响

    整体总结下

    • CPU执行效率 影响 系统和应用的流畅性

    • Android的存储架构 NAND flash,分为 Page、Block、Plane、Die

    • NAND Flash 的读写规则: — 导致“写入放大” 问题

      • 删除数据时,芯片将标记这些 Page 为闲置状态,但并不会立马执行擦除操作。

      • 写入数据时,如果目前磁盘剩余空间充足,则由芯片指定 Block 后直接按 Page 为单位进行写入即可。

      • 写入数据时,如果目前磁盘剩余空间不足,为了获得足够的空间,磁盘先将某块 Block 的内容读至缓存,然后再在该 Block 上进行擦除操作,最后将新内容与原先内容一起写入至该 Block。

    • TRIM引入解决“写入放大”问题:单个文件写入操作分四步 闪存读取->缓存更改->删除擦除->闪存写入

    • 基于 TRIM 技术,目前常见有两种方案可以解决“写入放大”的问题:

      • discard 选项。该方案将在挂载 ext4 分区时加上 discard 选项,此后操作系统在执行每一个磁盘操作时同时都会执行 TRIM 指令。该方案的优点是总体耗时短,但影响会到删除文件时的性能。

      • fstrim 命令。该方案将选择合适的时机对整个分区执行 TRIM 操作。相对于方案一,该方案总体耗时较长,但不会影响正常操作时的磁盘性能。

    • Android中的TRIM实现:Android 通过系统服务 IdleMaintenanceService 来进行系统状态监控并决定何时触发 TRIM

    TRIM:提升磁盘性能,缓解Android卡顿 - 图1

    • 闪存碎片和TRIM对IO的影响
    1. 在 TRIM 无效的情况下,长期使用 SD 卡,磁盘写入速度会受到明显影响;

    2. TRIM 对因闲置数据块造成的 I/O 性能下降有一定的恢复作用;

    3. 大量的读写操作对 SD 卡造成了一定量的不可恢复的损耗。

    • 思考和总结

    根据前面的分析,我们可以从 Android 源码及测试数据对前面两个问题做出回答:

    1. 磁盘碎片(更准确的说法是 SD 卡中的闲置数据块)会严重影响磁盘的读写性能,可能会导致 Android 系统越用越卡,而 Android 系统的 FSTRIM 对此有恢复的作用;

    2. 经过实验分析, FSTRIM 并不一定能够按期(每天一次)执行。而导致这一问题的原因可能是 IdleMaintenanceService 对电量的要求过高(未充电状态下大于80%)。

    当然,我们可以通过一下手段对这一问题做出优化尝试:

    1. FSTRIM 对电量的要求略高,如需提高其触发频率可以从降低触发条件中对电量的要求;

    2. 在必要的情况下,可以发送特定的 Intent 事件,使系统强制触发 FSTRIM。