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