Ubuntu Server在低配设备上跑不动的核心原因通常不是系统本身,而是默认安装携带了大量对服务器场景无用的组件、定时任务和内存占用策略。一台512MB或1GB内存的VPS、旧笔记本、ARM开发板,只要把几个关键环节压下来,运行LAMP、Docker单容器、WireGuard、轻量级文件服务都完全够用。问题在于大多数人用桌面思维装服务器,装完才发现内存被netplan、snapd、cloud-init、unattended-upgrades这些后台进程吃掉了大半。

先砍掉cloud-init和snapd,这是低配设备最大的两个隐形消耗源

云厂商镜像默认启用cloud-init,它会在每次开机时检测元数据服务、配置网络、注入SSH密钥。物理机和本地虚拟机根本不需要这套机制,但它依然会拖慢启动并常驻一个python进程。执行

sudo apt purge cloud-init -y
然后手动清理
sudo rm -rf /etc/cloud /var/lib/cloud
即可。snapd的问题更严重,Ubuntu Server 20.04及之后版本强制依赖snap版的lxd和core组件,snapd守护进程常驻内存,还会定期自动刷新。低配设备上直接
sudo systemctl disable --now snapd snapd.socket
再
sudo apt purge snapd -y
能立刻释放约80-150MB内存。如果你不需要lxd容器,这个操作没有任何副作用。

内存策略必须调整,swappiness和缓存压力是两个关键内核参数

Ubuntu默认swappiness为60,这对低内存设备过于激进,系统会过早把内存页交换到磁盘,导致服务响应卡顿。在

/etc/sysctl.d/99-lowmem.conf
中写入:

vm.swappiness=10
vm.vfs_cache_pressure=50
vm.dirty_ratio=10
vm.dirty_background_ratio=3

swappiness=10让内核优先使用物理内存,只有在接近耗尽时才交换。vfs_cache_pressure=50降低对文件系统缓存回收的激进程度,避免频繁重新读取磁盘。dirty_ratio和dirty_background_ratio控制脏页写入阈值,低配设备磁盘IO弱,调低这两个值能防止大量脏页堆积导致写入阻塞。执行

sudo sysctl --system
立即生效。这套参数对512MB内存的VPS效果尤其明显,SSH操作不再有粘滞感。

用systemd限制服务内存,而不是放任单个进程吃满整机

低配设备最怕某个服务内存泄漏或突发请求把整机拖死。systemd的MemoryMax和MemoryHigh指令可以直接限制服务内存上限。以MariaDB为例,编辑

sudo systemctl edit mariadb.service
添加:

[Service]
MemoryMax=256M
MemoryHigh=192M

MemoryHigh是软限制,达到后systemd会开始回收该服务的缓存页;MemoryMax是硬限制,超过后触发OOM killer只杀这个服务,不影响系统和其他进程。同理,对nginx、php-fpm、redis都建议设置合理上限。不要用ulimit的旧方案,systemd的cgroup控制粒度更细,且能记录内存峰值,方便后续调优。

日志必须做上限和轮转,否则磁盘会被journald和syslog悄悄填满

低配设备磁盘通常也不大,16GB或32GB的存储跑几个月就被日志占满是常见故障。journald默认持久化所有日志且没有严格上限,修改

/etc/systemd/journald.conf
:

SystemMaxUse=100M
SystemMaxFileSize=20M
MaxRetentionSec=7day
ForwardToSyslog=no

然后

sudo systemctl restart systemd-journald
。rsyslog同样需要限制,在
/etc/rsyslog.d/50-default.conf
中给每个日志文件加上轮转参数,或者直接改用logrotate的size和rotate指令。更激进的方案是只保留journald,彻底停用rsyslog,对于单机服务器足够用,还能再省几MB内存和一个进程。

防火墙和SSH加固不需要额外软件,用系统自带工具就能完成

很多人为了安全装fail2ban、ufw、iptables-persistent一堆工具,低配设备上这些本身就是负担。Ubuntu Server自带nftables,规则直接写在

/etc/nftables.conf
,比iptables语法更简洁。SSH安全的核心是关闭密码登录、限制登录用户和来源IP,编辑
/etc/ssh/sshd_config
:

PasswordAuthentication no
PermitRootLogin prohibit-password
AllowUsers youruser
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2

改完

sudo systemctl reload ssh
。如果不需要SSH监听IPv6,设置
AddressFamily inet
减少一个监听socket。fail2ban不是必需品,只要SSH只允许密钥登录且限制来源,暴力破解基本无效。把fail2ban省下的内存和CPU留给业务服务更实际。

选择轻量级服务组合,避免默认安装的重量级方案

