Linux系统的资源使用限制

  1、getrlimit()和setrlimit()

#include <sys/resource.h>
// 获取或设置指定资源的使用限制
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

  每种资源都有相应的软限制和硬限制,如以下结构所定义的:

struct rlimit {
    rlim_t rlim_cur;  // 软限制。任何进程可将它设置为0~rlim_max
    rlim_t rlim_max;  // 硬限制(软限制的上限)
};

  普通进程只能不可逆地降低它的硬限制(且不能小于软限制)。超级用户进程或具有CAP_SYS_RESOURCE能力的进程可以随意改变它的两个限制值。

  RLIM_INFINITY值表示在一个资源上没有使用限制。在某些系统实现上,rlim_t是8字节无符号整数,而RLIM_INFINITY就是rlim_t类型的最大值。

  resource参数的常用值有:

  RLIMIT_AS:进程虚拟内存(地址空间,Address Space)的最大字节长度。该限制会影响brk()、mmap()和mremap()等。

  RLIMIT_CORE:core文件的最大字节长度。超出这个大小的core文件会被截短。指定0则表示不产生core文件。

  RLIMIT_CPU:CPU时间的使用限制(秒)。进程达到软限制时,会收到一个SIGXCPU信号(默认会终止进程。但进程可以捕获该信号)。如果进程继续消耗CPU时间,它会每秒收到一个SIGXCPU信号,直到达到硬限制,并接收到SIGKILL信号(不同的实现在此处可能会有差别)。

  RLIMIT_DATA:进程数据段(初始化数据段、未初始化数据段和堆)的最大字节长度。该限制会影响brk()和sbrk()等。

  RLIMIT_FSIZE:进程所能创建的文件的最大字节长度。

  RLIMIT_LOCKS:进程可创建的flock()锁和fcntl()租借锁的总数(租借锁是Linux特有的:fcntl()可通过F_SETLEASE命令对文件加读或写的租借锁。当另一个进程尝试打开或截短该文件而产生冲突时,内核会通过信号通知持有租借锁的进程。后者应当对此作出响应,如flush缓冲区或移除租借锁等)。

  RLIMIT_MEMLOCK:进程使用mlock()能够锁定在RAM中的最大字节长度(防止被换出到交换分区。内存的锁定和解锁以页为单位)。该限制会影响mlock()、mlockall()和mmap()等。

  RLIMIT_MSGQUEUE:调用进程的实际用户所能分配的Posix消息队列的最大字节长度。

  RLIMIT_NOFILE:进程所能打开(open()、pipe()、socket()等)的文件描述符的最大值加1。注意,进程间的文件描述符是独立的。超出该限制会抛出EMFILE错误。

  RLIMIT_NPROC:调用进程的实际用户所能创建进程(在Linux上,更准确的说法是线程)的最大数目。超出该限制时,fork()会失败并抛出EAGAIN错误。

  RLIMIT_STACK:进程的栈的最大字节长度。超出该限制会收到SIGSEGV信号。

 

  2、ulimit:获取或设置指定资源的使用限制。

  进程的资源限制通常是在系统初始化时由init进程建立的,然后由每个后续进程继承。这就意味着为了影响一个用户的所有后续进程,需要将资源限制的设置构造在shell之中(如bash中的ulimit)。

  1)常用选项:-H:指定硬限制,一般与其他选项一起使用;-S:指定软限制,一般与其他选项一起使用;-a:列出所有的限制值;-c:core文件的最大大小;-f:在此shell上可建立的文件的最大大小;-d:进程数据段的最大大小;-l:可锁定内存的最大大小;-t:可用的最大CPU时间;-u:单一用户所能创建的最大进程数。

 

 

 

不断学习中。。。

你可能感兴趣的:(linux)