ubuntu提升stack size(栈空间)
你当前的 stack size(栈大小) 是:
stack size (kbytes, -s) 8192
即 8192 KB = 8 MB,这是 Linux 系统的默认用户栈大小限制。
✅ 如何将 stack size 配置为最高(或更大)?
🔹 方法 1:临时提升(当前会话有效)
# 设置为无限制(unlimited)
ulimit -s unlimited
# 或设置为具体值(例如 65536 KB = 64 MB)
ulimit -s 65536
✅ 立即生效,但仅对当前 shell 及其子进程有效,退出后失效。
🔹 方法 2:永久生效(系统级配置)
步骤 1:编辑 /etc/security/limits.conf
sudo nano /etc/security/limits.conf
添加以下行(替换 username 为实际用户,如 shuncom 或用 * 表示所有用户):
# 用户级设置(推荐指定用户)
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 是否包含:
session required pam_limits.so
Ubuntu 默认已启用,通常无需修改。
步骤 3:重新登录用户
- 修改
limits.conf后必须完全退出并重新登录(或重启)才能生效。 - 不能只开新终端!
🔹 方法 3:针对 systemd 服务(如 PHP-FPM、Nginx)
如果你的应用是通过 systemd 启动的(如 php8.3-fpm.service),需单独配置:
sudo systemctl edit php8.3-fpm
添加:
[Service]
LimitSTACK=infinity
然后重载并重启:
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)
🔍 验证是否生效
# 重新登录后执行
ulimit -s
应输出:
unlimited
或你设置的具体值(如 65536)。
🛠️ 推荐配置(平衡安全与需求)
| 场景 | 建议值 |
|---|---|
| 普通应用 | 保持默认 8192(8MB) |
| 深度递归/大型局部变量 | 65536(64MB) |
| 科学计算/HPC | unlimited(需监控内存) |
💡 除非明确需要,否则不要设为
unlimited。优先修复代码中的栈使用问题。
✅ 总结
| 目标 | 命令/配置 |
|---|---|
| 临时提升 | ulimit -s unlimited |
| 永久用户级 | /etc/security/limits.conf + 重新登录 |
| systemd 服务 | systemctl edit <service> + LimitSTACK=infinity |
执行后,你的程序将能使用更大的栈空间,避免因栈溢出导致的崩溃(如 Segmentation fault 或 stack smashing detected)。
No Comments