1
0
Fork 0
tuned/ktune/ktune.init
Jaroslav Škarvada abb08bb75d ktune: do not revert sysctl settings on ktune stop
Now the sysctl settings are not reverted on ktune stop. This is to avoid cases
where the time window when the sysctl settings are reverted can cause unwanted
behaviour. E.g. it can temporary reset system limits on disk addition (because
ktune service is restarted by udev) which may cause some commands to fail.

It is still possible to switch to the old behaviour (reverting sysctl) by
exporting KTUNE_REVERT_SYSCTL and setting it to 1. This can be also
set per profile in the /etc/tune-profiles/PROFILE_NAME/ktune.sysconfig by
adding the following:

KTUNE_REVERT_SYSCTL=1

Resolves: rhbz#1111416

Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
2015-11-24 17:44:23 +01:00

316 lines
6.5 KiB
Bash

#!/bin/sh
#
# ktune ktune sysctls
#
# chkconfig: - 27 99
# description: Applies and reverts ktune sysctl settings
#
# config: /etc/sysctl.ktune
# config: /etc/sysconfig/ktune
#
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description: This service applies and reverts ktune sysctl settings.
# Description:
### END INIT INFO
# Source function library.
. /etc/init.d/functions
# Source ktune configureation.
if [ -f /etc/sysconfig/ktune ] ; then
. /etc/sysconfig/ktune
else
echo -n $"$0: /etc/sysconfig/ktune does not exist."; warning; echo
exit 5
fi
VAR_SUBSYS_KTUNE=/var/lock/subsys/ktune
SAVE_FILE="/var/run/ktune.save"
SYSCTL_SET="/sbin/sysctl -q -w "
SYSCTL_GET="/sbin/sysctl -e"
KERNEL_ELEVATOR="cfq"
/bin/fgrep -q 'elevator=' /proc/cmdline
CMDLINE_ELEVATOR=$?
if [ -n "$ELEVATOR_TUNE_DEVS" ]; then
SYS_BLOCK_SDX=
for file in $(eval LANG=C /bin/ls -1d "${ELEVATOR_TUNE_DEVS}" 2>/dev/null); do
if ! expr match $(readlink -f "$file") '^/sys/.*/queue/scheduler$' >/dev/null; then
printf $"$0: '%s' is not a scheduler control file." "$file"
warning; echo
else
SYS_BLOCK_SDX="$SYS_BLOCK_SDX $file"
fi
done
else
SYS_BLOCK_SDX=
fi
declare -a KTUNE_FILES
if [ -r "$SYSCTL" ]; then
KTUNE_FILES[0]="$SYSCTL"
fi
if [ "x$USE_KTUNE_D" = "xyes" ]; then
while read file; do
[ -r "$file" ] || continue
KTUNE_FILES[${#KTUNE_FILES[*]}]="${file}"
done <<EOF
$(LANG=C /bin/ls -1 /etc/ktune.d/*.conf 2>/dev/null)
EOF
fi
function is_int
{
[ ! -z "${1##*[^0-9]*}" ]
}
load_file() {
local file=$1
local save=$2
local curr_value
ret_s=0
errors=
# apply ktune settings
while read line; do
[ "${line:0:1}" == "#" -o "${line:0:1}" == ";" ] && continue
[ -z "$line" ] && continue
key=$(echo $line | awk '{ match($0,"[ \t]*=[ \t]*") && $0=substr($0,1,RSTART-1); print $0}')
value=$(echo $line | awk '/=/ { match($0,"[ \t]*=[ \t]*"); $0=substr($0,RSTART+RLENGTH); print $0}')
curr_value=""
if [ "${value:0:1}" = '>' ]; then
value=${value:1}
curr_value=$($SYSCTL_GET -n "$key")
fi
if [ "${value:0:1}" = '$' ]; then
value=${value:1}
value=${!value}
fi
is_int "$curr_value" && is_int "$value" && [ "$value" -lt "$curr_value" ] && value="$curr_value"
[ $save -ne 0 ] && save_value=$($SYSCTL_GET "$key")
setting=$key
if [ "$value" ]; then
[ -n "$value" ] && setting+="=${value}"
error="$($SYSCTL_SET "${setting}" 2>&1)"
ret=$?
if [ $save -ne 0 -a $ret -eq 0 ] && ! grep -q "^${key} =" $SAVE_FILE 2>/dev/null; then
echo "$save_value" >> "$SAVE_FILE"
fi
[ -n "$error" ] && errors+="${error}\n"
let ret_s+=$ret
fi
done < "$file"
if [ $ret_s -eq 0 ]; then
success; echo
else
failure; echo; ret=1
echo -e "$errors" | while read line; do echo -e " ${line}"; done
fi
}
call_script() {
local script=$1
local option=$2
if [ -x "$script" ]; then
echo -n "Calling '$script $option': "
("$script" "$option")
ret=$?
if [ $ret -eq 0 ]; then
success; echo
else
failure; echo; ret=1
fi
fi
}
load_sysctl() {
# Remove save file
/bin/rm -f "$SAVE_FILE"
if [ ${#KTUNE_FILES[@]} -gt 0 ]; then
# Apply general sysctl settings beforehand
for f in $SYSCTL_PRE; do
if [ -r "$f" ]; then
echo $"Applying sysctl settings from $f"
sysctl -e -p "$f" >/dev/null 2>&1
fi
done
echo $"Applying ktune sysctl settings:"
# Apply ktune files.
for file in "${KTUNE_FILES[@]}"; do
echo -n $"$file: "
load_file "$file" 1
call_script "${file%.conf}.sh" start
done
# Apply general sysctl settings afterwards
for f in $SYSCTL_POST; do
if [ -r "$f" ]; then
echo $"Applying sysctl settings from $f"
sysctl -e -p "$f" >/dev/null 2>&1
fi
done
fi
}
revert_sysctl() {
if [ -r "$SAVE_FILE" ]; then
if [ "$KTUNE_REVERT_SYSCTL" = 1 ]; then
echo -n $"Reverting to saved sysctl settings: "
load_file "$SAVE_FILE" 0
fi
/bin/rm -f "$SAVE_FILE"
fi
if [ ${#KTUNE_FILES[@]} -gt 0 ]; then
for file in "${KTUNE_FILES[@]}"; do
call_script "${file%.conf}.sh" stop
done
fi
}
start() {
[ "$EUID" != "0" ] && exit 4
ret=0
# if no elevator on command line, apply the ktune elevator
if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
ret_e=0
echo -n $"Applying ${ELEVATOR} elevator: "
for i in $SYS_BLOCK_SDX; do
dev="${i%%/queue*}"; echo -n "${dev##*/} "
echo "$ELEVATOR" > "$i" 2>/dev/null;
let ret_e+=$?
done
if [ $ret_e -eq 0 ]; then
success; echo
else
failure; echo; ret=1
fi
fi
load_sysctl
/bin/touch $VAR_SUBSYS_KTUNE
return $ret
}
reload() {
[ "$EUID" != "0" ] && exit 4
revert_sysctl
load_sysctl
}
stop() {
[ "$EUID" != "0" ] && exit 4
ret=0
revert_sysctl
# if no elevator on command line, apply the default elevator
if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
ret_e=0
echo -n $"Reverting to ${KERNEL_ELEVATOR} elevator: "
for i in $SYS_BLOCK_SDX; do
dev="${i%%/queue*}"; echo -n "${dev##*/} "
echo "$KERNEL_ELEVATOR" > "$i" 2>/dev/null;
let ret_e+=$?
done
if [ $ret_e -eq 0 ]; then
success; echo
else
failure; echo; ret=1
fi
fi
/bin/rm -f $VAR_SUBSYS_KTUNE
return $ret
}
status() {
[ "$EUID" != "0" ] && exit 4
if [ ! -f "$VAR_SUBSYS_KTUNE" ]; then
echo $"ktune settings are not applied."
return 3
fi
echo $"Current ktune sysctl settings:"
if [ -e $SAVE_FILE ]; then
keys=$(awk '/^[#;]/ { next } /=/ { match($1,"=") && $1=substr($1,1,RSTART-1); print $1 }' "$SAVE_FILE")
for key in $keys; do
$SYSCTL_GET $key
done
else
echo $"None"
fi
if [ -n "$ELEVATOR" -a -n "$SYS_BLOCK_SDX" -a $CMDLINE_ELEVATOR -ne 0 ]; then
echo
echo $"Current elevator settings:"
for i in $SYS_BLOCK_SDX; do
echo -n "${i}: "; cat "$i"
done
fi
return 0
}
case "$1" in
start)
[ -f "$VAR_SUBSYS_KTUNE" ] && exit 0
start
RETVAL=$?
;;
stop)
[ -f "$VAR_SUBSYS_KTUNE" ] || exit 0
stop
RETVAL=$?
;;
reload)
[ -f "$VAR_SUBSYS_KTUNE" ] && reload
RETVAL=$?
;;
restart|force-reload)
[ -f "$VAR_SUBSYS_KTUNE" ] && stop
start
RETVAL=$?
;;
condrestart|try-restart)
[ -f "$VAR_SUBSYS_KTUNE" ] || exit 0
stop
start
RETVAL=$?
;;
status)
status
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=2
;;
esac
exit $RETVAL