Linux Note – 通过ulimit和PAM来限制资源

来源:互联网 发布:dnf几分钟网络连接中断 编辑:程序博客网 时间:2024/06/06 01:12

ulimit是Shell内建指令,可用来控制shell进程或者shell子进程使用的系统资源。限制分为硬限制和软限制两种:
-H 设置硬资源限制,硬资源限制用于控制软限制。限定一旦设置只有root用户可以增加硬限制,普通用户只能减少自己的硬限制大小。
-S 设置弹性资源限制,弹性限制用于限制具体的用户或者进程。设置后普通用户可以增加,但是不能超过硬限制大小。
如果不指定-S或者-H,那么弹性资源限制和硬限制将同时设置。

例如:

具体资源限制类别分为:
-a 显示当前所有的limit信息。
-c core file size, 最大的转储文件大小(blocks)。如果指定为0,将不会产生core文件。
-d data seg size, 进程最大的数据段的大小(KB)。
-e scheduling priority, 进程优先级的限制:这个值对root不起作用。
-f file size, 进程可以创建的文件最大值(blocks)。
-i pending signals, 进程最大挂起/阻塞的信号量数量。
-l max locked memory, 最大可加锁的内存的大小(KB)。这个值对root用户不起作用,锁定内存的操作由mlock()函数提供,避免swap in/swap out。
-v virtual memory,进程可使用的虚拟内存上限,单位为KB。
-m max memory size, 最大内存大小(KB)。这里指的是最大物理内存
-n open files, 最大可以在进程中打开的文件数量。
-p pipe size, 管道缓冲区的大小(512 Bytes)。这个值在Linux下固定为8*512bytes。
-s stack size, 线程堆栈的上限(KB)。
-t CPU time, CPU使用时间的上限(s)。 当CPU超过这个限制时,会被KILL。
-u max user processes, 用户最多可开启的程序数目。 达到限制后fork和vfork会失败。

使用ulimit命令可以一次设置多个限制,例如ulimit -Hn 2400 -s 1024
在Oracle Enterprise Linux 6上,默认值为:

0. pam_limits
如果要设置ulimit资源限制永久生效,需要把修改写入/etc/security/limits.conf配置文件中。该配置文件是 Linux PAM(插入式认证模块,Pluggable Authentication Modules)中 pam_limits.so 的配置文件,这样通过ssh登录时会加载limit.conf配置,从而修改登录用户的ulimit配置。所以要使用pam_limits.so ,需要先在/etc/pam.d/system-auth中设置使用该模块,
vim /etc/pam.d/system-auth
session required pam_limits.so
而在 /etc/pam.d/sshd和/etc/pam.d/gdm中,都include了该配置文件。
session include system-auth
— required和requisite是验证的必要条件,二者的结果一样的。

然后配置/etc/security/limits.conf
格式为: 
domain可以是用户或者组。如果是组的话,需要加上@符号;可以使用通配符*和%。
type可以是hard或者soft。
item是资源类别:
# – core – limits the core file size (KB)
# – data – max data size (KB)
# – fsize – maximum filesize (KB)
# – memlock – max locked-in-memory address space (KB)
# – nofile – max number of open files
# – rss – max resident set size (KB)
# – stack – max stack size (KB)
# – cpu – max CPU time (MIN)
# – nproc – max number of processes
# – as – address space limit (KB)
# – maxlogins – max number of logins for this user
# – maxsyslogins – max number of logins on the system
# – priority – the priority to run user process with
# – locks – max number of file locks the user can hold
# – sigpending – max number of pending signals
# – msgqueue – max memory used by POSIX message queues (bytes)
# – nice – max nice priority allowed to raise to values: [-20, 19]
# – rtprio – max realtime priority

例如:
所有用户都不产生core dump:
* soft core 0
ftp用户不能登录(创建shell进程)
ftp hard nproc 0
student组最大允许4个登录。
@student – maxlogins 4

1. Max locked memory
有些应用程序(如Oracle),要将内存pin到物理内存页框中避免换入/换出以提高性能。Oracle在安装的时候就需要在limit.conf中将memlock设定为一个较大的值(大于memory_target大小)
需要使用mlock()和mlockall()系统调用来实现:
mlock, munlock, mlockall, munlockall – lock and unlock memory
SYNOPSIS
#include 
int mlock(const void *addr, size_t len);
int munlock(const void *addr, size_t len);
int mlockall(int flags);
int munlockall(void);
测试:

[oracle@debugo ~]$ gcc mlock.c -o mlock.o
[oracle@debugo ~]$ vim mlock.c
[oracle@debugo ~]$ ./mlock.o
Success to lock stack mem at: 0x7fff64e72e40, len=32768
Success to unlock stack mem at: 0x7fff64e72e40, len=32768

[oracle@debugo ~]$ ulimit -Sl 4
[oracle@debugo ~]$ ./mlock.o
mlock: : Cannot allocate memory #软限制设置为4B时,内存分配失败,

2. Virtual memory
virtual memory (kbytes, -v) default : unlimited
相当于limits.conf中的as和cgroup中的memory.limit_in_bytes.

下面编译并验证这个virtual memory的限制:

3. Scheduling priority
在LINUX和AIX等POSIX系统中,优先级数值越小表示优先级越高,我们可以通过nice()系统调用函数或者nice命令,使用[-20, 19]中的一个数值来修改进程的nice值。这个值对root不起作用。
新的优先级 PRI(new)=PRI(old)+nice。
所以,nice值为负的时,新的优先级比原来的优先级要高。通过top命令的NI列可以看出,由于init进程的优先级0,所以它的子孙进程大部分都是0,只有少部分的内核模块进程设置为-19。
而Scheduling priority的取值范围是0-40,对应可以设定nice值的下限是0到负20。(无论何种优先级,用户都可以降低进程的优先级)
下面进行简单测试:
首先在/etc/security/limits.conf中设定:
* hard nice -20
* soft nice -20
登录任意用户(Scheduling priority的设置对root无效)

登录一个非root用户

4. CPU time
cpu time (seconds, -t) unlimited

下面编译测试:

5. Open files
-n open files, 最大可以在进程中打开的文件数量。

当打开文件限制为3时,cat程序打开了stdin, stdout, stderr,但是需要动态加载一个libc.so失败。

当打开文件限制为4时,cat程序功能正常,但是管道创建失败

当打开文件限制为5时,管道创建正常,不会有错误提示了。

^^

0 0
原创粉丝点击