You are not logged in.

#1 2023-01-27 09:44:53

Markus00000
Member
Registered: 2011-03-27
Posts: 318

Swapping to disk while zswap pool mostly free

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

Board footer

Powered by FluxBB