2核2G的华为云Flexus L跑Node服务:Ubuntu 24.04瘦身、加swap,外加一个sysctl加载顺序的坑

举报
yd_286747025 发表于 2026/11/03 11:26:08 2026/11/03
【摘要】 背景我是数据科学与大数据技术专业的大三学生,手上有一台华为云 Flexus 应用服务器 L(2核2G、40GB 系统盘、2M 带宽),系统是 Ubuntu 24.04。最近想在上面常驻一个 Node 22 写的 AI Agent Web 服务,它的官方建议是至少 4G 内存,2G 明显吃紧。于是先给系统做了一轮瘦身,再用 systemd 把服务托管起来。过程不复杂,但最后复查时踩到一个"重...

背景

我是数据科学与大数据技术专业的大三学生,手上有一台华为云 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 服务来说完全够用。

小结

  1. 小内存机器先用 free、ps、systemctl 看清楚再砍,别凭感觉关服务;
  2. swap 是兜底,配合低 swappiness,平时不拖慢速度;
  3. 服务用 systemd 托管,普通用户运行、只监听本地、SSH 隧道访问,省心也安全;
  4. 改系统参数后,验证"当前值"不够,要验证"重启后的值",systemd-analyze cat-config 是个好工具。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。