在云服务器(无论是阿里云、腾讯云还是AWS)上部署 Ubuntu,追求极致的资源利用率是常态。所谓“最小化安装”不仅仅是选个 Minimal ISO 那么简单,它是一个从镜像选择、服务裁剪到内核优化的系统工程。
以下是我在实际生产环境中总结出的几层优化策略,按效果从高到低排列:
1. 镜像层面的“极简主义”
很多新手直接去官网下载 Desktop 版或者标准的 Server 版 ISO,这本身就是资源浪费的开始。
- 首选 Cloud-init 镜像或官方 Minimal ISO:
- 如果你是自己刻录 ISO 安装,务必选择
ubuntu-22.04-live-server-amd64.iso这种不带图形界面的版本。 - 更推荐的是使用云厂商提供的 Cloud Image。这些镜像默认已经移除了大部分非必要包,并且预装了
cloud-init,启动速度极快,占用内存通常在 50MB-80MB 左右。
- 如果你是自己刻录 ISO 安装,务必选择
- 避免安装 GUI 组件:
- 这是最直观的资源杀手。如果在安装过程中误选了
Ubuntu Desktop或者后续安装了tasksel里的桌面环境,内存瞬间就能吃掉 300MB+,CPU 也会因为 Xorg/Wayland 的后台进程而闲置发热。 - 操作:确保只安装
OpenSSH server和基础系统工具。
- 这是最直观的资源杀手。如果在安装过程中误选了
2. 软件包的“外科手术式”清理
安装完系统后,不要急着跑业务,先做一次大扫除。
-
卸载不需要的默认包:
Ubuntu 默认会安装一些为了兼容性考虑的包,比如cups(打印服务)、snapd(Snap 包管理器)。# 卸载打印服务(除非你真的需要打印机) sudo apt purge cups cups-common # 卸载 Snap(在轻量级服务器上,Docker 或原生二进制包通常更高效,Snap 的 daemon 会常驻内存并占用磁盘 IO) sudo apt purge snapd -
清理残留依赖:
sudo apt autoremove --purge sudo apt clean -
检查并禁用非核心服务:
使用systemctl list-units --type=service --state=running查看当前运行的服务。- ModemManager:服务器通常没有调制解调器,这个服务纯属浪费。
sudo systemctl stop ModemManager sudo systemctl disable ModemManager - thermald / lm-sensors:如果是容器化部署或不需要监控硬件温度的场景,可以酌情关闭。但注意,对于物理机,保留基本的温度监控有助于防止过热降频,需权衡。
- ModemManager:服务器通常没有调制解调器,这个服务纯属浪费。
3. 文件系统与 Swap 的策略调整
- Swap 的处理:
- 在低内存实例(如 1GB 或以下)中,Swap 是保命符,但不要太大,避免频繁 Swap 导致 IO 瓶颈。建议设置为内存的 1/2 或 1GB 即可。
- 如果使用的是 SSD 云盘,频繁写入 Swap 会消耗寿命并影响性能。可以考虑将 Swap 优先级调低,或者在应用层面做好 OOM 保护,优先让程序崩溃而不是进入 Swap。
- 文件系统挂载选项:
在/etc/fstab中,针对数据盘(非根分区),可以考虑添加noatime参数,减少每次读取文件时更新访问时间的元数据写入开销,提升小文件读取性能。/dev/vdb1 /data ext4 defaults,noatime,nodiratime 0 2
4. 内核与网络栈优化
这部分对 CPU 和内存的直接占用影响较小,但对整体响应速度和吞吐量有巨大帮助。
- TCP 拥塞控制算法:
Ubuntu 默认使用cubic。在高带宽延迟产品(BDP)较大的场景下,可以尝试切换为bbr。echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf sudo sysctl -p - 禁用 IPv6(如果不需要):
如果你的应用和 DNS 解析完全基于 IPv4,禁用 IPv6 可以减少内核处理双栈协议栈的开销,并避免某些连接超时问题。
在/etc/default/grub中添加ipv6.disable=1,然后update-grub重启。
5. 终极方案:容器化与微服务架构
如果你是在做开发测试或小型项目,不要在裸机上直接运行多个重型服务。
- 使用 Docker/Podman:
将每个应用隔离在容器中。这样你可以精确控制每个容器的 CPU 和内存限制(cgroups),并且可以随时销毁不用的容器释放资源。 - 使用 Alpine Linux 作为基础镜像:
即使宿主系统是 Ubuntu,你的应用容器也尽量基于 Alpine 构建。Alpine 镜像只有几 MB,且包含完整的 musl libc 和 busybox,极大减少了应用层的资源 footprint。
6. 监控与持续优化
最后,你需要知道资源到底花在哪了。
- 安装
htop或btop进行实时监控。 - 定期运行
journalctl --vacuum-size=50M清理日志,防止日志文件撑爆磁盘或占用大量 inode。 - 使用
nmap localhost扫描开放端口,确保没有意外暴露的服务。
总结建议:
对于一台 1核 1G 的云服务器,经过上述优化后,空闲状态下的内存占用应控制在 150MB-200MB 以内,CPU 占用接近 0%。如果超过这个数值,说明还有未发现的后台进程或配置不当。
记住,最小化不是目的,稳定和高效率才是。不要为了节省那 50MB 内存而关闭关键的安全更新或监控服务,尤其是在公网暴露的服务器上。平衡点在于:移除所有你明确知道不需要的功能,保留所有你不确定是否需要的安全和诊断功能。
云技术博客