你可以看到整个文件 I/O 操作由应用程序、文件系统和磁盘共同完成。首先应用程序将 I/O 命令发送给文件系统,然后文件系统会在合适的时机把 I/O 操作发给磁盘。
CPU 和内存相比磁盘是高速设备,整个流程的瓶颈在于磁盘 I/O 的性能。所以很多时候,文件系统性能比磁盘性能更加重要,为了降低磁盘对应用程序的影响,文件系统需要通过各种各样的手段进行优化
一,I/O 有时候为什么会突然很慢?
手机厂商的数据通常都是出厂数据,我们在使用 Android 手机的时候也会发现,刚买的时候“如丝般顺滑”的手机,在使用一年之后就会变得卡顿无比。
可能有下面几个原因
1.内存不足。当手机内存不足的时候,系统会回收 Page Cache 和 Buffer Cache 的内存,大部分的写操作会直接落盘,导致性能低下。
2.写入放大。上面我说到闪存重复写入需要先进行擦除操作,但这个擦除操作的基本单元是 block 块,一个 page 页的写入操作将会引起整个块数据的迁移,这就是典型的写入放大现象。低端机或者使用比较久的设备,由于磁盘碎片多、剩余空间少,非常容易出现写入放大的现象。
3.由于低端机的 CPU 和闪存的性能相对也较差,在高负载的情况下容易出现瓶颈。例如 eMMC 闪存不支持读写并发,当出现写入放大现象时,读操作也会受影响。
二,
总的来说文件读写受到 I/O 性能瓶颈的影响,在到达一定速度后整体性能就会受到明显的影响,过多的线程反而会导致应用整体性能的明显下降。
案例一:当系统空闲(36% idle)时,如果没有其他线程需要调度,这个时候才会出现 I/O 等待(60.2% iowait)。案例二:如果我们的系统繁忙起来,这个时候 CPU 不会“无所事事”,它会去看有没有其他线程需要调度,这个时候 I/O 等待会降低(14.2% iowait)。但是太多的线程阻塞会导致线程切换频繁,增大系统上下文切换的开销。