-
-
Save Jekis/6c8fe9dfb999fa76479058e2d769ee5c to your computer and use it in GitHub Desktop.
#!/bin/bash | |
function echo_mem_stat () { | |
mem_total="$(free | grep 'Mem:' | awk '{print $2}')" | |
free_mem="$(free | grep 'Mem:' | awk '{print $7}')" | |
mem_percentage=$(($free_mem * 100 / $mem_total)) | |
swap_total="$(free | grep 'Swap:' | awk '{print $2}')" | |
used_swap="$(free | grep 'Swap:' | awk '{print $3}')" | |
swap_percentage=$(($used_swap * 100 / $swap_total)) | |
echo -e "Free memory:\t$((free_mem / 1024))/$((mem_total / 1024)) MB\t($mem_percentage%)" | |
echo -e "Used swap:\t$((used_swap / 1024))/$((swap_total / 1024)) MB\t($swap_percentage%)" | |
} | |
echo "Testing..." | |
echo_mem_stat | |
if [[ $used_swap -eq 0 ]]; then | |
echo "No swap is in use." | |
elif [[ $used_swap -lt $free_mem ]]; then | |
echo "Freeing swap..." | |
swapoff -a | |
swapon -a | |
echo_mem_stat | |
else | |
echo "Not enough free memory. Exiting." | |
exit 1 | |
fi |
Thank you! (I have added a "safety net" to this, 250meg in my case. Because if it has only like 50mb and starts to unload swap, it may mean the machine is indeed in a ram heavy situation. I.e.: Unloading the swap could not come at a worse time. So basically it checks if it has the amount AND some more just in case. Percentage could not work too well in this case, so I just stick to a var + megabytes and just input it on my VPS.)
Also, it's really weird how any modern VPS (Vultr, DigitalOcean, Hetzner, OVH and so on) has super fast IO performance, but if you start using swap (let system handle it), it will really slow down. I mean I had dedicated servers with HDDs and default SWAP settings. They ate into swap, but never slow down this much.
Thank you!
on line 5
free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
should be
free_mem="$(free | grep 'Mem:' | awk '{print $4}')"
ciniset is right. Also, my free
command shows its output in my language instead of english, which breaks the grep. I replaced it with this:
free | head -2 | tail -1 | awk '{print $4}'
I made a fork that works regardless of language and can be used as function from anywhere, see https://gist.github.com/Xerus2000/78f12b64c916bb9e6a82ea622f21d06c
Hi what about this:
sync; echo 3 > /proc/sys/vm/drop_caches
Found here & there are multiple options:
https://www.thegeekdiary.com/how-to-clear-the-buffer-pagecache-disk-cache-under-linux/
Hi
This script is amazingly useful. I was just wondering how it could be modified to only run if the swap was used at more than some value, say 5%, Thanks in advance.
Tom
I was just wondering how it could be modified to only run if the swap was used at more than some value, say 5%, Thanks in advance.
You can add additional if
statement. Check it out:
https://gist.github.com/movalex/ba4e94eb0e03e4cff151162bc3e657aa
sorry for digging this up, but leaving a comment for posterity because i struggled for a while:
if the locale happens to be set to something other than en_US, free localizes the "Mem:" and "Swap:" line headings, meaning you have to edit the grep statements to match whatever is being returned by free, and if those line headings happen to have spaces in them, you also have to bump the awk argument number.
and for example, in fr_FR, swap is "Partition d'échange", so edit lines 7 and 8 to:
swap_total="$(free | grep 'Partition d..change:' | awk '{print $3}')"
used_swap="$(free | grep 'Partition d..change:' | awk '{print $4}')"
"Mem:" is unchanged in french so nothing changes ealier but other languages might run into trouble and the error message bash throws isn't explicit.
there's probably an easy way of doing this involving not grepping at all and simply parsing the appropriate line numbers (because free always returns the same things) but eh.
@themoonisacheese look at my comment :)
https://gist.github.com/xeruf/78f12b64c916bb9e6a82ea622f21d06c
hello, i want to run the script whenever an amount memory of swap correspond a specified amount. how can i solve this my case? can you help me? Assume that my memory swap's amount is 1900m, i want run the script automatically
create a cronjob or use a watchdog like https://mmonit.com/monit/
or just shrink your swap lol
Usage