Web服务器场景中,Apache+mod_php是低配设备的大忌。Nginx+PHP-FPM是更合理的选择,但PHP-FPM默认的进程管理模式下会预派生多个worker,每个占用20-40MB。在

/etc/php/*/fpm/pool.d/www.conf
中设置:

pm = ondemand
pm.max_children = 4
pm.process_idle_timeout = 30s
pm.max_requests = 500

ondemand模式在空闲时完全不启动worker,请求来了才派生,处理完30秒后自动回收。数据库方面,MySQL 8在1GB内存以下设备上非常吃力,MariaDB 10.11或PostgreSQL 13+是更好的选择。MariaDB的默认配置也偏大,在

/etc/mysql/mariadb.conf.d/50-server.cnf
中设置:

innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M
max_connections = 30
performance_schema = OFF

performance_schema关闭后能省下约50-80MB内存,对大多数个人项目完全不影响功能。如果只是轻量API或静态站,SQLite配合Nginx直接跑,内存占用可以压到100MB以内。

定时任务和自动更新要主动管理,不要让系统在业务高峰期自行升级

unattended-upgrades是Ubuntu Server默认启用的自动安全更新服务,它会在后台下载并安装包,低配设备上这个过程的CPU和IO开销足以让服务短暂不可用。执行

sudo systemctl disable --now unattended-upgrades
停用,然后手动定期执行
sudo apt update && sudo apt upgrade
并选择低峰时段。同样,apt的每日更新检查timer也要停掉:
sudo systemctl disable --now apt-daily.timer apt-daily-upgrade.timer
。cron任务中检查是否有logrotate、man-db、mlocate等周期性任务,这些在低配设备上都会造成周期性IO尖峰。mlocate的updatedb每天扫描全盘,如果不需要文件搜索直接
sudo apt purge mlocate -y
。

文件系统选择直接影响低配设备性能,ext4加noatime是基础操作

Ubuntu Server安装时默认使用ext4并开启atime记录,每次读取文件都会触发一次写操作更新访问时间,对低配设备的磁盘IO是额外负担。编辑

/etc/fstab
,在挂载选项中添加
noatime,nodiratime
:

UUID=xxxx / ext4 defaults,noatime,nodiratime 0 1

如果设备使用SD卡或eMMC存储,还应该加上

commit=60
延长日志提交间隔,减少写入次数。对于ARM开发板这类使用SD卡的设备,可以考虑使用f2fs文件系统,它对闪存介质的小文件随机读写优化更好,但需要安装时手动选择。ZFS和btrfs在低配设备上不要碰,内存和CPU开销都远超ext4。

监控和告警用最轻量的方案,不要装整套Prometheus和Grafana

低配设备需要监控,但不需要重型监控栈。Netdata虽然功能全,但本身占用内存不低。更合适的方案是使用

vmstat 5
配合脚本记录关键指标,或者用
sar
定期采集。如果需要远程查看,用
node_exporter
加一个外部轻量采集器即可,node_exporter本身只占十几MB内存。告警方面,写一个简单的shell脚本检查内存、磁盘、服务状态,异常时通过系统邮件或通知API发送即可,不需要完整的告警平台。监控的本质是发现问题,不是展示图表,低配设备上保持简单最重要。

内核和启动参数还可以进一步精简,去掉不需要的硬件支持

Ubuntu Server的通用内核包含了大量服务器硬件驱动,对于确定硬件配置的设备,可以安装

linux-image-virtual
或
linux-image-generic-hwe-22.04
的精简版本,减少内核本身的内存占用和启动时间。在
/etc/default/grub
中添加启动参数:

GRUB_CMDLINE_LINUX="quiet console=tty1 mitigations=off"

mitigations=off关闭CPU漏洞缓解措施,在完全可信的单租户环境中可以提升性能,但公网多租户环境不建议。如果设备不需要IPv6,在sysctl中设置

net.ipv6.conf.all.disable_ipv6 = 1
减少协议栈开销。这些操作属于进阶优化,每项都能省下少量资源,叠加起来对低配设备有实际意义。

低配设备跑Ubuntu Server的要点总结起来就是:去掉不需要的默认组件、限制每个服务的内存上限、控制日志和定时任务的资源消耗、选择轻量级服务组合、调整内核参数适配小内存。做完这些优化,一台512MB内存的VPS可以稳定运行Nginx+PHP+SQLite的完整Web服务,1GB内存可以跑Nginx+MariaDB+Redis的组合,而且不会出现周期性卡顿或内存耗尽。安全方面依靠最小化安装、SSH密钥认证和nftables防火墙已经足够,不需要额外的安全软件堆砌。轻量化本身就是一种安全策略,攻击面更小、资源消耗更可控、故障排查更简单。