# ubuntu提升stack size（栈空间）

你当前的 **stack size（栈大小）** 是：

```
stack size (kbytes, -s) 8192

```

即 **8192 KB = 8 MB**，这是 Linux 系统的**默认用户栈大小限制**。

---

## ✅ 如何将 `stack size` 配置为最高（或更大）？

### 🔹 方法 1：临时提升（当前会话有效）

```bash
# 设置为无限制（unlimited）
ulimit -s unlimited

# 或设置为具体值（例如 65536 KB = 64 MB）
ulimit -s 65536

```

> ✅ 立即生效，但**仅对当前 shell 及其子进程有效**，退出后失效。

---

### 🔹 方法 2：永久生效（系统级配置）

#### 步骤 1：编辑 `/etc/security/limits.conf`

```bash
sudo nano /etc/security/limits.conf

```

添加以下行（替换 `username` 为实际用户，如 `shuncom` 或用 `*` 表示所有用户）：

```conf
# 用户级设置（推荐指定用户）
shuncom    soft    stack    unlimited
shuncom    hard    stack    unlimited

# 或全局设置（谨慎！）
*          soft    stack    unlimited
*          hard    stack    unlimited

```

> 📌 `soft` = 当前生效值，`hard` = 允许用户自行提升的最大值  
> `unlimited` 表示无限制（实际受虚拟内存总量约束）

#### 步骤 2：确保 PAM 启用 limits 模块

检查 `/etc/pam.d/common-session` 是否包含：

```conf
session required pam_limits.so

```

Ubuntu 默认已启用，通常无需修改。

#### 步骤 3：**重新登录用户**

- 修改 `limits.conf` 后必须**完全退出并重新登录**（或重启）才能生效。
- 不能只开新终端！

---

### 🔹 方法 3：针对 systemd 服务（如 PHP-FPM、Nginx）

如果你的应用是通过 `systemd` 启动的（如 `php8.3-fpm.service`），需单独配置：

```bash
sudo systemctl edit php8.3-fpm

```

添加：

```ini
[Service]
LimitSTACK=infinity

```

然后重载并重启：

```bash
sudo systemctl daemon-reload
sudo systemctl restart php8.3-fpm

```

> ✅ 这样可确保服务进程获得更大的栈空间。

---

## ⚠️ 重要注意事项

### 1. **`unlimited` 并非真正无限**

- 实际受限于： 
    - 系统可用虚拟内存（`ulimit -v`）
    - 内核参数 `vm.max_map_count`
    - 物理内存 + swap
- 在 64 位系统上，通常可安全设为 `unlimited`

### 2. **盲目增大栈可能掩盖程序 bug**

- 栈溢出（stack overflow）通常是**递归过深**或**局部变量过大**（如 `char buf[10*1024*1024]`）导致
- **正确做法**： 
    - 将大数组改为堆分配（`malloc` / `new`）
    - 优化递归为迭代
    - 使用工具（如 Valgrind）检测内存问题

### 3. **某些程序硬编码栈大小**

- 如 Java、Python 等虚拟机语言有自己的栈管理，不受 `ulimit -s` 影响
- 需在其内部配置（如 JVM 的 `-Xss`）

---

## 🔍 验证是否生效

```bash
# 重新登录后执行
ulimit -s

```

应输出：

```
unlimited

```

或你设置的具体值（如 `65536`）。

---

## 🛠️ 推荐配置（平衡安全与需求）

<table id="bkmrk-%E5%9C%BA%E6%99%AF-%E5%BB%BA%E8%AE%AE%E5%80%BC-%E6%99%AE%E9%80%9A%E5%BA%94%E7%94%A8-%E4%BF%9D%E6%8C%81%E9%BB%98%E8%AE%A4-819"><thead><tr><th>场景</th><th>建议值</th></tr></thead><tbody><tr><td>普通应用</td><td>保持默认 `8192`（8MB）</td></tr><tr><td>深度递归/大型局部变量</td><td>`65536`（64MB）</td></tr><tr><td>科学计算/HPC</td><td>`unlimited`（需监控内存）</td></tr></tbody></table>

> 💡 **除非明确需要，否则不要设为 `unlimited`**。优先修复代码中的栈使用问题。

---

## ✅ 总结

<table id="bkmrk-%E7%9B%AE%E6%A0%87-%E5%91%BD%E4%BB%A4%2F%E9%85%8D%E7%BD%AE-%E4%B8%B4%E6%97%B6%E6%8F%90%E5%8D%87-ulimit"><thead><tr><th>目标</th><th>命令/配置</th></tr></thead><tbody><tr><td>临时提升</td><td>`ulimit -s unlimited`</td></tr><tr><td>永久用户级</td><td>`/etc/security/limits.conf` + 重新登录</td></tr><tr><td>systemd 服务</td><td>`systemctl edit <service>` + `LimitSTACK=infinity`</td></tr></tbody></table>

执行后，你的程序将能使用更大的栈空间，避免因栈溢出导致的崩溃（如 `Segmentation fault` 或 `stack smashing detected`）。