Ver código fonte

feat: support per cgroup reclaim

Signed-off-by: greatbridf <greatbridf@icloud.com>
greatbridf 5 dias atrás
pai
commit
f385fd9fa1
1 arquivos alterados com 19 adições e 14 exclusões
  1. 19 14
      reclaimer.sh

+ 19 - 14
reclaimer.sh

@@ -10,9 +10,9 @@ debug=
 
 usage() {
 	cat <<EOF
-Usage: $0 [OPTIONS]
+Usage: $0 [OPTIONS] [[cgroup]..]
 
-Reclaim memory at fixed interval
+Reclaim memory of cgroups at an fixed interval
 
 Options:
 	-s <size>		Memory to reclaim in one run. Available units: K, M
@@ -126,9 +126,8 @@ calc_size_to_reclaim_kb() {
 	echo $_size_kb
 }
 
-reclaim() {
-	cgpath="/sys/fs/cgroup"
-	echo "$1" > "$cgpath/memory.reclaim"
+iter_cgroup_sorted() {
+	find "$1" -type d | sort
 }
 
 dump_reclaim_args() {
@@ -146,15 +145,21 @@ wait_for_next_run() {
 	sleep "$interval"
 }
 
-start_reclaim() {
-	reclaim_size_kb="$(calc_size_to_reclaim_kb)"
-
-	if ! reclaim "${reclaim_size_kb}K"; then
-		log_warn "unable to reclaim, status=$?"
-		return
+reclaim() {
+	if echo "$1" > "$2/memory.reclaim"; then
+		log_info "reclaimed memory $1 in $2"
 	fi
+}
+
+start_reclaim() {
+	local reclaim_size
+	reclaim_size="$(calc_size_to_reclaim_kb)K"
 
-	log_info "reclaimed memory ${reclaim_size_kb}K"
+	for path in "$@"; do
+		for cgpath in $(iter_cgroup_sorted "$path"); do
+			reclaim "$reclaim_size" "$cgpath"
+		done
+	done
 }
 
 reclaim_run() {
@@ -163,7 +168,7 @@ reclaim_run() {
 	[ -n "$debug" ] && dump_reclaim_args
 
 	if should_reclaim; then
-		start_reclaim
+		start_reclaim "$@"
 	fi
 
 	[ -n "$debug" ] && dump_memusage
@@ -186,6 +191,6 @@ shift $((OPTIND - 1))
 init_reclaim_states
 
 while true; do
-	reclaim_run
+	reclaim_run "$@"
 	wait_for_next_run
 done