ulimit 是Linux系统中用于控制用户进程资源限制的shell内置命令。它可以限制单个用户或进程对系统资源的使用,防止某个进程或用户消耗过多资源而影响系统稳定性。ulimit设置是per-process(每个进程)的,并且可以通过配置文件永久设置。
ulimit [选项] [限制值]
| 选项 | 说明 |
|---|---|
-a |
显示当前所有资源限制 |
-b |
套接字缓冲区大小 |
-c |
核心文件大小(KB) |
-d |
进程数据段大小(KB) |
-e |
调度优先级(nice值) |
-f |
文件大小(块) |
-i |
挂起的信号数量 |
-l |
可锁定内存大小(KB) |
-m |
常驻内存大小(KB) |
-n |
打开文件描述符的数量 |
-p |
管道缓冲区大小(512字节块) |
-q |
POSIX消息队列的字节数 |
-r |
实时调度优先级 |
-s |
栈大小(KB) |
-t |
CPU时间(秒) |
-u |
单个用户的最大进程数 |
-v |
虚拟内存大小(KB) |
-x |
文件锁数量 |
-H |
设置硬限制(硬限制只能由root用户提高) |
-S |
设置软限制(软限制可以增加到硬限制) |
ulimit -a
输出示例:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7873
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7873
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
设置当前shell会话的文件描述符限制:
ulimit -n 4096
将当前会话的打开文件描述符限制设置为4096个。
ulimit -c unlimited
允许生成任意大小的核心转储文件。
ulimit -u 2048
将用户最大进程数限制设置为2048个。
ulimit -s 16384
将栈大小限制设置为16MB。
设置硬限制(需要root权限):
sudo ulimit -Hn 65536
ulimit -Sn 32768
硬限制设置为65536个文件描述符,软限制设置为32768个。
#!/bin/bash
# 在脚本开始时设置资源限制
ulimit -n 2048
ulimit -u 512
# 运行需要资源限制的程序
./my_program
-H选项设置ulimit -Hn 65536-S选项设置ulimit -Sn 1024| 配置文件 | 描述 | 作用 |
|---|---|---|
/etc/security/limits.conf |
系统级资源限制配置文件 | 设置用户和组的资源限制 |
/etc/security/limits.d/ |
资源限制配置目录 | 放置额外的限制配置文件 |
~/.bashrc |
用户bash配置文件 | 设置用户会话的资源限制 |
/etc/profile |
系统级shell配置文件 | 设置全局shell环境 |
/etc/systemd/system.conf |
systemd系统配置 | 设置系统级资源限制(systemd系统) |
/etc/security/limits.conf 配置示例:
# 格式:<domain> <type> <item> <value>
# 为所有用户设置核心文件大小
* soft core unlimited
* hard core unlimited
# 设置www-data用户的最大进程数
www-data soft nproc 4096
www-data hard nproc 8192
# 设置mysql组的文件描述符限制
@mysql soft nofile 65536
@mysql hard nofile 65536
# 设置所有用户的最大进程数
* soft nproc 4096
* hard nproc 8192
# 设置root用户不受限制
root soft nproc unlimited
root hard nproc unlimited
# 设置最大内存锁定限制
* soft memlock unlimited
* hard memlock unlimited
# 设置栈大小
* soft stack 8192
* hard stack 16384
注意:修改limits.conf后需要重新登录才能生效。
| 限制项 | 选项 | 描述 | 推荐值 |
|---|---|---|---|
| 打开文件数 | -n (nofile) |
同时打开的文件描述符数量 | 4096-65536(服务器更高) |
| 最大进程数 | -u (nproc) |
用户可创建的最大进程数 | 4096-8192 |
| 核心文件大小 | -c (core) |
核心转储文件的最大大小 | unlimited(调试)或0(生产) |
| 栈大小 | -s (stack) |
进程栈的最大大小 | 8192-32768 KB |
| CPU时间 | -t (cpu) |
进程可用的最大CPU时间 | unlimited(默认) |
| 文件大小 | -f (fsize) |
进程可创建的文件最大大小 | unlimited(默认) |
| 虚拟内存 | -v (as) |
进程可用的虚拟内存大小 | unlimited(默认) |
| 常驻内存 | -m (rss) |
进程可用的常驻内存大小 | unlimited(默认) |
场景:提高Web服务器的并发连接数
# 在limits.conf中设置
www-data soft nofile 65536
www-data hard nofile 65536
# 或者在启动脚本中设置
ulimit -n 65536
./start_webserver.sh
场景:优化数据库连接数
# MySQL数据库配置
mysql soft nofile 65536
mysql hard nofile 65536
mysql soft nproc 16384
mysql hard nproc 32768
场景:调试程序生成核心转储文件
# 允许生成核心文件
ulimit -c unlimited
# 运行可能崩溃的程序
./debug_program
# 核心文件通常生成在当前目录或/var/lib/systemd/coredump/
场景:防止拒绝服务攻击
# 限制普通用户的资源使用
* soft nproc 1024
* hard nproc 2048
* soft nofile 1024
* hard nofile 2048
ulimit -aulimit -nlsof | wc -lcat /proc/[pid]/limitsulimit -n 4096; ./program/etc/security/limits.confsysctl -a | grep file-maxulimit -n; ulimit -Sn; ulimit -Hnulimit -n 65536并修改limits.confulimit -u 8192ulimit -c unlimitedfs.file-max在systemd服务文件中设置资源限制:
# /etc/systemd/system/myservice.service
[Service]
# 资源限制设置
LimitNOFILE=65536
LimitNPROC=8192
LimitCORE=infinity
LimitMEMLOCK=infinity
LimitFSIZE=infinity
LimitDATA=infinity
LimitSTACK=8388608
LimitCPU=infinity
LimitAS=infinity
LimitRSS=infinity
LimitLOCKS=infinity
LimitSIGPENDING=7873
LimitMSGQUEUE=819200
LimitNICE=0
LimitRTPRIO=0
LimitRTTIME=infinity
# 重新加载配置并重启服务
# systemctl daemon-reload
# systemctl restart myservice
| 相关命令 | 说明 |
|---|---|
sysctl |
配置内核运行时参数 |
prlimit |
查看和设置进程资源限制 |
nice / renice |
设置和调整进程优先级 |
lsof |
列出打开的文件 |
ps |
查看进程状态 |
top / htop |
查看系统资源和进程 |
sudo vim /etc/security/limits.conf
添加以下内容:
nginx soft nofile 65536
nginx hard nofile 65536
nginx soft nproc 8192
nginx hard nproc 16384
nginx soft core unlimited
nginx hard core unlimited
sudo systemctl edit nginx.service
添加以下内容:
[Service]
LimitNOFILE=65536
LimitNPROC=8192
sudo systemctl daemon-reload
sudo systemctl restart nginx
# 切换到nginx用户
sudo -u nginx bash
# 查看限制
ulimit -n
ulimit -u