针对 2 核 2G 内存、40G 系统盘的“低配”服务器,核心优化思路是:极致精简(砍掉非必要服务)、资源隔离(限制进程占用)和 存储分层(减少磁盘 I/O 压力)。
以下是分步骤的实操优化方案:
一、系统初始化与内核参数调优
在部署任何应用前,先对操作系统本身进行“瘦身”。
-
最小化安装与清理
- 重装/重置:如果可能,使用
CentOS Stream/AlmaLinux或Ubuntu Server的最小化安装镜像(Minimal Install),不要选带图形界面(GUI)的版本。 - 清理缓存:安装完成后立即清理包管理器缓存。
# CentOS/RHEL yum clean all && rm -rf /var/cache/yum/* # Ubuntu/Debian apt-get clean && rm -rf /var/lib/apt/lists/* - 移除无用工具:卸载
vim(改用vi)、wget(改用curl) 等不常用的大体积工具,或者仅保留必要项。
- 重装/重置:如果可能,使用
-
内核参数优化 (
sysctl.conf)
修改/etc/sysctl.conf,调整虚拟内存和文件句柄,防止因内存不足导致 OOM(Out Of Memory):# 开启 Swappiness 为 60(默认通常是 60,但可微调,建议不要太高以免频繁 Swap) vm.swappiness = 60 # 增加最大打开文件数(防止高并发连接报错) fs.file-max = 2097152 # 关闭不需要的网络协议栈(如 IPv6,如果不需要) net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 # 优化 TCP 参数,节省内存 net.core.somaxconn = 1024 net.core.netdev_max_backlog = 1024执行
sysctl -p生效。 -
Swap 分区策略
2G 内存对于现代 Web 服务略显紧张,必须配置 Swap,但要注意Swap 位置。- 推荐方案:将 Swap 放在内存中(tmpfs)或直接利用系统盘剩余空间。由于只有 40G 系统盘,建议分配 1G-1.5G 的 Swap 文件,避免物理硬盘 IO 瓶颈。
# 创建 1G swap 文件 fallocate -l 1G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 写入 fstab 确保重启生效 echo '/swapfile none swap sw 0 0' >> /etc/fstab
- 推荐方案:将 Swap 放在内存中(tmpfs)或直接利用系统盘剩余空间。由于只有 40G 系统盘,建议分配 1G-1.5G 的 Swap 文件,避免物理硬盘 IO 瓶颈。
二、服务精简与启动项管理
这是节省内存最关键的一步。2 核 CPU 跑满后台服务会直接卡死。
-
禁用非核心服务
检查并关闭所有不必要的 Systemd 服务:systemctl list-unit-files --state=enabled | grep -v "target"建议禁用的服务列表(根据实际业务调整):
bluetooth.service(蓝牙,服务器通常不需要)avahi-daemon.service(零配置网络发现,内网环境可关)cups.service(打印服务)firewalld(如果手动配置 iptables/nftables 更安全且省资源,否则保留)NetworkManager(如果是云服务器,通常直接用networking或systemd-networkd更轻量)
操作示例:
systemctl disable avahi-daemon cups bluetooth systemctl stop avahi-daemon cups bluetooth -
替换重型守护进程
- Web 服务器:放弃 Nginx/Apache 的某些复杂模块,只保留核心功能。如果流量极小,甚至可以用
Python http.server或Go编写的单二进制文件替代。 - 数据库:
- MySQL/MariaDB:必须修改配置文件
/etc/my.cnf,大幅降低内存预留。[mysqld] innodb_buffer_pool_size = 128M # 2G 内存机器,给 DB 留 128M-256M 足够 max_connections = 50 # 限制连接数 skip-name-resolve # 禁止 DNS 反向解析,提升性能 - PostgreSQL:同样调整
shared_buffers为 128MB。 - 进阶:如果数据量不大,考虑迁移到 SQLite 或 Redis-only 架构,彻底省去数据库进程开销。
- MySQL/MariaDB:必须修改配置文件
- Web 服务器:放弃 Nginx/Apache 的某些复杂模块,只保留核心功能。如果流量极小,甚至可以用
-
日志管理(节省磁盘关键)
日志是 40G 系统盘最大的杀手。- 配置 Logrotate:强制切割日志,设置极小的保留时间。
编辑/etc/logrotate.conf或/etc/logrotate.d/下的文件:/var/log/*.log { daily rotate 3 # 只保留 3 天 compress # 压缩旧日志 missingok notifempty create 0644 root root postrotate /usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true endscript } - 关闭冗余日志:在
rsyslog.conf中过滤掉 DEBUG 级别日志,只保留 ERROR 和 CRITICAL。 - 使用无日志模式:对于开发测试环境,部分程序支持
--no-log参数。
- 配置 Logrotate:强制切割日志,设置极小的保留时间。
三、应用层优化策略
-
容器化与资源限制 (Docker/LXC)
如果运行多个应用,务必使用 Docker 并限制资源,防止单个应用吃光内存。docker run -d --memory="512m" --memory-swap="512m" --cpus="1.0" --name myapp myimage注意:
memory-swap设为和memory一样,意味着该容器完全禁止使用 Swap,保护宿主机不被拖垮。 -
编程语言运行时优化
- Java:严禁使用默认堆大小。启动参数必须加
-Xms256m -Xmx512m,并加上-XX:+UseG1GC。 - PHP:在
php-fpm.conf中将pm.max_children调低(例如 5-10),每个子进程限制内存。 - Node.js:启动时指定
--max-old-space-size=512。
- Java:严禁使用默认堆大小。启动参数必须加
-
监控与报警
安装轻量级监控,避免盲目猜测。- 推荐使用 Glances (Python 编写,单二进制,极低资源占用) 或 htop。
- 配置简单的 Shell 脚本,当内存使用超过 90% 时自动发送通知或杀进程。
四、磁盘空间专项优化
40G 对于系统和数据来说比较局促,需要精细管理。
-
定期清理临时文件
编写 Crontab 任务,每天凌晨清理:# /etc/cron.daily/cleanup find /tmp -type f -atime +1 -delete find /var/tmp -type f -atime +1 -delete -
使用 ZFS/Btrfs 或 LVM (可选)
如果系统允许,使用 Btrfs 文件系统可以开启透明压缩(Compress=zstd),能显著节省磁盘空间,且对 CPU 影响很小。- 安装 Btrfs:
apt install btrfs-progs - 挂载选项:
mount -o noatime,compress=zstd /dev/sda1 /mnt/data noatime选项非常重要,它禁止记录文件访问时间,减少写 I/O。
- 安装 Btrfs:
-
数据分离
如果 40G 不够用,强烈建议挂载一块额外的数据盘(即使是便宜的云盘)。- 将
/var/www,/var/lib/mysql,/var/log挂载到独立的数据盘上。 - 这样即使系统盘满了,也不会导致服务器宕机,且方便扩容。
- 将
五、总结清单 (Checklist)
| 优化维度 | 关键动作 | 预期收益 |
|---|---|---|
| 内存 | 禁用 Bluetooth, Avahi, Cups; 限制 Java/MySQL 内存 | 释放 300MB-500MB 可用内存 |
| CPU | 限制 Docker 容器 CPU 配额; 调整线程池大小 | 防止单进程占满 2 核 |
| 磁盘 | 配置 Logrotate (每日切分); 开启 noatime |
防止日志撑爆 40G 系统盘 |
| 系统 | 关闭 IPv6 (若不用); 调整 Swappiness=60 | 减少无效 I/O 和网络延迟 |
| 架构 | 数据库改 SQLite 或 减小 Buffer Pool | 彻底消除数据库内存峰值 |
最后建议:
在实施任何修改前,务必备份当前系统快照。2 核 2G 的服务器非常脆弱,一旦配置错误导致无法远程连接,恢复成本很高。优先从“禁用服务”和“日志切割”这两项开始,风险最低,效果最明显。
PHPWP博客