|
|
@@ -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
|