iowait问题成因及对策
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
根据 “[FAQ04288] 如何分析手机中出现的ANR(Application not responding/应用程序无响应)的问题?”
确定是iowait导致的ANR
[SOLUTION]
成因:
1. 系统因为io导致进程wait;
2. 数据请求量大;
3. 存储器性能欠佳(TLC的eMMC和SD Card表现明显)
原理:
linux 用pdflush进程把数据从缓存页写入硬盘,pdflush写入硬盘看两个参数:
1. 数据在页缓存中是否超出3秒 (default),如果是,标记为脏页缓存;
/proc/sys/vm/dirty_expire_centiseconds
2. 脏页缓存是否达到工作内存的10%(default);
/proc/sys/vm/dirty_background_ratio
以下参数也会影响到pdflush
/proc/sys/vm/dirty_ratio (default 20):global_dirtyable_memory的最大百分比,系统所能拥有的最大脏页缓存的总量。
超过这个值,开启pdflush写入硬盘。如果cache增长快于pdflush,那么整个系统在20%的时候遇到I/O瓶颈,所有的I/O都要等待cache被pdflush进硬盘后才能重新开始。
对于有高度写入操作的系统
dirty_background_ratio: 主要调整参数。如果需要把缓存持续的而不是一下子大量的写入硬盘,降低这个值。
dirty_ratio: 第二调整参数。
对策:
如果有大量的写操作,为避免I/O的长时间等待,可以设置:
$ echo 3 > /proc/sys/vm/dirty_background_ratio
$ echo 10 > /proc/sys/vm/dirty_ratio
可以在init.rc中修改,如果user版本(未开mtklog)难以复现,建议不做修改。
因为通过调整内核参数,将写活动的高峰分布成频繁的多次写,每次写入的数据比较少。
以这种方式执行的效率比较低,减少了内核组合写操作的机会。
根据 “[FAQ04288] 如何分析手机中出现的ANR(Application not responding/应用程序无响应)的问题?”
确定是iowait导致的ANR
[SOLUTION]
成因:
1. 系统因为io导致进程wait;
2. 数据请求量大;
3. 存储器性能欠佳(TLC的eMMC和SD Card表现明显)
原理:
linux 用pdflush进程把数据从缓存页写入硬盘,pdflush写入硬盘看两个参数:
1. 数据在页缓存中是否超出3秒 (default),如果是,标记为脏页缓存;
/proc/sys/vm/dirty_expire_centiseconds
2. 脏页缓存是否达到工作内存的10%(default);
/proc/sys/vm/dirty_background_ratio
以下参数也会影响到pdflush
/proc/sys/vm/dirty_ratio (default 20):global_dirtyable_memory的最大百分比,系统所能拥有的最大脏页缓存的总量。
超过这个值,开启pdflush写入硬盘。如果cache增长快于pdflush,那么整个系统在20%的时候遇到I/O瓶颈,所有的I/O都要等待cache被pdflush进硬盘后才能重新开始。
对于有高度写入操作的系统
dirty_background_ratio: 主要调整参数。如果需要把缓存持续的而不是一下子大量的写入硬盘,降低这个值。
dirty_ratio: 第二调整参数。
对策:
如果有大量的写操作,为避免I/O的长时间等待,可以设置:
$ echo 3 > /proc/sys/vm/dirty_background_ratio
$ echo 10 > /proc/sys/vm/dirty_ratio
可以在init.rc中修改,如果user版本(未开mtklog)难以复现,建议不做修改。
因为通过调整内核参数,将写活动的高峰分布成频繁的多次写,每次写入的数据比较少。
以这种方式执行的效率比较低,减少了内核组合写操作的机会。
不错,小编分析很到位,是底层的高手。