`ulimit -a` 是一个在 Linux/Unix 系统中用于显示当前用户所有资源限制(Resource Limits)的命令。这些限制由系统管理员或用户通过 shell 配置文件(如 `~/.bashrc`、`/etc/security/limits.conf` 等)设置,用于控制系统资源的使用,防止单个进程或用户过度占用资源。
---
### **`ulimit -a` 输出示例及详细解释**
执行 `ulimit -a` 后,通常会显示如下内容(具体值因系统配置而异):
```bash
core file size (blocks, -c) unlimited
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
```
---
### **各参数详解**
1. **`core file size` (`-c`)**
- **作用**:当程序崩溃时生成的 core dump 文件的最大大小(单位为块)。
- 设置为 `unlimited` 表示不限制,`0` 表示禁用 core dump。
- *用途*:调试程序崩溃原因。
2. **`data seg size` (`-d`)**
- **作用**:进程数据段(Data Segment,存储全局变量和静态变量)的最大大小(KB)。
- *用途*:限制程序内存使用。
3. **`scheduling priority` (`-e`)**
- **作用**:进程的实时调度优先级(通常普通用户只能降低优先级,不能提高)。
4. **`file size` (`-f`)**
- **作用**:进程能创建的文件的最大大小(块)。
- *用途*:防止单个文件占用过多磁盘空间。
5. **`pending signals` (`-i`)**
- **作用**:当前用户待处理信号(Pending Signals)的最大数量。
6. **`max locked memory` (`-l`)**
- **作用**:进程能锁定的物理内存大小(KB)。锁定后内存不会被交换到磁盘。
- *用途*:实时性要求高的程序(如数据库)。
7. **`max memory size` (`-m`)**
- **作用**:进程能使用的最大物理内存(KB)。
- *注意*:Linux 中此参数通常无效,依赖 `-v`(虚拟内存)或 cgroups。
8. **`open files` (`-n`)**
- **作用**:单个进程能打开的文件描述符(File Descriptors)的最大数量。
- *用途*:高并发服务(如 Nginx、MySQL)需调高此值(默认通常为 1024)。
9. **`pipe size` (`-p`)**
- **作用**:管道(Pipe)的缓冲区大小(单位为 512 字节块)。
- 示例中 `8` 表示缓冲区大小为 `8 * 512 = 4096` 字节。
10. **`POSIX message queues` (`-q`)**
- **作用**:POSIX 消息队列的最大大小(字节)。
11. **`real-time priority` (`-r`)**
- **作用**:进程能设置的实时调度优先级上限(普通用户通常为 0)。
12. **`stack size` (`-s`)**
- **作用**:进程栈(Stack)的最大大小(KB)。
- *用途*:防止递归调用导致栈溢出。
13. **`cpu time` (`-t`)**
- **作用**:进程能使用的最大 CPU 时间(秒)。
- *用途*:限制长时间运行的进程。
14. **`max user processes` (`-u`)**
- **作用**:当前用户能创建的最大进程/线程数。
- *用途*:防止用户 fork 炸弹(如 `:(){ :|:& };:`)。
15. **`virtual memory` (`-v`)**
- **作用**:进程能使用的最大虚拟内存(KB)。
- *用途*:综合限制内存使用(包括交换分区)。
16. **`file locks` (`-x`)**
- **作用**:进程能持有的文件锁的最大数量。
---
### **常见操作**
1. **临时修改限制**(仅对当前会话有效):
```bash
ulimit -n 65535 # 将打开文件数改为 65535
```
2. **永久修改限制**:
- 编辑 `/etc/security/limits.conf`,例如:
```
* soft nofile 65535
* hard nofile 65535
```
- 或修改 shell 配置文件(如 `~/.bashrc`)添加 `ulimit -n 65535`。
3. **查看特定限制**:
```bash
ulimit -n # 查看打开文件数限制
ulimit -u # 查看用户进程数限制
```
---
### **注意事项**
- `hard limit`(硬限制)是上限,普通用户无法自行调高;`soft limit`(软限制)可临时调整。
- 部分限制需 root 权限修改(如 `/etc/security/limits.conf`)。
- 系统级限制可能受内核参数影响(如 `/proc/sys/fs/file-max` 控制全局文件描述符数)。
通过合理配置 `ulimit`,可以优化系统稳定性并防止资源滥用。
`/etc/security/limits.conf` 是 Linux 系统中用于 **配置用户或用户组的资源限制(Resource Limits)** 的核心文件。它允许系统管理员控制用户进程可以使用的系统资源(如打开文件数、CPU 时间、内存等),防止单个用户或进程耗尽系统资源。
---
## **文件位置**
```
/etc/security/limits.conf
```
部分系统可能还会加载 `/etc/security/limits.d/` 目录下的额外配置文件(优先级更高)。
---
## **文件格式**
每行定义一个限制,格式如下:
```
<domain> <type> <item> <value>
```
或使用 `@` 表示组:
```
@<groupname> <type> <item> <value>
```
### **参数详解**
| 字段 | 说明 |
|------------|----------------------------------------------------------------------|
| **`<domain>`** | 生效对象:<br>• `username` – 单个用户<br>• `@groupname` – 用户组<br>• `*` – 所有用户 |
| **`<type>`** | 限制类型:<br>• `soft` – 软限制(用户可自行修改,但不能超过硬限制)<br>• `hard` – 硬限制(仅 root 可修改)<br>• `-` – 同时设置 `soft` 和 `hard` |
| **`<item>`** | 限制的资源类型(见下方 [支持的资源项](#支持的资源项)) |
| **`<value>`** | 限制值,可以是数字或 `unlimited`(无限制) |
---
## **支持的资源项(`<item>`)**
| 资源项 | 说明 | 对应 `ulimit` 参数 |
|-----------------------|----------------------------------------------------------------------|--------------------|
| `nofile` | 单个进程能打开的最大文件描述符数(Open Files) | `-n` |
| `nproc` | 用户能创建的最大进程/线程数(Max User Processes) | `-u` |
| `data` | 进程数据段的最大大小(KB)(Data Segment Size) | `-d` |
| `stack` | 进程栈的最大大小(KB)(Stack Size) | `-s` |
| `core` | Core Dump 文件的最大大小(KB)(Core File Size) | `-c` |
| `rss` | 进程最大常驻内存集(Resident Set Size, KB)(部分系统不支持) | - |
| `memlock` | 进程能锁定的物理内存大小(KB)(Locked Memory) | `-l` |
| `cpu` | 进程能使用的最大 CPU 时间(分钟)(CPU Time) | `-t` |
| `fsize` | 进程能创建的文件的最大大小(KB)(File Size) | `-f` |
| `maxlogins` | 用户同时登录的最大会话数 | - |
| `maxsyslogins` | 系统同时登录的总会话数上限 | - |
| `priority` | 进程的优先级(Nice 值,范围 `-20` 到 `19`) | - |
| `locks` | 用户能持有的文件锁的最大数量 | `-x` |
| `sigpending` | 待处理信号(Pending Signals)的最大数量 | `-i` |
| `msgqueue` | POSIX 消息队列的最大大小(KB) | `-q` |
| `nice` | 进程能设置的最大 Nice 值(部分系统支持) | `-e` |
---
## **示例配置**
### **1. 限制所有用户的最大进程数**
```ini
* hard nproc 5000
* soft nproc 2000
```
- 硬限制:5000 个进程(用户无法超越)
- 软限制:2000 个进程(用户可临时调整,但不超过硬限制)
### **2. 限制用户 `nginx` 的最大打开文件数**
```ini
nginx hard nofile 65535
nginx soft nofile 32768
```
- 适用于运行 Nginx 服务的用户,防止 `Too many open files` 错误。
### **3. 限制组 `developers` 的内存使用**
```ini
@developers hard rss 1000000
```
- 限制 `developers` 组的进程常驻内存不超过 1GB(1000000 KB)。
### **4. 禁止普通用户生成 Core Dump**
```ini
* hard core 0
```
- 安全加固场景下禁用 Core Dump,防止敏感信息泄露。
---
## **生效方式**
1. **立即生效**:
- 重新登录用户会话。
- 通过 `pam_limits` 模块(已在大多数 Linux 登录流程中默认加载)。
2. **验证限制**:
```bash
ulimit -a # 查看当前用户的所有限制
ulimit -n -H # 查看硬限制的打开文件数
ulimit -n -S # 查看软限制的打开文件数
```
3. **系统级限制**:
- `limits.conf` 仅控制用户级限制,全局限制(如 `fs.file-max`)需修改 `/etc/sysctl.conf`:
```bash
sysctl -w fs.file-max=100000
```
---
## **注意事项**
1. **优先级规则**:
- `/etc/security/limits.d/*.conf` 的配置会覆盖 `limits.conf`。
- 用户级别的限制优先于全局(`*`)限制。
2. **`nproc` 的特殊性**:
- 在 Linux 上,`nproc` 限制的是 **用户的总线程数**(包括轻量级进程 LWP)。
- 如果达到限制,`fork()` 或 `pthread_create()` 会失败,报 `Cannot allocate memory`。
3. **`nofile` 与系统全局限制**:
- 即使 `limits.conf` 允许 `nofile=65535`,仍需确保内核参数 `fs.file-max` 足够大:
```bash
echo "fs.file-max = 100000" >> /etc/sysctl.conf
sysctl -p
```
4. **SSH 环境**:
- 通过 SSH 登录时,需确保 `/etc/pam.d/sshd` 包含:
```
session required pam_limits.so
```
---
## **总结**
- `limits.conf` 是管理 **用户级资源限制** 的核心文件。
- 合理配置可提升系统稳定性(如防止 `fork 炸弹` 或 `文件描述符耗尽`)。
- 修改后需重新登录或重启服务生效。
如果需要更细粒度的控制(如容器或进程组),可结合 `cgroups`(Control Groups)使用。