努力
加油

最小化安装Ubuntu时如何减少系统资源占用?

在云服务器(无论是阿里云、腾讯云还是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 左右。
  • 避免安装 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:如果是容器化部署或不需要监控硬件温度的场景,可以酌情关闭。但注意,对于物理机,保留基本的温度监控有助于防止过热降频,需权衡。

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 内存而关闭关键的安全更新或监控服务,尤其是在公网暴露的服务器上。平衡点在于:移除所有你明确知道不需要的功能,保留所有你不确定是否需要的安全和诊断功能。