确认Swap不足导致“Killed”需两条命令交叉验证:dmesg -O | grep -i "killed process"查OOM日志,swapon --show或free -m | grep Swap查Swap是否启用且total>0;未启用则按三硬条件建swap文件:fallocate/dd创建、chmod 600、mkswap+swapon。

怎么确认是 Swap 不足导致的 Killed
终端只显示 Killed,没报错行、没堆栈,基本就是 Linux OOM Killer 动的手——不是 Composer 崩溃,是系统内存彻底见底后强制杀掉最耗内存的 php 进程。别靠猜,用两条命令交叉验证:
运行 dmesg -O | grep -i "killed process",输出里有 Out of memory: Kill process 就实锤了;
再跑 swapon --show 或 free -m | grep Swap,如果没输出或 total 是 0,说明 Swap 确实没启用。
快速建一个能用的 swap 文件
低配环境(比如 1GB 内存的 VPS 或 Docker 容器)缺 Swap 是触发 Killed 的最常见原因。建 swap 要同时满足三个硬条件,漏一条就白忙活:
• 用 fallocate -l 2G /swapfile(推荐)或 dd if=/dev/zero of=/swapfile bs=1M count=2048 创建文件(1GB 物理内存建议 1G swap,2GB 可设 2G)
• 必须执行 sudo chmod 600 /swapfile——权限不是 600,swapon 会静默失败
• 执行 sudo mkswap /swapfile && sudo swapon /swapfile,顺序不能颠倒
验证是否生效:swapon --show 应有输出,且 free -m 中 Swap 行的 total > 0
为什么 swap 启用了还是被 kill
常见陷阱集中在路径和权限上:
• /swapfile 不能放在 /tmp、/var/tmp 或 Docker volume 挂载点下——这些目录常带 noexec 或 nodev 选项,swapon 会拒绝启用
• 容器环境里,/swapfile 放在 overlayfs 层(如默认 rootfs)下可能被内核忽略,推荐改用 /var/_swap_/swapfile
• 某些旧版 ext3 或 NFS 文件系统不支持 fallocate,换 dd 即可,但别用 truncate——它创建的文件不满足 swap 要求
• 忘记 sudo chown root:root /swapfile,非 root 所有者也可能被内核跳过
比加 swap 更有效的降内存操作
Swap 是兜底手段,不是正解。它在 SSD 上加速写入磨损,在 HDD 上会让 composer install 卡十几分钟不动。真正压内存峰值的操作更直接有效:
• 加 --no-dev:跳过 require-dev 解析和 autoload-dev 生成,省掉 30%–50% 内存
• 加 --optimize-autoloader(或简写 -o):生成静态 classmap,避免运行时扫描
• 加 --prefer-dist:优先下 zip 包而非 git clone,减少进程开销
• 设环境变量 COMPOSER_MEMORY_LIMIT=512M(不建议设 -1,低配机上反而容易触发 OOM)
• 升级到 Composer 2.x:依赖求解器重写后内存更可控,老版本 1.x 在 Laravel/Docker 场景下极易爆掉
真正容易被忽略的是:swap 文件建了、swapon 也跑了,但 free -m 里 Swap 还是 0——这时候别折腾 Composer 参数,先查 ls -l /swapfile 和 mount | grep "$(dirname /swapfile)",90% 是权限或挂载点限制卡住了。


















