ulimit

`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)使用。

  

posted on 2025-06-20 21:02  吃草的青蛙  阅读(17)  评论(0)    收藏  举报

导航