Difference between revisions of "SwapClean"
(→Script) |
(→Script) |
||
| Line 4: | Line 4: | ||
==Script== | ==Script== | ||
<code>[bash,n] | <code>[bash,n] | ||
| − | |||
#!/bin/bash | #!/bin/bash | ||
#Swap Cleaner | #Swap Cleaner | ||
#Watches swap usage | #Watches swap usage | ||
#If there is swapping going on and there is enough free (+cache) ram, then turn swap off and back on. | #If there is swapping going on and there is enough free (+cache) ram, then turn swap off and back on. | ||
| − | + | ||
#User Assigned Variables | #User Assigned Variables | ||
| − | + | ||
swapthresh=0 #Swap threshold for clearing swap. Will not clear until this value is hit | swapthresh=0 #Swap threshold for clearing swap. Will not clear until this value is hit | ||
freethresh=0 #Real free (free+cached) - current swap threshold. Ensures that atleast x bytes are free before clearing | freethresh=0 #Real free (free+cached) - current swap threshold. Ensures that atleast x bytes are free before clearing | ||
| Line 17: | Line 16: | ||
logrotate=1000 #Max number of lines in the log file | logrotate=1000 #Max number of lines in the log file | ||
#### | #### | ||
| − | + | ||
function plog { | function plog { | ||
echo "[ `date` ][ $curswap; $curfree; $realload ] $1" >> /var/log/swapclean | echo "[ `date` ][ $curswap; $curfree; $realload ] $1" >> /var/log/swapclean | ||
| Line 25: | Line 24: | ||
fi | fi | ||
} | } | ||
| − | + | ||
function checkswap { | function checkswap { | ||
| − | + | ||
curswap=`free | fgrep "Swap:" | awk '{print $3}'` | curswap=`free | fgrep "Swap:" | awk '{print $3}'` | ||
curfree=`free | fgrep "buffers/cache:" | awk '{print $4}'` | curfree=`free | fgrep "buffers/cache:" | awk '{print $4}'` | ||
| Line 34: | Line 33: | ||
loadthresh=`echo "$loadthresh *100" | bc | sed 's/[.].*//'` | loadthresh=`echo "$loadthresh *100" | bc | sed 's/[.].*//'` | ||
swapdif=`expr $curfree - $curswap` | swapdif=`expr $curfree - $curswap` | ||
| − | + | ||
if [ "$swapthresh" -lt "$curswap" ] | if [ "$swapthresh" -lt "$curswap" ] | ||
then | then | ||
| Line 62: | Line 61: | ||
fi | fi | ||
fi | fi | ||
| − | + | ||
} | } | ||
| − | + | ||
function enablecron { | function enablecron { | ||
| − | + | ||
echo "What time would you like to set the cron to" | echo "What time would you like to set the cron to" | ||
echo "[IE: */10 * * * * ]" | echo "[IE: */10 * * * * ]" | ||
| Line 75: | Line 74: | ||
fi | fi | ||
echo "SHELL=/bin/bash" > /etc/cron.d/swapclean.sh | echo "SHELL=/bin/bash" > /etc/cron.d/swapclean.sh | ||
| − | echo "$crontime $(readlink -f $0)" >> /etc/cron.d/swapclean.sh | + | echo "$crontime root $(readlink -f $0)" >> /etc/cron.d/swapclean.sh |
chmod 0644 /etc/cron.d/swapclean.sh | chmod 0644 /etc/cron.d/swapclean.sh | ||
| − | echo "Cron enabled [$crontime $(readlink -f $0)]" | + | echo "Cron enabled [$crontime root $(readlink -f $0)]" |
} | } | ||
| − | + | ||
function disablecron { | function disablecron { | ||
| − | + | ||
rm -f /etc/cron.d/swapclean.sh | rm -f /etc/cron.d/swapclean.sh | ||
echo "Cron disabled" | echo "Cron disabled" | ||
| − | + | ||
} | } | ||
| − | + | ||
| − | + | ||
case $1 in | case $1 in | ||
--cron) | --cron) | ||
Revision as of 18:25, 2 June 2011
Contents
Overview
Script that is run via cron every ~10 minutes. Main purpose is to clear any swap usage if the system has the enough free ram and load is below a set value.
Script
[bash,n]
- !/bin/bash
- Swap Cleaner
- Watches swap usage
- If there is swapping going on and there is enough free (+cache) ram, then turn swap off and back on.
- User Assigned Variables
swapthresh=0 #Swap threshold for clearing swap. Will not clear until this value is hit freethresh=0 #Real free (free+cached) - current swap threshold. Ensures that atleast x bytes are free before clearing loadthresh=0 #Load threshold, will not clear if above this value (unless 0) logrotate=1000 #Max number of lines in the log file
function plog { echo "[ `date` ][ $curswap; $curfree; $realload ] $1" >> /var/log/swapclean if [ "`wc -l /var/log/swapclean | awk '{print $1}'`" -gt "$logrotate" ] then sed -i -e "1d" /var/log/swapclean fi }
function checkswap {
curswap=`free | fgrep "Swap:" | awk '{print $3}'` curfree=`free | fgrep "buffers/cache:" | awk '{print $4}'` realload=`cat /proc/loadavg | awk '{print $1}'` curload=`echo "$realload * 100" | bc | sed 's/[.].*//'` loadthresh=`echo "$loadthresh *100" | bc | sed 's/[.].*//'` swapdif=`expr $curfree - $curswap`
if [ "$swapthresh" -lt "$curswap" ] then #Server has swapped and is above its threshold if [ "$freethresh" -lt "$swapdif" ] then #Free - Swap is greater then freethresh if [ "$curload" -lt "$loadthresh" -o "$loadthresh" -eq 0 ] then #Load is below threshold if [ ! -e ".swapoff" ] then plog "Clearing swap" #Not currently clearing swap, nuke it. touch .swapoff /sbin/swapoff -a && /sbin/swapon -a rm -f .swapoff plog "Swap Cleared" else plog "Lock file found, swap may be already clearing" fi else plog "High load, waiting to clear swap" fi else plog "Not enough free memory, waiting to clear swap" fi fi
}
function enablecron {
echo "What time would you like to set the cron to" echo "[IE: */10 * * * * ]" read crontime; if [ ! $crontime ] then crontime="*/10 * * * *" fi echo "SHELL=/bin/bash" > /etc/cron.d/swapclean.sh echo "$crontime root $(readlink -f $0)" >> /etc/cron.d/swapclean.sh chmod 0644 /etc/cron.d/swapclean.sh echo "Cron enabled [$crontime root $(readlink -f $0)]" }
function disablecron {
rm -f /etc/cron.d/swapclean.sh echo "Cron disabled"
}
case $1 in
--cron)
case $2 in
on) enablecron ;; off) disablecron ;; esac
;;
--help)
echo "Check swap usage:"
echo " --cron [on, off]" echo " on: Turns on cron job and asks for time" echo " off: Turns off the cron job"
;;
*)
checkswap
;;
esac
What to change
swapthresh
This value allows swap to get to a certain level before looking to swap.
freethresh
This is the level of extra free ram the script will require before attempting to clean swap
loadthresh
This is the load level threshold at which the script will allow swap to be cleaned.
logrotate
This is the number of lines that will be stored in the log file. When reached the top line will be deleted.