BUG 分析: 大量 D 进程卡在 shrink_inactive_list 导( 五 )


+辅助分析
执行页面回收中页面状态
会抓取下面这些信息统计,所以提前了解下 。
struct reclaim_stat {unsigned nr_dirty;// page_list中脏页数unsigned nr_unqueued_dirty;// page_list中脏页但是没有放入块设备请求队列中的页数unsigned nr_congested;// page_list中阻塞的页数unsigned nr_writeback; // page_list中处于回写中但是不是被回收的页数unsigned nr_immediate; //page_list中即回写中而且即将被回收的页数unsigned nr_activate;// page_list中近期被访问过需要添加到 activate list 的页数unsigned nr_ref_keep;// page_list中近期被访问过的页数unsigned nr_unmap_fail;//解除映射失败的页数};
经过一段时间的老化测试,测试同学终于抓到 log 了 。
图中显示,,几乎都是 0,只有零星被再访问的页面添加回list.
说明现场不存在 dirty 页面很多,回写 io 遇到瓶颈的情况 。这个猜想不成立 。
图中显示在 34 秒内,所有在 () 中的页面,全是 anon 页面,没有 file ?
查看trace event.
同样,没有很多量
从测试结果看到:
apk 监控到的 io 使用率不高从看到回写量不大
通过最新的数据信息,回到之前的两个大方向:
那么,之前的两个方向猜想,都落空了 。那会是什么意想不到的原因?
那回去看看卡住的代码,代码 。
static int __too_many_isolated(struct pglist_data *pgdat, int file,struct scan_control *sc, bool stalled){unsigned long inactive, isolated;if (file) {if (stalled) {inactive = node_page_state_snapshot(pgdat,NR_INACTIVE_FILE);isolated = node_page_state_snapshot(pgdat,NR_ISOLATED_FILE);} else {inactive = node_page_state(pgdat, NR_INACTIVE_FILE);isolated = node_page_state(pgdat, NR_ISOLATED_FILE);}} else {if (stalled) {inactive = node_page_state_snapshot(pgdat,NR_INACTIVE_ANON);isolated = node_page_state_snapshot(pgdat,NR_ISOLATED_ANON);} else {inactive = node_page_state(pgdat, NR_INACTIVE_ANON);isolated = node_page_state(pgdat, NR_ISOLATED_ANON);}}/** GFP_NOIO/GFP_NOFS callers are allowed to isolate more pages, so they* won't get blocked by normal direct-reclaimers, forming a circular* deadlock.*/if ((sc->gfp_mask & (__GFP_IO | __GFP_FS)) == (__GFP_IO | __GFP_FS))inactive >>= 3;return isolated > inactive;}
没有很复杂的逻辑,只有简单的和统计计数比较 。
所以,只能是更直接的猜想: file 统计一直偏大,导致一直判断为真,卡在 .
根据这个猜想,从 log 中打印的 mem info,也看到file 一直偏大,一直在增加,不会减少 。好像印证了猜想似的 。
LOG:
<6>[95299.607369]isolated(anon):0kB isolated(file):37880kB<6>[95318.568833]isolated(anon):0kB isolated(file):37752kB<6>[95323.773350]isolated(anon):0kB isolated(file):37752kB<6>[97520.184804]isolated(anon):0kB isolated(file):44604kB<6>[97525.658037]isolated(anon):0kB isolated(file):44604kB<6>[97754.256431]isolated(anon):0kB isolated(file):44604kB<6>[97759.418172]isolated(anon):0kB isolated(file):44604kB<6>[97764.574908]isolated(anon):0kB isolated(file):44604kB<6>[97769.735128]isolated(anon):0kB isolated(file):44604kB<6>[98543.638667]isolated(anon):0kB isolated(file):44684kB<6>[98548.905397]isolated(anon):0kB isolated(file):44684kB<6>[98554.209671]isolated(anon):0kB isolated(file):44684kB<6>[99996.798031]isolated(anon):0kB isolated(file):51572kB<6>[100002.122853] isolated(anon):0kB isolated(file):51572kB<6>[100007.359023] isolated(anon):0kB isolated(file):51572kB<6>[100146.079882] isolated(anon):0kB isolated(file):51700kB<6>[100151.313065] isolated(anon):0kB isolated(file):51572kB<6>[100156.587622] isolated(anon):0kB isolated(file):51572kB<6>[100328.483071] isolated(anon):0kB isolated(file):51700kB<6>[100520.245217] isolated(anon):0kB isolated(file):51572kB<6>[100550.688429] isolated(anon):0kB isolated(file):51572kB<6>[100555.913634] isolated(anon):0kB isolated(file):51572kB