很多个人站长的第一台服务器都是 1G 内存甚至 512M 内存的便宜 VPS。买的时候觉得够用,等网站跑起来才发现:数据库频繁重启、网站动不动就 502、SSH 连上去敲命令都卡。其实低配服务器不是不能用,而是没有做针对性的优化。这篇文章就从一个草根站长的角度,把 Swap 交换分区、内存管理和数据盘配置这些事讲透,让手里的小鸡也能稳稳当当跑上几年。
一、先搞清楚:低配服务器的瓶颈到底在哪
遇到网站变慢,很多人的第一反应是加钱升级配置。但在动手之前,建议先花两分钟看看资源到底被谁吃掉了。低配服务器最常见的三个瓶颈,按出现频率排序:第一是内存不足,进程被系统 OOM Killer 杀掉;第二是磁盘空间被日志和备份撑爆;第三才是 CPU 不够用。对个人博客站来说,CPU 几乎从来不是瓶颈,内存和磁盘才是。
判断内存是否吃紧,用几个命令就能看明白:
free -h # 重点看 available 这一列,如果长期只有几十 MB,说明内存确实不够用 swapon --show # 如果这条命令没有输出,说明你根本没开 Swap
再看磁盘:
df -h # 看 / 分区使用率,超过 85% 就要警惕了 du -sh /var/log /tmp /var/lib/mysql 2>/dev/null # 找出哪个目录在偷偷变大
把这两个问题解决掉,低配服务器百分之八十的"卡顿"都会消失。下面逐一展开。
二、内存篇:Swap 到底该不该开、开多大
Swap 就是把磁盘上的一块空间当作内存来用。当物理内存不够时,系统会把暂时用不到的内存数据换到磁盘上,腾出物理内存给正在运行的程序。很多教程说 Swap 伤硬盘、会拖慢性能,于是干脆不建。这个说法对一半:Swap 确实比物理内存慢很多,但对个人站长来说,有 Swap 的服务器在内存吃紧时是"变慢",没有 Swap 的服务器则是"直接被杀死进程"。变慢可以忍,数据库被 OOM 杀掉、网站打不开,不能忍。
Swap 开多大合适?经验法则:物理内存 1G 以下的机器,Swap 设置为内存的 1 到 2 倍;1G 到 4G 的机器,设置 2G 到 4G 就足够。对个人博客站来说,2G 的 Swap 基本是上限,再大就是浪费磁盘。
在 Linux 上创建 Swap 最简单的方式是使用 swapfile,不需要单独分区:
# 以 2G 为例 fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile # 写入 /etc/fstab 实现开机自动挂载 echo '/swapfile none swap sw 0 0' >> /etc/fstab
注意三点:第一,fallocate 在某些文件系统上创建的文件可能有空洞,稳妥起见可以用 dd 命令代替:dd if=/dev/zero of=/swapfile bs=1M count=2048。第二,swapfile 的权限一定要是 600,否则系统会拒绝使用,因为任何人可读的交换文件有泄露内存数据的风险。第三,改完 fstab 后建议执行 mount -a 或者重启验证一下,防止配置写错导致开机失败。
三、进阶篇:swappiness 与缓存回收参数调优
开了 Swap 之后还有一个关键参数:swappiness。它控制内核使用 Swap 的积极程度,取值范围是 0 到 100。默认值通常是 60,意思是系统在内存使用率达到一定水平后就会开始积极换出。对服务器来说,这个值偏激进,会导致明明还有物理内存,系统却把数据往磁盘上换,白白增加延迟。
个人站长的建议配置:
# 临时生效 sysctl vm.swappiness=10 # 永久生效 echo 'vm.swappiness=10' >> /etc/sysctl.conf
把 swappiness 调到 10,系统会优先使用物理内存,只有内存确实紧张时才动用 Swap。另外两个值得一起调的参数:vm.vfs_cache_pressure 控制内核回收目录和 inode 缓存的倾向,默认 100,可以调到 50 左右让缓存保留更久,对文件操作频繁的网站有帮助;vm.min_free_kbytes 保证系统始终保留一部分空闲内存用于应急分配,默认值在低配机器上可能偏小,可以根据实际内存适当调大。
调完参数不要急着下结论,观察几天。看 Swap 的实际使用情况用 free -h 和 vmstat 1:如果 si/so 两列长期不为零,说明系统一直在频繁换入换出,那才是真正的内存不足,光调参数救不了,该加内存或者精简服务了。
四、数据盘篇:挂载、迁移与目录规划
现在很多 VPS 厂商把系统盘和数据盘分开卖:系统盘装操作系统,数据盘单独一块,价格便宜容量大。但新手买回来常常发现:数据盘根本没挂载,网站数据全写在系统盘上,等系统盘满了才手忙脚乱。正确的做法是买回来先把数据盘挂好,并把网站、数据库、备份这些大头都迁到数据盘上。
挂载数据盘的流程:
# 查看磁盘设备名,一般是 /dev/vdb 或 /dev/sdb lsblk # 分区并格式化(以 ext4 为例) fdisk /dev/vdb # 按 n 新建分区,一路回车,w 保存 mkfs.ext4 /dev/vdb1 # 挂载 mkdir -p /data mount /dev/vdb1 /data # 写入 fstab,注意用 UUID 而不是设备名,设备名可能变化 blkid /dev/vdb1 echo 'UUID=你的UUID /data ext4 defaults,noatime 0 2' >> /etc/fstab
挂载参数里建议加上 noatime:不更新文件访问时间,可以减少大量的磁盘写入,对低配机器和 SSD 寿命都有好处。挂好之后,把网站根目录、MySQL 数据目录、备份目录都迁移到 /data 下面。迁移 MySQL 数据目录的典型做法:
systemctl stop mysql rsync -av /var/lib/mysql/ /data/mysql/ # 修改配置文件 datadir 指向新路径 vim /etc/mysql/mysql.conf.d/mysqld.cnf # datadir=/data/mysql systemctl start mysql
目录规划的原则是"大事分开":网站代码、数据库、备份日志互不干扰,将来清理、迁移、扩容都方便。比如 /data/www、/data/mysql、/data/backup 这样的结构,比全堆在 /root 下面清晰得多。
五、日常维护篇:日志与缓存清理
低配服务器的磁盘就那么几十 G,最怕的就是日志无限增长。systemd 的 journal 日志默认可能占几个 G,Nginx 和 PHP 的 access log 在流量大的时候一天就能写几百 M。建议一上来就把日志策略定好:
# journal 限制为 200M echo 'SystemMaxUse=200M' >> /etc/systemd/journald.conf systemctl restart systemd-journald # 配置 logrotate 按天切割并压缩,保留 7 天 # 在 /etc/logrotate.d/nginx 里设置 daily + compress + rotate 7
另外养成定期清理的习惯:apt clean 清掉下载的软件包缓存,journalctl --vacuum-size=100M 快速瘦身日志,旧备份只保留最近几份。把这些操作写进 crontab,每周自动跑一次,比想起来才清理靠谱得多。
六、OOM 排查与防范
如果你已经看到过类似 Out of memory: Killed process 1234 (mysqld) 的日志,说明系统内存曾经被耗尽过。这类问题排查思路:先用 dmesg | grep -i oom 或者 journalctl -k 确认谁被杀,再用 free -h 看当时的内存水位。如果杀掉的是 MySQL、PHP-FPM 这种核心进程,说明内存确实不够,除了开 Swap、调参数,还要从源头减负:关掉用不到的服务、把 PHP-FPM 的 pm.max_children 调小、给 MySQL 的 buffer pool 设置一个合理上限。
对于确实不能停的关键进程,可以用 oom_score_adj 调整它的被杀优先级,但这只是权宜之计,治标不治本。低配服务器的核心哲学是"少而精":服务装得越少,每个服务分到的资源越多,跑得越稳。
七、常见问题 FAQ
问:Swap 会损坏 SSD 吗? 正常使用下不用担心。现代 SSD 的寿命足以支撑 Swap 的写入量,只要不是频繁换入换出的极端情况,写坏 SSD 的概率极低。相比之下,内存不足导致数据库损坏的风险要大得多。
问:512M 内存能跑 WordPress 吗? 能,但要精简:换轻量主题、装缓存插件、PHP-FPM 的进程数调小、MySQL 的 innodb_buffer_pool_size 调到 64M 左右,再配好 Swap,勉强够用。如果还想再省,可以考虑用 SQLite 的轻量程序替代 MySQL。
问:数据盘挂载后原网站数据要手动搬吗? 对,挂载数据盘不会自动迁移数据,需要手动 rsync 过去再改配置,务必先停服务再迁移,迁完验证无误再删旧数据。
问:swappiness 调成 0 是不是更好? 不建议。完全禁用 Swap 会让系统在内存紧张时直接 OOM。保留少量 Swap 作为缓冲,是更稳妥的选择。
低配服务器的优化没有一招鲜,但把内存、Swap、磁盘这三件事理顺,网站体验立刻会上一个台阶。记住一条主线:让系统始终有富余的内存、有兜底的 Swap、有充足且规划清晰的磁盘空间,剩下的问题基本都是小问题。