2核2G的华为云Flexus L跑Node服务:Ubuntu 24.04瘦身、加swap,外加一个sysctl加载顺序的坑
背景
我是数据科学与大数据技术专业的大三学生,手上有一台华为云 Flexus 应用服务器 L(2核2G、40GB 系统盘、2M 带宽),系统是 Ubuntu 24.04。最近想在上面常驻一个 Node 22 写的 AI Agent Web 服务,它的官方建议是至少 4G 内存,2G 明显吃紧。于是先给系统做了一轮瘦身,再用 systemd 把服务托管起来。过程不复杂,但最后复查时踩到一个"重启后才会暴露"的坑,觉得值得记下来。
1. 先看清内存去哪了
free -h
ps -eo rss,comm --sort=-rss | head
systemctl list-units --type=service --state=running
free 显示总内存只有 1.7Gi,一部分被内核和保留内存占掉了。running 的服务里有好几个是给笔记本或物理机准备的,云服务器根本用不上。
2. 关掉用不上的服务
云服务器没有 Wi-Fi、没有调制解调器、没有电池,也不会插 U 盘,单块云盘也用不到多路径存储:
systemctl disable --now ModemManager wpa_supplicant udisks2 upower multipathd
systemctl stop fwupd
fwupd(固件更新)是 static 类型的服务,disable 不了,它平时按需激活,停掉就行。
提醒一句:关之前确认自己没依赖它们,比如用 netplan 配了 Wi-Fi 的机器就不能关 wpa_supplicant。
3. 加 4G swap
40G 的盘拿 4G 出来做 swap 不心疼,主要是给内存突增兜底,避免进程被 OOM 杀掉:
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
swappiness 设成 10,意思是内存够时尽量不用 swap:
echo 'vm.swappiness=10' > /etc/sysctl.d/99-swap.conf
sysctl -p /etc/sysctl.d/99-swap.conf
4. 用 systemd 托管 Node 服务
国内服务器直连 npm 官方源很慢,全局安装时换成 npmmirror:
npm config set registry https://registry.npmmirror.com
服务不用 root 跑,单独建一个普通用户:
useradd -m -s /bin/bash appuser
unit 文件 /etc/systemd/system/myapp.service:
[Unit]
Description=My Node Web Service
After=network-online.target
[Service]
User=appuser
WorkingDirectory=/home/appuser/workspace
Environment=HOME=/home/appuser
ExecStart=/usr/bin/your-app web --host 127.0.0.1 --port 3080
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now myapp
journalctl -u myapp -f
服务只监听 127.0.0.1,自己电脑上用 SSH 隧道访问,不用在安全组里多开端口:
ssh -L 3080:127.0.0.1:3080 用户名@服务器地址
5. 踩坑:swappiness 一重启就会变回 0
跑了几天后复查,cat /proc/sys/vm/swappiness 输出 10,看起来没问题。但我顺手翻了一下 /etc/sysctl.conf,发现镜像自带的文件末尾有一行:
vm.swappiness=0
Ubuntu 上 /etc/sysctl.d/99-sysctl.conf 是指向 /etc/sysctl.conf 的软链接。systemd-sysctl 开机时按文件名字典序加载,同一个参数后加载的覆盖先加载的。“99-swap.conf” 排在 “99-sysctl.conf” 前面,所以一重启,swappiness 会被改回 0。现在显示 10,只是因为我手动执行过 sysctl -p,机器还没重启过。
用这条命令能看到最终的加载顺序,非常直观:
systemd-analyze cat-config sysctl.d | grep -n "^# /\|swappiness"
输出里 99-swap.conf 的 10 在前,99-sysctl.conf 的 0 在后,后者生效。
修法二选一:
- 直接把 /etc/sysctl.conf 里那行改成 vm.swappiness=10;
- 或者把自己的文件改名为 999-swap.conf,让它排到最后加载(“-” 的编码比 “9” 小,所以 “99-sysctl” 排在 “999-swap” 前面)。
改完执行 sysctl --system,它会按开机时的顺序重新加载一遍,再看一次 /proc/sys/vm/swappiness 才算验证完。
6. 现在的状态
服务连续跑了 5 天多,最近一次查看:总内存 1.7Gi,可用约 880Mi,swap 用了约 340Mi,Node 主进程常驻内存约 370MB,负载基本为 0。对一个单人用的 Web 服务来说完全够用。
小结
- 小内存机器先用 free、ps、systemctl 看清楚再砍,别凭感觉关服务;
- swap 是兜底,配合低 swappiness,平时不拖慢速度;
- 服务用 systemd 托管,普通用户运行、只监听本地、SSH 隧道访问,省心也安全;
- 改系统参数后,验证"当前值"不够,要验证"重启后的值",systemd-analyze cat-config 是个好工具。
- 点赞
- 收藏
- 关注作者
评论(0)