为什么用 systemd 托管
把推理引擎交给 systemd 管理,换来开机自启、崩溃后自动拉起、日志统一进 journald,以及停止时的优雅退出。相比 nohup 或 screen 起进程,systemd 会记录退出码、按 cgroup 限制资源,失败时也能按策略重试,排障时有现成的状态可查。适用于 systemd 245 及以上的主流 Linux 发行版。
基本信息
| 适用平台 | systemd 245 以上的 Linux,如 Ubuntu 20.04、CentOS 7 以上 |
|---|---|
| unit 路径 | /etc/systemd/system/ 下的服务文件 |
| 常用指令 | systemctl daemon-reload / restart / status |
| 日志查看 | journalctl -u 服务名 -f |
| 权限要求 | root 或具备 sudo 的运维账号 |
| 资源限制 | 文件描述符与 CPU、内存可按需在 unit 内配置 |
典型使用场景
- 开机自启:机器重启后引擎自动拉起,不必等人工登录处理
- 崩溃自愈:进程异常退出后按策略重启,缩短服务中断时间
- 优雅退出:收到停止信号后留出时间把在途请求处理完
- 参数收敛:启动参数与环境变量写进独立文件,便于审计与回滚
- 日志归集:标准输出进 journald,可与同机其他服务统一检索
- 多实例托管:同一份 unit 模板用实例化服务区分模型与端口,避免复制粘贴出错
完整 unit 示例
完整 unit 示例
[Unit]
Description=vLLM Server
After=network-online.target nvidia-persistenced.service
Wants=network-online.target
[Service]
Type=simple
ExecStart=/opt/venv/bin/vllm serve /models/qwen --port 8000
Restart=on-failure
RestartSec=5
EnvironmentFile=/etc/llm/env
TimeoutStopSec=90
LimitNOFILE=65535
User=llm
[Install]
WantedBy=multi-user.target常用操作
常用操作
sudo systemctl daemon-reload # 改完 unit 必须先重载
sudo systemctl restart vllm # 重启生效
systemctl status vllm --no-pager # 查看状态与最近日志
journalctl -u vllm -n 100 --no-pager # 查看最近 100 行日志关键选项读法
| 选项 | 作用 | 常见取值 |
|---|---|---|
| Restart | 退出后是否自动拉起 | 定位阶段用 on-failure |
| RestartSec | 两次重启之间的等待 | 五到十秒 |
| TimeoutStopSec | 停止时等待优雅退出的秒数 | 长请求场景给到六十秒以上 |
| EnvironmentFile | 集中加载环境变量与启动参数 | 权限收紧的独立文件 |
| LimitNOFILE | 文件描述符上限 | 大并发下调到六万以上 |
| User | 以哪个账号运行进程 | 专用低权限账号 |
改完 unit 文件必须先 daemon-reload 再重启,否则仍按旧配置启动;参数尽量放在环境变量文件里,unit 本身保持稳定,回滚时只换环境文件。
查退出原因用 systemctl status 配合 journalctl -u,重点看退出码与信号:被强杀的进程通常留下 137 这类记录,对应内存不足或停止超时。
改完配置先做语法级校验:systemd-analyze verify 能提前发现拼写错误;确认无损后再进重启环节,避免因一个字段拼错导致服务起不来。