【转载】ulimit和setrlimit轻松修改task进程资源上限值

2021年09月15日 阅读数:2
这篇文章主要向大家介绍【转载】ulimit和setrlimit轻松修改task进程资源上限值,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
【转载】ulimit和setrlimit轻松修改task进程资源上限值
转载自: http://blog.chinaunix.net/u1/38994/showart_430348.html

在linux系统中,Resouce limit指在一个进程的执行过程当中,它所能获得的资源的限制,好比进程的core file的最大值,虚拟内存的最大值等。html

Resouce limit的大小能够直接影响进程的执行情况。其有两个最重要的概念:soft limit 和 hard limitlinux

struct rlimit {
rlim_t rlim_cur; /* Soft limit */
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};
soft limit是 指内核所能支持的资源上限。好比对于RLIMIT_NOFILE(一个进程能打开的最大文件数,内核默认是1024),soft limit最大也只能达到1024。对于RLIMIT_CORE(core文件的大小,内核不作限制),soft limit最大能是unlimited。
hard limit在资源中只是做为soft limit的上限。当你设置hard limit后,你之后设置的soft limit只能小于hard limit。要说明的是,hard limit只针对非特权进程,也就是进程的有效用户ID(effective user ID)不是0的进程。具备特权级别的进程(具备属性CAP_SYS_RESOURCE),soft limit则只有内核上限。shell

咱们能够来看一下下面两条命令的输出。ide

sishen@sishen:~$ ulimit -c -n -s
core file size (blocks, -c) 0
open files             (-n) 1024
stack size     (kbytes, -s) 8192
sishen@sishen:~$ ulimit -c -n -s -H
core file size (blocks, -c) unlimited
open files             (-n) 1024
stack size (kbytes, -s) unlimited.net

-H表示显示的是hard limit。从结果上能够看出soft limit和hard limit的区别。unlimited表示no limit, 即内核的最大值。unix

对于resouce limit的读取修改,有两种方法。htm

  • 使用shell内建命令ulimit
  • 使用getrlimit和setrlimit API

ulimit是改变shell的resouce limit,并达到改变shell启动的进程的resouce limit效果(子进程继承)。
usage:ulimit [-SHacdefilmnpqrstuvx [limit]]
当不指定limit的时候,该命令显示当前值。这里要注意的是,当你要修改limit的时候,若是不指定-S或者-H,默认是同时设置soft limit和hard limit。也就是以后设置时只能减不能增。因此,建议使用ulimit设置limit参数是加上-S。blog

getrlimit和setrlimit的使用也很简单,manpage里有很清楚的描述。
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
须要注意的是你在setrlimit,须要检查是否成功来判断新值有没有超过hard limit。以下例:
if (getrlimit(RLIMIT_CORE, &rlim)==0) {继承

rlim_new.rlim_cur = rlim_new.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &rlim_new)!=0) {
/* failed. try raising just to the old max */
rlim_new.rlim_cur = rlim_new.rlim_max =
rlim.rlim_max;
(void) setrlimit(RLIMIT_CORE, &rlim_new);}

}进程