You are not logged in.
My system has swapped 2GB to disk (swapfile) while its zswap pool is over 80% free.
I expected disk swapping to only happen when the pool is full or when pages compress poorly and are rejected from entering the pool.
Collection of system data:
/sys/module/zswap/parameters/same_filled_pages_enabled:Y
/sys/module/zswap/parameters/enabled:Y
/sys/module/zswap/parameters/max_pool_percent:50
/sys/module/zswap/parameters/compressor:lz4
/sys/module/zswap/parameters/non_same_filled_pages_enabled:Y
/sys/module/zswap/parameters/zpool:z3fold
/sys/module/zswap/parameters/accept_threshold_percent:90
/sys/kernel/debug/zswap/duplicate_entry:0
/sys/kernel/debug/zswap/pool_limit_hit:0
/sys/kernel/debug/zswap/pool_total_size:720224256
/sys/kernel/debug/zswap/reject_alloc_fail:0
/sys/kernel/debug/zswap/reject_compress_poor:598
/sys/kernel/debug/zswap/reject_kmemcache_fail:0
/sys/kernel/debug/zswap/reject_reclaim_fail:0
/sys/kernel/debug/zswap/same_filled_pages:120652
/sys/kernel/debug/zswap/stored_pages:525838
/sys/kernel/debug/zswap/written_back_pages:0
# sysctl vm.swappiness
vm.swappiness = 1
# swapon
NAME TYPE SIZE USED PRIO
/swapfile file 4.6G 2G -2
# free -h
total used free shared buff/cache available
Mem: 7.7Gi 4.1Gi 1.2Gi 483Mi 2.4Gi 2.8Gi
Swap: 4.6Gi 2.0Gi 2.6Gi
# zswap-stats
Pool size: 678Mi (decompressed: 1.9Gi)
Compression ratio: 2.7
Max pool size: 3.9Gi
Pool limit hit: 0
Rejected pages: 598 (2.4Mi)
Here is the zswap-stats script in case I miscalculate anything:
#!/bin/bash
STORED_PAGES=$(cat /sys/kernel/debug/zswap/stored_pages)
if [[ $STORED_PAGES -ne 0 ]]; then
PAGE_SIZE=$(getconf PAGE_SIZE)
POOL_TOTAL_SIZE=$(cat /sys/kernel/debug/zswap/pool_total_size )
POOL_SIZE_H=$(numfmt --to=iec-i "$POOL_TOTAL_SIZE")
POOL_SIZE_DECOMPRESSED_H=$(echo "$STORED_PAGES * $PAGE_SIZE" | bc | numfmt --to=iec-i)
RATIO=$(echo "scale=1; $STORED_PAGES * $PAGE_SIZE / $POOL_TOTAL_SIZE" | bc -l)
LIMIT_HIT=$(cat /sys/kernel/debug/zswap/pool_limit_hit)
REJECT_COMPRESS_POOR=$(cat /sys/kernel/debug/zswap/reject_compress_poor)
REJECT_SIZE_H=$(echo "$REJECT_COMPRESS_POOR * $PAGE_SIZE" | bc | numfmt --to=iec-i)
MEM_TOTAL=$(vmstat -s | awk '/total memory/ { print $1 }')
MAX_POOL_PERCENT=$(cat /sys/module/zswap/parameters/max_pool_percent)
POOL_SIZE_MAX_H=$(echo "$MAX_POOL_PERCENT / 100 * $MEM_TOTAL * 1024" | bc -l | numfmt --to=iec-i)
echo "Pool size: ${POOL_SIZE_H} (decompressed: ${POOL_SIZE_DECOMPRESSED_H})"
echo "Compression ratio: $RATIO"
echo "Max pool size: ${POOL_SIZE_MAX_H}"
echo "Pool limit hit: ${LIMIT_HIT}"
echo "Rejected pages: ${REJECT_COMPRESS_POOR} (${REJECT_SIZE_H})"
else
echo 'No stored pages'
fi
Offline