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:单一用户所能创建的最大进程数。
不断学习中。。。