zram-swap: Add zram compaction and statistics info output
authorEmil Muratov <gpm@hotplug.ru>
Wed, 31 Oct 2018 21:16:58 +0000 (00:16 +0300)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 7 Jul 2019 11:02:06 +0000 (13:02 +0200)
Executing '/etc/init.d/zram start' during runtime (with a swap being already
mounted) triggers zram device compaction and prints out nice stats info about
zram memory usage

Signed-off-by: Emil Muratov <gpm@hotplug.ru>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com> [use IEC's MiB unit]
package/system/zram-swap/Makefile
package/system/zram-swap/files/zram.init

index 5278005..bcada98 100644 (file)
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 
 PKG_NAME:=zram-swap
 PKG_VERSION:=1.1
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 
index 9fd4089..6b5714b 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 )"