diff --git a/.bin/zswapstats b/.bin/zswapstats new file mode 100755 index 0000000..44f639e --- /dev/null +++ b/.bin/zswapstats @@ -0,0 +1,86 @@ +#!/bin/bash +# Source: https://wiki.tnonline.net/w/Blog/Zswap_statistics + +# System page size +page_size=$(getconf PAGESIZE) + +# Location of zswap settings +settings_dir="/sys/module/zswap/parameters" + +# Location of zswap statistics +statistics_dir="/sys/kernel/debug/zswap" + +# Array of zswap settings +settings=("accept_threshold_percent" "compressor" "enabled" "max_pool_percent") + +# Array of zswap statistics +statistics=("pool_limit_hit" "pool_total_size" "reject_alloc_fail" "reject_compress_poor" "reject_kmemcache_fail" "reject_reclaim_fail" "stored_pages") + +# Declare an associative array to store zswap data +declare -A zswap_data + +# Read zswap settings +for setting in "${settings[@]}"; do + read -r value < "$settings_dir/$setting" + zswap_data["$setting"]=$value +done + +# Read zswap statistics +for stat in "${statistics[@]}"; do + read -r value < "$statistics_dir/$stat" + zswap_data["$stat"]=$value +done + +# Determine the maximum length of keys (setting/statistic names) +max_length=0 +for key in "${!zswap_data[@]}"; do + if [ ${#key} -gt $max_length ]; then + max_length=${#key} + fi +done +((width = max_length + 4)) + +# Calculate the total size and compressed size in MiB +total_size=$((zswap_data["stored_pages"] * page_size / (1024 * 1024) )) +compressed_size=$((zswap_data["pool_total_size"] / (1024 * 1024) )) + +# Calculate the compression ratio +if [ "${zswap_data["stored_pages"]}" -ne 0 ]; then + compression_ratio=$(bc <<< "scale=2; (${zswap_data["stored_pages"]} * $page_size / ${zswap_data["pool_total_size"]})") +else + compression_ratio=0 +fi + + +# Output the zswap settings +printf "========\n" +printf "SETTINGS" +printf "\n========\n" +for key in "${settings[@]}"; do + # Get the value from the associative array + value=${zswap_data["$key"]} + + # Output the key (name) and value in columns + printf "%-*s%s\n" "$width" "$key" "$value" +done + +# Output the zswap data +printf "\n========\n" +printf "VALUES" +printf "\n========\n" +for key in "${statistics[@]}"; do + # Get the value from the associative array + value=${zswap_data["$key"]} + + # Output the key (name) and value in columns + printf "%-*s%s\n" "$width" "$key" "$value" +done + +# Output the total size, compressed size, and compression ratio +printf "\n========\n" +printf "SUMMARY" +printf "\n========\n" +printf "%-*s%s MiB\n" "$width" "Total Size:" "$total_size" +printf "%-*s%s MiB\n" "$width" "Compressed Size:" "$compressed_size" +printf "%-*s%s\n" "$width" "Compression Ratio:" "$compression_ratio" +