在只有 1GiB 内存的 Linux 服务器上优化性能,核心思路是减少内存占用、避免交换(swap)、合理配置系统参数。以下是具体可操作的优化方案:
一、禁用或限制 Swap(关键)
Swap 会严重拖慢性能,尤其在内存紧张时。若业务允许,可完全禁用;否则严格限制其使用。
# 查看当前 swap 状态
free -h
swapon --show
# 临时禁用(重启失效)
sudo swapoff -a
# 永久禁用:编辑 /etc/fstab,注释掉 swap 行或删除对应条目
# 或设置 vm.swappiness 极低值(推荐)
echo "vm.swappiness=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
✅ 建议:
vm.swappiness=1表示仅当物理内存几乎耗尽时才使用 swap,避免频繁换入换出。
二、精简服务与进程
- 关闭非必要服务:如
cups,bluetooth,avahi-daemon,dbus等。sudo systemctl disable --now cups avahi-daemon bluetooth - 使用轻量级替代方案:
- Web 服务器:Nginx(比 Apache 更省内存)+ PHP-FPM(限制 worker 数量)
- 数据库:SQLite(小项目)或 MySQL/MariaDB 调优(见下文)
- 日志:改用
systemd-journald限制大小,或定期清理/var/log
三、数据库优化(以 MySQL/MariaDB 为例)
1GiB 下默认配置极易 OOM,需大幅缩减缓冲池:
# /etc/mysql/my.cnf 或 /etc/my.cnf.d/server.cnf
[mysqld]
innodb_buffer_pool_size = 256M # ≤ 总内存的 25%
max_connections = 20 # 根据并发需求调整
query_cache_size = 0 # 新版 MariaDB/MySQL 已弃用,设为 0
tmp_table_size = 32M
max_heap_table_size = 32M
⚠️ 避免开启
query_cache(旧版),它会导致锁竞争且占用额外内存。
四、应用层优化
- JVM 应用:严格控制堆大小
-Xms256m -Xmx512m -XX:+UseG1GC(G1 GC 更适合小内存) - Python/Node.js:启用缓存、连接复用;避免加载大文件到内存。
- 编译型语言:链接时使用
-static可能增加二进制体积但减少运行时依赖;优先选择轻量级框架(如 Go + Gin vs Django)。
五、内核与文件系统调优
# 减少透明大页(THP)——降低内存碎片和延迟
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
# 限制 inode 缓存(防止大量小文件占满 dentry/inode cache)
echo 1000000 | sudo tee /proc/sys/fs/dentry-state # 示例值,需实测调整
# 启用 readahead 优化磁盘顺序读(对 SSD 影响小,HDD 有效)
blockdev --setra 8 /dev/sda # 8KB readahead
六、监控与诊断工具
htop:实时查看内存/CPU/进程smem:按 RSS/PSS 排序进程(比ps更准确反映真实占用)vmstat 1:观察si/so(swap in/out),若持续非零说明内存不足dmesg | grep -i 'out of memory':排查 OOM 事件
七、终极方案:升级或容器化隔离
- 若长期运行关键业务,建议至少升级到 2GiB(成本极低,收益显著)。
- 使用 Docker/Kubernetes 限制单个容器内存(
--memory=400m),防止单进程拖垮整机。
| ✅ 检查清单: | 项目 | 是否完成 |
|---|---|---|
vm.swappiness ≤ 10 |
☐ | |
| Swap 已禁用或严格限制 | ☐ | |
| 非必要服务已关闭 | ☐ | |
| 数据库缓冲池已调小 | ☐ | |
| JVM/应用堆大小已限制 | ☐ | |
| THP 已禁用 | ☐ | |
| 有 OOM 监控机制 | ☐ |
需要我针对特定场景(如 Nginx+PHP、Docker 部署、LAMP 栈)提供详细配置模板吗?
云服务器