Linux ulimit用法详解

Linux允许使用ulimit对进程所能消耗的资源进行限制和调整,以保证最重要的进程能够良好运行,其他进程不会过度消耗系统资源。

ulimit参数说明

使用ulimit查看系统资源

   -S 为给定资源设置软限制
   -H 设置给定资源的硬限制

   -a 报告当前所有进行的限制。
   -c 创建的核心文件的最大数量。
   -d 进程数据段的最大大小。
   -f shell创建的文件的最大大小(默认选项)
   -l 可以锁定到内存的最大大小。
   -m 最大驻留集大小。
   -n 打开文件描述符的最大数量。
   -p 管道缓冲区大小。
   -s 最大堆栈大小。
   -t 以秒为单位的最大CPU时间量。
   -u 单个用户可用的最大进程数。
   -v 进程可用的最大虚拟内存量。

示例:

$ ulimit -a

注:软限制是内核对相应资源强制执行的值,硬极限相当于软极限的上限。

配置文件

通过配置文件设置如何设置ulimit值,limits.conf是pam_limits模块的配置文件。

vi /etc/security/limits.conf

格式:

#<domain>        <type>  <item>  <value>

<domain> :

用户名;组名,带@group语法;通配符*,用于默认条目、通配符%,可以与%group语法一起使用,用于maxlogin限制。

<type> 两个值上可选值:soft 用于执行软限制,hard 强制执行硬限制。

<item> 可以是以下之一:

core - 限制核心文件大小(KB)

data - 最大数据大小(KB)

fsize - 最大文件大小(KB)

memlock - 最大锁定内存地址空间(KB)

nofile - 最大打开文件数

rss - 最大常驻内存大小(KB)

stack - 最大堆栈大小(KB)

cpu - 最大CPU时间(MIN)

nproc - 最大进程数

as - 地址空间限制(KB)

maxlogins - 此用户的最大登录次数

maxsyslogins - 系统上的最大登录次数

priority - 运行用户进程的优先级

locks - 用户可以容纳的最大文件锁数

sigpending - 待处理信号的最大数量

msgqueue - POSIX消息队列使用的最大内存(字节)

nice - 允许最大优先级提高到值:[ - 20,19]

rtprio - 最大实时优先级

诊断步骤

为了提高性能,可以将超级用户root的进程限制设置为无限制。编辑.bashrc文件并添加以下行:

# vi /root/.bashrc
ulimit -u unlimited

PAM验证模块设置

PAM验证模块/lib/security/pam_limits.so,主要是限制用户会话过程中,对各种系统资源的使用。

Domain  type item       
用户名/组名软/硬限制 项目

vi /etc/security/limits.conf

* soft noproc 11000
* hard noproc 11000
* soft nofile 4100

/proc目录

/proc系统参数

/proc/sys/fs/file-max

/proc/sys/fs/inode-max

针对整个系统的限制,proc目录中的值可以动态设置,永久生效,修改/etc/sysctl.conf文件,使用以下命令进行确认:

sysctl -p

优化案例

要处理数千个并发TCP连接,打开的文件描述符的限制

vi /etc/security/limits.conf

修改如下项

* soft nofile 51200
* hard nofile 51200

设置ulimit

ulimit -n 51200

调整内核参数

/etc/sysctl.conf

目标:

尽快重用端口和连接。

尽可能扩大队列和缓冲区。

选择TCP拥塞算法以获得大延迟和高吞吐量。

/etc/sysctl.conf示例:

fs.file-max = 51200

net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 4096

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_mem = 25600 51200 102400
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_congestion_control = hybla

验证优化结果

使用munin或其他监视工具生成TCP连接的图形。