Quellcode durchsuchen

feat: psi delta integral based reclaim

Signed-off-by: greatbridf <greatbridf@icloud.com>
greatbridf vor 5 Tagen
Ursprung
Commit
184ba24386
1 geänderte Dateien mit 36 neuen und 10 gelöschten Zeilen
  1. 36 10
      reclaimer.sh

+ 36 - 10
reclaimer.sh

@@ -3,7 +3,8 @@
 set -euo pipefail
 set -euo pipefail
 
 
 size=1M
 size=1M
-threshold=100
+threshold=1000
+loss=1000
 interval=1
 interval=1
 debug=
 debug=
 
 
@@ -18,6 +19,8 @@ Options:
 				[default: $size]
 				[default: $size]
 	-t <threshold>		PSI threshold to continue reclaiming.
 	-t <threshold>		PSI threshold to continue reclaiming.
 				[default: $threshold]
 				[default: $threshold]
+	-l <loss>		PSI integral drop per second.
+				[default: $loss]
 	-i <interval>		Interval between reclaims in seconds.
 	-i <interval>		Interval between reclaims in seconds.
 				[default: $interval]
 				[default: $interval]
 	-d			Enable debug output.
 	-d			Enable debug output.
@@ -60,6 +63,7 @@ readpsi() {
 init_reclaim_states() {
 init_reclaim_states() {
 	last_psi="$(readpsi)"
 	last_psi="$(readpsi)"
 	psi="$last_psi"
 	psi="$last_psi"
+	integral=0
 
 
 	size_kb=
 	size_kb=
 	# Convert size into KBs
 	# Convert size into KBs
@@ -76,11 +80,13 @@ init_reclaim_states() {
 			;;
 			;;
 	esac
 	esac
 
 
-	# Scale PSI threshold by interval
+	# Scale PSI threshold and loss by interval
 	threshold="$((threshold * interval))"
 	threshold="$((threshold * interval))"
+	loss="$((loss * interval))"
 
 
 	log_info "reclaim params:"
 	log_info "reclaim params:"
-	log_info "size=$size threshold=$threshold interval=$interval"
+	log_info "size=$size threshold=$threshold loss=$loss"
+	log_info "interval=$interval"
 }
 }
 
 
 update_states() {
 update_states() {
@@ -88,6 +94,14 @@ update_states() {
 	psi="$(readpsi)"
 	psi="$(readpsi)"
 
 
 	delta="$((psi - last_psi))"
 	delta="$((psi - last_psi))"
+
+	if [[ $integral -lt $loss ]]; then
+		integral=0
+	else
+		integral=$((integral - loss))
+	fi
+
+	integral=$((integral + delta))
 }
 }
 
 
 skip_reclaim() {
 skip_reclaim() {
@@ -95,21 +109,30 @@ skip_reclaim() {
 }
 }
 
 
 should_reclaim() {
 should_reclaim() {
-	if [[ "$delta" -gt "$threshold" ]]; then
-		skip_reclaim "high pressure: $delta > $threshold over the last ${interval}s"
+	if [[ "$integral" -gt "$threshold" ]]; then
+		skip_reclaim "high pressure: $integral > $threshold " \
+			"over the last ${interval}s"
 		return 1
 		return 1
 	fi
 	fi
 
 
 	return 0
 	return 0
 }
 }
 
 
+calc_size_to_reclaim_kb() {
+	# Rescale reclaim target by integral
+	_diff=$((threshold - integral))
+	_size_kb=$((size_kb * _diff / threshold))
+
+	echo $_size_kb
+}
+
 reclaim() {
 reclaim() {
 	cgpath="/sys/fs/cgroup"
 	cgpath="/sys/fs/cgroup"
-	echo "${size_kb}K" > "$cgpath/memory.reclaim"
+	echo "$1" > "$cgpath/memory.reclaim"
 }
 }
 
 
 dump_reclaim_args() {
 dump_reclaim_args() {
-	log_debug "last_psi=$last_psi psi=$psi delta=$delta"
+	log_debug "last_psi=$last_psi psi=$psi delta=$delta integral=$integral"
 }
 }
 
 
 dump_memusage() {
 dump_memusage() {
@@ -132,23 +155,26 @@ reclaim_run() {
 		return
 		return
 	fi
 	fi
 
 
-	if ! reclaim; then
+	reclaim_size_kb="$(calc_size_to_reclaim_kb)"
+
+	if ! reclaim "${reclaim_size_kb}K"; then
 		log_warn "unable to reclaim, status=$?"
 		log_warn "unable to reclaim, status=$?"
 		return
 		return
 	fi
 	fi
 
 
-	log_info "reclaimed memory ${size_kb}K"
+	log_info "reclaimed memory ${reclaim_size_kb}K"
 
 
 	[ -n "$debug" ] && dump_memusage
 	[ -n "$debug" ] && dump_memusage
 
 
 	return
 	return
 }
 }
 
 
-while getopts "s:t:i:dh" arg; do
+while getopts "s:t:i:l:dh" arg; do
 	case "$arg" in
 	case "$arg" in
 		s) size="$OPTARG" ;;
 		s) size="$OPTARG" ;;
 		t) threshold="$OPTARG" ;;
 		t) threshold="$OPTARG" ;;
 		i) interval="$OPTARG" ;;
 		i) interval="$OPTARG" ;;
+		l) loss="$OPTARG" ;;
 		d) debug=y ;;
 		d) debug=y ;;
 		h) usage 0 ;;
 		h) usage 0 ;;
 		?) usage 1 ;;
 		?) usage 1 ;;