zram-swap: Add zram compaction and statistics info output
[openwrt/openwrt.git] / package / system / zram-swap / files / zram.init
index 9fd4089c6bc000aff3919a332f00868ae6dc5196..6b5714bb1c364cd4b1a96387c829538a8a9fe336 100755 (executable)
@@ -106,6 +106,54 @@ zram_comp_streams()
        fi
 }
 
+zram_stats()
+{
+       #print various stats info about zram swap device
+       local zdev="/sys/block/$( basename "$1" )"
+
+       printf "\nGathering stats info for zram device \"$( basename "$1" )\"\n\n"
+
+       printf "Z-RAM\n-----\n"
+       printf "%-25s - %s\n" "Block device" $zdev
+       awk '{ printf "%-25s - %d MiB\n", "Device size", $1/1024/1024 }' <$zdev/disksize
+       printf "%-25s - %s\n" "Compression algo" "$(cat $zdev/comp_algorithm)"
+       printf "%-25s - %s\n" "Compression streams" "$( cat $zdev/max_comp_streams)"
+
+       awk 'BEGIN { fmt = "%-25s - %.2f %s\n"
+               fmt2 = "%-25s - %d\n"
+               print "\nDATA\n----" }
+               { printf fmt, "Original data size", $1/1024/1024, "MiB"
+               printf fmt, "Compressed data size", $2/1024/1024, "MiB"
+               printf fmt, "Compress ratio", $1/$2, ""
+               print "\nMEMORY\n------"
+               printf fmt, "Memory used, total", $3/1024/1024, "MiB"
+               printf fmt, "Allocator overhead", ($3-$2)/1024/1024, "MiB"
+               printf fmt, "Allocator efficiency", $2/$3*100, "%"
+               printf fmt, "Maximum memory ever used", $5/1024/1024, "MiB"
+               printf fmt, "Memory limit", $4/1024/1024, "MiB"
+               print "\nPAGES\n-----"
+               printf fmt2, "Same pages count", $6
+               printf fmt2, "Pages compacted", $7 }' <$zdev/mm_stat
+
+       awk '{ printf "%-25s - %d\n", "Free pages discarded", $4 }' <$zdev/io_stat
+}
+
+zram_compact()
+{
+       # compact zram device (reduce memory allocation overhead)
+       local zdev="/sys/block/$( basename "$1" )"
+
+       old_mem_used=`awk '{print $3}' <$zdev/mm_stat`
+       old_overhead=`awk '{print $3-$2}' <$zdev/mm_stat`
+
+       echo ""
+       echo "Compacting zram device..."
+       echo 1 > $zdev/compact
+       awk -v old_mem="$old_mem_used" -v ovr="$old_overhead" 'BEGIN { fmt = "%-25s - %.1f %s\n" }
+               { printf fmt, "Memory usage reduced by ", (old_mem-$3)/1024/1024, "MiB"
+               printf fmt, "Overhead reduced by", (ovr-($3-$2))/ovr*100, "%" }' <$zdev/mm_stat
+}
+
 start()
 {
        local zram_size="$( zram_size )"
@@ -113,7 +161,15 @@ start()
 
        if [ $( grep -cs zram /proc/swaps ) -ne 0 ]; then
                logger -s -t zram_start -p daemon.notice "[OK] zram swap is already mounted"
-               return 1
+               # If not running interactively, than just quit
+               [ -z "$PS1" ] && return 1
+
+               # show memory stats and compact all zram swaps
+               for zram_dev in $( grep zram /proc/swaps |awk '{print $1}' ); do {
+                       zram_compact "$zram_dev"
+                       zram_stats "$zram_dev"
+               } done
+               return
        fi
 
        zram_dev="$( zram_getdev )"