为什么当 zswap 启用并且 zswap 池未满时会触及 swap?

为什么当 zswap 启用并且 zswap 池未满时会触及 swap?

当前配置是 swappiness = 40;zswap cache = 40

free -m命令说

               total        used        free      shared  buff/cache   available
Mem:           3615        1353        1232         191        1029        1806
Swap:          4095           4        4091

zswap 通过命令调试信息sudo grep -r . /sys/kernel/debug/zswap

/sys/kernel/debug/zswap/stored_pages:892
/sys/kernel/debug/zswap/pool_total_size:1220608
/sys/kernel/debug/zswap/duplicate_entry:0
/sys/kernel/debug/zswap/written_back_pages:0
/sys/kernel/debug/zswap/reject_compress_poor:0
/sys/kernel/debug/zswap/reject_kmemcache_fail:0
/sys/kernel/debug/zswap/reject_alloc_fail:0
/sys/kernel/debug/zswap/reject_reclaim_fail:0
/sys/kernel/debug/zswap/pool_limit_hit:0

答案1

zswap 中的页面仍然被算作磁盘交换。我相信这是必要的,因为 zswap 池大小是动态的,这允许最终将所有页面移动到磁盘交换。

/sys/kernel/debug/zswap/written_back_pages 显示实际写入磁盘的页面数,但据我所知,这是一个所有时间的累积增量。

为了获得当前磁盘上交换的字节数
你想计算

$used_swap_in_bytes(as shown by "free -b" or "swapon -s") -
/sys/kernel/debug/zswap/stored_pages * $(getconf PAGESIZE)

例如(以字节为单位)

echo "$(LANG=c free -b |grep Swap |awk '{print $3}') - $(sudo \
cat /sys/kernel/debug/zswap/stored_pages)*$(getconf PAGESIZE)" |bc -l
echo bytes swapped on disk

或者用 Mio (地板圆角) 表示:

echo | awk '{value='"$(LANG=c free -b |grep Swap |awk '{print $3}')\
- $(sudo cat /sys/kernel/debug/zswap/stored_pages)*\
$(getconf PAGESIZE)"';printf "%.0f\n", value/1024**2}'
echo Mio swapped on disk

相关内容