从/proc/meminfo中我们可看到系统swap空间总共多大,剩余多少,以及还有一个SwapCached指标:
cat /proc/meminfo |grep -i swap
SwapCached: 12 kB
SwapTotal: 7340028 kB
SwapFree: 6578940 kB
那么什么是SwapCached?代码中total_swapcache_pages是打印的address_space->nrpages;
- 在Android中,普遍将zram作为anon_page的swap_backend;
- 在swap page到zram中时,由于zram是一个SYNC设备(SWP_SYNCHRONOUS_IO),
- 先add_to_swap将page设为PageSwap,同时add_to_swap_cache会递增nr_pages;
- 它在pageout()后,然后就通过__remove_mapping将__delete_from_swap_cache,又递减了address_space->nrpages;
- 所以这里SwapCached并不是所谓的 swap缓存,即:并不是在swapout时作为一个cache;
- 其实它是在swapin时的一个缓存概念:
- swapout时通过pageout将pageA的内容压缩到zram中;
- swapin时重新申请新的pageB,并解压缩zram的数据到此page中;并统计到SwapCached中;此时zram中还有此pageB压缩后的备份;
- 如果pageB一直没有发生 写,那么再一次swapout时 是不需要再次压缩的;直接和zram建立映射关系,并free掉该page即可;
- 所以,SwapCached其实是在swapin时才会增大的;