这时候有几种可选的方法,一种就是使用限制内存条件的物理机器,比如你限制4G内存那我就用只有4G内存的机子。但是这种情况不方便,也不灵活,如果限制1G,甚至更小的内存资源呢,上哪去找符合这样条件的物理机器呢?因而从硬件上进行限制就非常笨拙,自然而然就想到用软件的方法进行灵活的限制。
之前搜索发现,linux下的ulimit命令可以对shell进程所用资源进行限制,但是发现其中对于内存资源使用的命令"-m"只对linux内核版本2.x的才有效,之后版本的都已经无效的。(怪不得我说跑的时候咋一点作用都没有,也算是替大家踩坑了...)
后来发现还有一种方法就是使用cgroup来对资源进行限制,推荐!!
下面讲一下Ubuntu上使用cgroup限制进程内存的方法:
1、安装命令
2、进入相应的目录,一般会下如下所示的位置中:
3、在该目录下创建自己的组目录
会看到在该目录下面会有很多文件,而我们只需要用到其中memory.limit_in_bytes文件
4、限制内存大小,写入memory.limit_in_bytes文件
这里1G默认单位是B,也就是你写成1*1024*1024也是一样的
5、具体使用
这里test就是上面第3步,我们在/sys/fs/cgroup/memory/目录下自己创建的组目录,然后之后跟上要执行的命令,就可以对执行的命令进行内存资源限制啦!
下面的shell脚本可以实时的监控系统中各个进程的CPU和内存的占用情况,用于限制进程CPU占用 率更加合理。
#!/bin/shPIDS=`top -bn 1 | grep "^ *[1-9]" | awk ’{ if($9 > 50 || $10 > 25 && id -u $2 > 500) print $1}’`
for PID in $PIDS
do
renice +10 $PID
echo "renice +10 $PID"
done
能够将这个脚本放到cron中运行,比如每分钟检查一次,只需以root身份添加crontab项:
#crontab -e
* * * * * limit.sh
以后每个一分钟就会检查一次,调整占用50%以上CPU或25%内存的进程的nice值,从而使这样的进程优先级变低,被调度的机会减少,同时会向root发邮件提示该进程被调整过。
但是,限制内存使用最好还是用PAM,RedHat能够在/etc/security/limits.conf中配置。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)