zram-swap: Add zram compaction and statistics info output
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]
This commit is contained in:
		
				
					committed by
					
						
						Christian Lamparter
					
				
			
			
				
	
			
			
			
						parent
						
							c0d93432f2
						
					
				
				
					commit
					b062c90f47
				
			@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=zram-swap
 | 
					PKG_NAME:=zram-swap
 | 
				
			||||||
PKG_VERSION:=1.1
 | 
					PKG_VERSION:=1.1
 | 
				
			||||||
PKG_RELEASE:=2
 | 
					PKG_RELEASE:=3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 | 
					PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -106,6 +106,54 @@ zram_comp_streams()
 | 
				
			|||||||
	fi
 | 
						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()
 | 
					start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	local zram_size="$( zram_size )"
 | 
						local zram_size="$( zram_size )"
 | 
				
			||||||
@@ -113,7 +161,15 @@ start()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if [ $( grep -cs zram /proc/swaps ) -ne 0 ]; then
 | 
						if [ $( grep -cs zram /proc/swaps ) -ne 0 ]; then
 | 
				
			||||||
		logger -s -t zram_start -p daemon.notice "[OK] zram swap is already mounted"
 | 
							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
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	zram_dev="$( zram_getdev )"
 | 
						zram_dev="$( zram_getdev )"
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user