linux limits资源限制,在Linux下的进程资源的限制(struct rlimit)详解

在Linux系统中,Resouce limit指在一个进程的执行过程中,它所能得到的资源的限制,比如进程的core

file的最大值,虚拟内存的最大值等。

Resouce limit的大小可以直接影响进程的执行状况。其有两个最重要的概念:soft limit 和

hard limit。

struct rlimit {

rlim_t rlim_cur;

rlim_t rlim_max;

}; 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则只有内核上限。

我们可以来看一下下面两条命令的输出。

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

-H表示显示的是hard limit。从结果上可以看出soft

limit和hard limit的区别。unlimited表示no limit, 即内核的最大值。

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

使用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。

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) {

rlim_new.rlim_cur = rlim_new.rlim_max =

rlim.rlim_max;

(void) setrlimit(RLIMIT_CORE, &rlim_new);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值