
1. 低配云服务器频繁 OOM 的现场还原云服务器内存不足这件事最烦人的地方在于它往往不是「慢慢变卡」而是毫无征兆地把你踢下线。我遇到过最典型的一次一台 2 核 2G 的机器上跑着 Node 服务加一个 MySQL白天还好一到晚上跑构建任务SSH 直接卡死重新连上去发现vscode-server被内核杀掉了make跑到一半进程消失日志里躺着Out of memory: Killed process。这就是 Linux 的 OOM Killer 在干活——当物理内存和可用缓存都撑不住时内核会挑一个「最占内存」的进程直接杀掉优先保命。要理解 Swap 分区为什么能救急得先知道 Linux 的内存回收机制。物理内存不是用完才回收的内核一直在做几件事把不活跃的页缓存page cache释放掉、把匿名页进程堆栈数据在压力大时换出到磁盘。Swap 就是那块「换出目的地」。当内存吃紧内核把一部分暂时不用的内存页写到 Swap腾出物理内存给正在跑的关键进程。代价是磁盘 IO 变慢但换来的是进程不被杀、SSH 还能连上。所以 Swap 不是性能优化是缓冲层——它让你在内存峰值时活下来而不是当场暴毙。适合谁看这篇手里有 1G、2G、4G 低配云服务器跑 Web 服务、编译任务、数据库、爬虫或者开发环境经常看到free -h里 available 只剩几十兆、dmesg里出现 OOM 记录的人。如果你用的是 8G 以上且负载稳定Swap 意义不大但低配机器上加一层 Swap 往往能把「每天挂一次」变成「基本稳定」。下面我从检查现状开始一步步给出可复制的命令最后再聊怎么用 TaoToken 统一管理多台服务器的 API 调用凭据省得每台机器都去翻配置文件。先说清楚一个前提Swap 是权宜之计不是终极方案。磁盘读写比内存慢几个数量级如果应用长期内存溢出加 Swap 只会让它变慢而不是变好最终还是得升配或优化代码。但在预算有限、又不想半夜被报警叫醒的阶段Swap 是性价比最高的一招。2. TaoToken 前置多机凭据统一管理减少逐台配置在动手配 Swap 之前先解决一个容易被忽略的运维成本问题。低配服务器往往不止一台——你可能有一台跑 API 服务、一台跑定时任务、一台做开发环境。每台机器上如果都散落着各种大模型 API Key、Base URL、模型 ID改一次配置就要 SSH 登录每台逐个改时间全耗在重复劳动上。我试过最笨的办法就是拿个小本子记哪台机器配了哪个 Key结果换 Key 的时候漏了一台那台机器上的任务默默报 401排查了半天。TaoToken 在这里的作用是提供一个统一的凭据入口。你可以在控制台里集中管理 API Key各台服务器通过同一个 Base URL 去调用不用在每台机器上维护不同的密钥副本。对于跑在低配机器上的轻量 Agent、定时脚本、代码补全工具来说这意味着配置一次、多机复用换 Key 时只改一处。具体来说TaoToken 的 API 入口是https://taotoken.net/api兼容 OpenAI 风格的调用方式。你需要在控制台创建 API Key然后在每台服务器的环境变量或配置文件里引用它。模型 ID 按你实际使用的填比如对话类、代码类各有对应的模型标识。这里的关键是Base URL、API Key、Model ID 三件套要在每台机器上保持一致这样迁移和排障时不会因为某台机器用了旧地址而出现诡异报错。如果你用的是 Claude Code 这类编码工具TaoToken 也提供了对应的接入方式把 Base URL 指向统一入口即可不用每台机器单独配 Anthropic 的凭据。对于长期跑编码任务或 Agent 的场景可以考虑 Coding Plan把调用额度集中管理避免多台机器各自计费、账单分散。这一步看起来和 Swap 无关但实际运维中它们是同一类问题低配服务器的资源内存、凭据都需要集中管理而不是散落各处。内存靠 Swap 兜底凭据靠 TaoToken 统一两者配合才能让多台小机器稳定干活。配好凭据后我们再回到内存本身开始动手加 Swap。3. 可复制配置fdisk/mkswap/swapon 全流程这一节是核心操作命令都可以直接复制。我按「检查现状 → 创建文件 → 格式化 → 激活 → 持久化」的顺序来每一步都说明在干什么。3.1 检查当前内存与 Swap 状态先看现状确认是不是真的没有 Swapfree -h输出里Swap那一行如果全是 0说明没开。同时看Mem行的available如果只剩几十兆那 OOM 风险很高。再看一眼磁盘空间Swap 文件要占实际磁盘df -h一般根目录/空间充足我们就在根目录下创建。注意别选到空间紧张的挂载点。3.2 创建 Swap 文件我习惯单独建一个目录方便管理和删除cd / sudo mkdir -p /swap cd /swap创建 2GB 的 Swap 文件。这里用dd生成bs2M count1024就是 2M × 1024 2048M 2GBsudo dd if/dev/zero of/swap/swap-disk bs2M count1024如果你内存是 1G建议 Swap 设 2G内存 2GSwap 设 2G 到 4G内存 4GSwap 设 4G 左右。原则是不小于物理内存的一半不超过物理内存的两倍。低配机器上适当给大一点没坏处反正磁盘便宜。创建完设置权限只有 root 能读写sudo chmod 600 /swap/swap-disk3.3 格式化为 Swap 并激活把普通文件转成交换分区文件sudo mkswap /swap/swap-disk成功会输出类似Setting up swapspace version 1, size 2 GiB。然后激活sudo swapon /swap/swap-disk如果报swapon failed: Device or resource busy说明这个文件可能已经被挂载过先停再启sudo swapoff /swap/swap-disk sudo swapon /swap/swap-disk3.4 调整 swappiness 参数swappiness控制内核多积极地使用 Swap取值 0 到 100。默认 60意思是内存有压力时比较主动地换出。对于低配服务器我一般设成 10 到 30 之间——既保留缓冲能力又不至于让系统频繁读写磁盘拖慢响应。查看当前值cat /proc/sys/vm/swappiness临时改成 20sudo sysctl vm.swappiness20永久生效要写进配置文件echo vm.swappiness20 | sudo tee -a /etc/sysctl.conf sudo sysctl -p3.5 设置开机自动挂载上面激活的 Swap 重启后会失效要写进/etc/fstabecho /swap/swap-disk swap swap defaults 0 0 | sudo tee -a /etc/fstab用tee -a追加比手动vim更省事也不容易写错。写完可以cat /etc/fstab确认一下最后一行。3.6 用 JSON 配置统一凭据配合 TaoToken如果你在多台机器上跑调用大模型的任务可以把凭据抽成一个配置文件避免散落。比如建一个~/.taotoken/config.json{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model_id: 你的模型ID, timeout: 60 }然后在脚本里读取这个文件各台机器保持同一份结构换 Key 时只改api_key字段。这样配合前面的 Swap低配机器既扛得住内存峰值又不用为凭据维护发愁。注意api_key别提交到 Git权限设成 600。4. 验证请求与成功结果free -h 前后对比配完必须验证不然你不知道到底生效没有。最直接的就是再看一次free -hfree -h成功的话Swap那一行会显示总量和已用量比如total used free shared buff/cache available Mem: 1.9Gi 1.2Gi 120Mi 10Mi 600Mi 400Mi Swap: 2.0Gi 0B 2.0Gi看到Swap: 2.0Gi就说明挂上了。used是 0 也正常说明暂时没触发换出。想确认内核真的在用可以跑一个吃内存的任务压一压比如sudo swapon --show这个命令会列出当前激活的 Swap 设备、类型、大小和已用量比free -h更细。输出类似NAME TYPE SIZE USED PRIO /swap/swap-disk file 2G 0B -2再验证持久化配置有没有写对可以模拟重启检查 fstab 语法sudo mount -a如果这条命令没报错说明 fstab 那行格式正确重启后能自动挂载。要是报parse error或者unknown filesystem type回去检查那行是不是多了空格或写错了字段。最后看内核日志确认没有异常dmesg | tail -20正常情况下会看到Adding 2097148k swap on /swap/swap-disk之类的记录。如果之前有 OOM 记录也能在这里看到Out of memory: Killed process对比一下加 Swap 之后是否还频繁出现。实测下来一台 2G 内存的机器加上 2G Swap、swappiness 调到 20 之后原本每天必挂的构建任务能稳定跑完SSH 也不再断连。代价是构建时间长了大概 15%但比起半夜起来重启这个交换很划算。5. 本篇常见错排查401、local proxy failed、reading choices配 Swap 和配凭据的过程中报错基本集中在几类。我按真实遇到的顺序列一下方便你对照。第一类swapon failed: Device or resource busy这个前面提过通常是文件已经被挂载或者你重复执行了swapon。解决就是先swapoff再swapon。如果swapoff也报错检查是不是有进程正在用这块 Swap可以先free -h看 used 是不是非零等它降下来再操作。第二类mkswap: /swap/swap-disk: Permission denied权限问题。确认你是用sudo执行的并且文件属主是 root。ls -l /swap/swap-disk看一眼权限应该是-rw-------。第三类fstab 写错导致重启后进不了系统这是最危险的。如果 fstab 里 Swap 那行写错系统启动时可能卡在挂载阶段。所以写完一定要sudo mount -a验证。万一真进不去通过云厂商的 VNC 或救援模式进去把/etc/fstab里那行删掉即可。稳妥起见改 fstab 前先备份sudo cp /etc/fstab /etc/fstab.bak。第四类调用 API 报 401这跟 Swap 无关是凭据问题。401 基本就是 API Key 错了、过期了或者 Base URL 写成了别的地址。检查你的配置文件里base_url是不是https://taotoken.net/apiapi_key有没有多余空格。多台机器上如果只有一台报 401大概率是那台的 Key 没更新。第五类local proxy failed或连接超时这类报错通常是网络出口或地址配置问题。确认 Base URL 拼写正确、没有多斜杠比如https://taotoken.net/api后面不要再接/v1之类的重复路径具体以文档为准。如果机器本身网络受限检查安全组和出站规则。第六类reading choices相关报错这通常出现在解析模型返回时返回体结构和预期不一致。先确认 Model ID 填对了不同模型返回格式可能有差异。用curl直接打一次接口看原始返回curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:你的模型ID,messages:[{role:user,content:hi}]}看返回里有没有choices字段。如果没有多半是模型 ID 或路径不对。把原始返回贴出来对照文档比猜快得多。第七类OAuth 相关报错如果你用的是 Claude Code 这类需要授权的工具报 OAuth 错误通常是授权流程没走完或 token 过期。重新走一遍授权或者改用 API Key 方式接入。TaoToken 的接入文档里有对应说明按文档把 Base URL 和 Key 配好即可。排查的核心思路就一条先确认是内存问题还是凭据问题。free -h和dmesg看内存curl看接口两者分开定位别混在一起猜。6. 语义一致 CTA把内存和凭据都管起来Swap 配完低配服务器的内存峰值有了缓冲凭据用 TaoToken 统一多台机器不用逐台改配置。这两件事做完你的小机器基本能从「每天挂」变成「稳定跑」。如果你还在逐台配置 API Key建议直接去控制台建一个 Key各台机器引用同一个 Base URLhttps://taotoken.net/api换 Key 时只改一处。接入细节可以对照接入文档里面有各工具的配置示例。想先验证模型通不通用模型对话跑一条请求最快。长期跑编码任务或 Agent 的话Coding Plan 能把额度集中管理比多台机器各自计费省心。最后留个实用习惯改完/etc/fstab一定mount -a验证改完凭据一定curl打一次接口。这两个动作花不了一分钟能省掉半夜排障的两小时。