加载中…
正文 字体大小:

linux中限制用户进程CPU和内存占用率

(2013-09-12 14:55:55)
标签:

crontab

pam

分类: linux
 限制进程CPU占用率的问题,给出了一个shell脚本代码如下:

  renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > 500) print $2}'`

  其中用到ps获取进程信息,其实

  ps中%CPU一列的意义是进程实际占有CPU时间和它存活时间的比值,这个值能反应进程对CPU的消耗,但不能准确反应进程所占CPU时间占整个系统CPU的百分比。

  而top输出中的%CPU这一列正是进程所占CPU时间占整个系统CPU的百分比,用于限制进程CPU占用率更加合理,同时%MEM一列还反应了进程占用内存的百分比,可以用于限制进程内存占用率。

  shell脚本代码如下:

  #!/bin/sh

  PIDS=`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中设置。

 

本页内容为:linux上限制用户进程数、cpu占用率、内存使用率等,该文章本站转载自网络,如有侵权请告之,我们将会及时将其删除,其正文内容如下:

edit /etc/pam.d/login

#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so shadow nullok use_authtok
session required /lib/security/pam_pwdb.so
session required /lib/security/pam_limits.so

you have to add the last two lines

edit /etc/security/limits.conf

可带参数:
issue=filename:指定其他配置文件,而不是缺省的/etc/issue.
noesc:不对配置文件中的转移字符进行解释。

配置文件说明:
debug:将调试信息写入日志
conf=filename:指定配置文件

配置文件说明:该配置文件每一行(一个条目)的语法如下:

在这里
可以是
用户名
用户组名,采用@group的语法
通配符*,表示任何
可以是
soft-表示软限制,可以超过该限制
hard-表示硬限制,有root设定,内核执行,不可以超过该限制
可以是
core-core文件大小 (KB)
data-最大数据大小(KB)
fsize-最大文件大小(KB)
memlock-最大可用内存空间(KB)
nofile-最大可以打开的文件数量
rss-最大可驻留空间(KB)
stack-最大堆栈空间(KB)
cpu-最大CPU使用时间(MIN)
nproc-最大运行进程数
as-地址空间限制
maxlogins-某一用户可以登录到系统的最多次数
locks-最大锁定文件数目
需要注意的是,如果无限制可以使用”-”号,并且针对用户限制的优先级要比针对组的
优先级高。

实际上,在linux服务器中,用户进程运行很长时间是可以接受的。而占用CPU过高则让其他用户无法忍受,而其很有可能是用户程序有问题,这个时候系统应该自动阻止这样的进程继续消耗系统资源。

最简单的方法就是通过ps发现CPU占用率超过某个限制的用户进程,然后将该进程杀死,这种做法很暴力,而且用户发现他的进程被杀以后很可能又启动进程,这样恶性循环。

有一种折中的方法,不是将目标进程杀死,而是适当调整其nice值,具体见如下shell程序:

renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > 500) print $2}'`

0

阅读 评论 收藏 转载 喜欢 打印举报
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有