Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

There are quite number of software running on my server: httpd, varnish, mysql, memcache, java..

Each of them is using a part of the virtual memory and varnish was configured to be allocated 3GB of memory to run.

Due to high traffic load which is 100K, our server ran out of memory and oom-killer is invoked. We've to reboot the server.

We have 8GB of Virtual Memory and due to some reason we cannot extend to larger memory.

My question is - Is there any automated script, which will monitor how much virtual memory left and based upon certain criteria, lets say if 500MB left than restart the server automatically?

I do know this is not the proper solution but we have to do it, otherwise we don't know when server will get OOM and by the time we know and restart the server, we lost our visiting users.

share|improve this question
2  
Wouldn't disabling the OOM killer make more sense? –  voretaq7 Dec 11 '12 at 4:48
    
Are you sure you mean virtual memory, not physical memory? 8GB is an absurdly low virtual memory limit. Also, there's no way a server can have 500MB of virtual memory left, because virtual memory is a per-process resource. –  David Schwartz Dec 11 '12 at 5:06
    
Are you talking about virtual memory as in a VPS? –  Grumpy Dec 11 '12 at 6:14
1  
@SukhjinderSingh: That makes no sense, since each process has its own virtual memory limits on dedicated server. It wouldn't make sense the restart the server if a process was running low on virtual memory. (Do you mean RAM + swap, maybe?) –  David Schwartz Dec 11 '12 at 8:19
1  
Wouldn't it be MUCH better to just limit memory resources in order to have it not go beyond the limits of the server? Apache MPM tuning, MySQL buffer pool limit, etc. Better to refuse more connections than have processes killed in an unclean state. –  gertvdijk Dec 11 '12 at 15:11

2 Answers 2

If I understand you correctly, you want something like the following:

  1. Check how much memory is left on the VPS.
  2. If 500M memory is left , reboot the VPS.

This could be done as follow

  1. Write a script that checks how much memory is left and reboot the VPS
  2. Add this script to crontab and for automatization

e.g

#!/bin/bash

mem=$(free -m | awk '/Mem:/{print $4}')

(( mem <= 500 )) && reboot

Make the script executable

chmod +x scriptname // note don't add an extension

Add the script to the cron

crontab -e

* * * * * user_to_run_the_script /path/to/the/script

Hope you get the idea.

share|improve this answer
    
Right, I will check this out and let you know if this works for me. –  Sukhjinder Singh Dec 11 '12 at 10:51
1  
This is a direct answer to the question, which is good. It is also a HORRIBLE idea. "Just reboot the server" is almost NEVER the right solution -- find and fix the root cause (memory leak, inadequately provisioned system, etc), don't just bounce the box whenever a given parameter crosses a threshold. –  voretaq7 Dec 11 '12 at 16:16
    
@voretaq7 I totally agree. I should have mentioned that this is not a desirable solution. There are of course better ways to this approach. As I tend to be concise on my answers I just pictured out what sukhijnder asked. –  val0x00ff Dec 11 '12 at 22:25

I had a similar problem, and while not wanting to question your question which is nice and specific, I have to say that you need a long term fix.

OOM killer kicks in because your server is running out of memory. Turning off OOM killer won't help with that - you'll still be out of memory and your server will eventually crash. Sure OOM killer doesn't always help, but turning it off won't either.

Rebooting your server will temporarily fix the problem, but it will happen again.

I had a similar issue with a server. Installing monit and configuring it to warn me when memory was running out allowed me to access the server when something was starting to happen, so I could properly diagnose it and solve it. I also added swap via a swapfile to increase the time I had to access the server while the problem was occurring.

In my case, my webserver was configured to start way too many spare servers for the load the server could handle. Once I figured out the root cause of the problem, I tackled it, and the server has not crashed since.

share|improve this answer
    
please provide monit link so that I can learn about it. –  Sukhjinder Singh Dec 11 '12 at 17:45
    
Umm google.com/?q=monit –  dunxd Dec 12 '12 at 11:48

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.