抖音优化

douyinyouhua

Linux服务器为什么要建立虚拟内存?虚拟内存不足怎么办?

2026-09-16 22:28:43

Linux服务器建立虚拟内存,本质是给物理内存加一道溢出缓冲,确保系统在内存紧张时仍能稳定运行,避免因内存耗尽直接崩溃或触发OOM Killer误杀关键进程。

这是一个老生常谈却常被误解的话题,很多刚接触服务器运维的朋友会问,物理内存都这么大了,为什么还非要弄个swap分区出来?这不是占硬盘空间吗?今天咱们就把这件事说透。

物理内存的瓶颈,决定了虚拟内存存在的必要性

Linux服务器的运行逻辑很简单,所有正在运行的程序都要占内存,物理内存是有限的,当程序们把内存瓜分殆尽时,系统不会停下来等你加内存条,它有自己的应对机制,此时虚拟内存就登场了,它把硬盘上划出一块区域,当作内存的延伸来用。

内存不够用时的两种结果

当物理内存耗尽,Linux内核面临两个选择:

  • 触发OOM Killer:内核会按照评分机制挑选一个进程直接杀掉,腾出内存,这个机制是六亲不认的,它可能杀掉占用内存最大的进程,而这个进程恰恰是你的数据库或Web服务,生产环境里MySQL或Nginx被OOM Killer干掉的情况,大多发生在没有配置swap或swap太小的时候。
  • 使用swap空间:内核把一部分暂时不用的内存数据,挪到硬盘上的swap分区里,腾出物理内存给当前急需的程序,这个过程叫换出,等需要那些数据时再从硬盘换回内存。

简单说,swap是保底方案,没有它,内存一满系统就靠杀进程续命,有了它系统还能多扛一阵子。

内存分配的突发峰值

一个常见的场景是,服务器平时内存占用70%,看起来挺健康,结果某个瞬间,有人跑了一个批量任务,或者访问量突然涨了一波,内存占用瞬间冲到98%,这时候swap的作用就出来了,它接住这部分突发的压力,让系统不至于马上陷入僵局,等高峰期过去,swap里的数据再慢慢换回内存。

业内专家指出,绝大多数生产环境的Linux服务器都应该保留一定量的swap空间,尤其是物理内存较小的云服务器。

linux服务器虚拟内存的几个核心作用

虚拟内存不只是“内存不够用时的备胎”,它还有几个更深层的作用。

保障关键进程的存活率

没有swap的服务器,内存一旦告急,内核的OOM Killer就会出动,这个机制虽然本意是保护系统,但它选择杀谁有自己的算法,并不会考虑哪个进程对你更重要,大多数情况下,它杀的是占用内存最大的那个进程。

假设你的服务器跑着Java应用,Java进程占了4G内存,Redis占了2G,内存满了之后OOM Killer大概率会把Java进程干掉,但如果你配了4G的swap,Redis的数据会有一部分被换到swap里,Java进程反而能继续跑,对于生产环境,

Linux服务器为什么要建立虚拟内存?虚拟内存不足怎么办?

进程活着比运行速度更重要,哪怕慢一点,也比直接挂掉强。

允许内存超量分配,提高硬件利用率

Linux内核默认采用乐观内存分配策略,进程申请内存时,内核不一定非要立刻给它真实的物理内存,而是先记账,真正写入数据的时候才分配。

这种策略下,你可以在一台物理内存只有2G的服务器上,同时跑好几个加起来超过2G的程序,只要它们不是同时把所有内存占满,用swap做缓冲,系统就能稳定运行,这个特性对企业来说,意味着用更低的硬件成本支撑更多的业务进程,也就是多卖几台低配云服务器的底气所在。

应对内存泄漏和异常进程

程序写得不严谨,就会出现内存泄漏,吃着吃着内存就收不回来了,物理内存被一点点蚕食,系统越来越卡,这时候如果有swap兜底,虽然系统也会因为频繁换页而变慢,但至少还能用,你还能登录上去排查问题、手动杀进程,反过来,没有swap,内存泄漏直接让系统卡死,SSH都连不上,只能重启服务器,问题反而更难定位。

swap分区多大合适,常见误区要避开

常看到有人问,linux云服务器虚拟内存设置多少合适?其实这个没有绝对的标准答案,但有一个行业共识可以参考。

物理内存与swap的常见配比

物理内存大小 推荐swap大小 适用场景
2G以下 物理内存的2倍 低配云服务器,跑中小型Web服务
2G-8G 物理内存的1-1.5倍 常见生产环境,数据库与应用共存
8G-32G 8G-16G固定值 内存充裕,swap主要用于防止极端峰值
32G以上 视业务而定,可设为8G-16G 大内存机器,主要用于休眠和兜底

这套配比来自多年运维实践,当物理内存达到一定规模后,swap太大反而会拖慢整体性能,因为硬盘和内存的速度差距是数量级的。

swap越大越好

swap作用很大,但swap不是内存,它的速度远不如物理内存,频繁的换入换出会让硬盘成I/O瓶颈,进程响应变得很慢,如果swap使用率长期居高不下,且swap的I/O等待时间很高,这说明物理内存是真的不够用了,正确做法是加内存,而不是继续扩大swap。

SSD服务器可以完全不要swap

现在很多云服务器用SSD,读写速度确实快,这让

Linux服务器为什么要建立虚拟内存?虚拟内存不足怎么办?

一些人觉得不需要swap了,这个想法有一定道理但不完全对,即便SSD再快,和DDR4内存相比仍有成百上千倍的延迟差距,而且SSD有写入寿命,频繁的swap读写会加速硬盘老化,但话说回来,在SSD上配置少量swap(比如2-4G)应对突发峰值,仍是绝大多数云厂商的默认做法。

server虚拟内存的实操配置方法

了解原理之后,接下来说说怎么配,如果你用的是云服务器厂商的控制面板,有些会直接在系统盘里预留swap分区,有些是干净的镜像,需要自己配swap文件。

如何查看当前swap使用情况

登录服务器后,执行以下命令:

free -h
swapon --show

free -h能看到swap的总量、已用量和剩余量。swapon --show能看到swap文件或分区的路径,如果这两条命令都没输出,说明你的服务器目前没有启用虚拟内存听起来像笑话,但实际上很多云服务器默认确实不带swap。

用swap文件创建虚拟内存的步骤

当前主流做法是用swap文件而非单独的分区,因为文件不需要重新划分磁盘,灵活性更高。

# 创建一个4G大小的swap文件
dd if=/dev/zero of=/swapfile bs=1M count=4096
# 设置权限,避免普通用户读取
chmod 600 /swapfile
# 格式化为swap格式
mkswap /swapfile
# 启用swap
swapon /swapfile
# 写入fstab实现开机自动挂载
echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab

注意,创建swap文件时,bs=1M count=4096就是生成4G的交换文件,数值按需修改,用dd命令的时候,确保磁盘剩余空间足够,否则会报错。

调节swappiness参数,控制swap使用的激进程度

swappiness是一个内核参数,取值范围0到100,默认通常是60,它决定了内核倾向于使用物理内存还是swap的权重。

  • 数值越小,越不积极使用swap,优先用物理内存
  • 数值越大,越愿意把数据换到swap,给物理内存留更多空闲
# 查看当前值
sysctl vm.swappiness
# 临时修改为10(重启失效)
sysctl vm.swappiness=10
# 永久修改
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

对于数据库服务器,建议改为10-20,避免swap拖慢数据库读写,对于内存较小的Web服务器,建议保持默认或设为60,增强稳定性。

内存紧张时的排查步骤

当感觉服务器变慢,怀疑swap在频繁工作时,按顺序排查:

  1. 执行free -h查看内存和swap的占用比例
  2. 执行vmstat 1 5观察si和so两列,这两个值分别代表从swap换入和换出的数据量
  3. Linux服务器为什么要建立虚拟内存?虚拟内存不足怎么办?

  4. 执行top按shift+m按内存排序,找出占内存最高的进程
  5. 用ps aux --sort=-%mem | head -20列出具体进程的内存占用排名

如果si和so持续有数值输出,说明内存确实吃紧,系统正在频繁换页,需要优化业务或扩容。

linux服务器合适的swap配置场景对比

不同场景对swap的需求不一样,列出来对比更直观。

1核2G的轻量云服务器

这种配置大多用来跑个人博客、小型应用或做测试环境,内存必须精打细算,建议配置2G-4G的swap,即便内存不大,但有了swap,能防止某个瞬间并发上来直接OOM,对这类低配服务器,swap可以说是救命稻草。

数据库服务器

数据库是重度内存使用者,也比较忌讳磁盘交换,因为磁盘I/O会拖垮SQL查询速度,行业共识是,数据库服务器的swap主要用来防OOM,不宜设置过大,4G-8G即可,同时要把vm.swappiness调低到10左右,让数据库进程尽量驻留在物理内存中。

内存型应用服务器(如Java、Elasticsearch)

Java应用默认的堆内存设置往往会吃掉大量物理内存,这类服务器上,swap大小与物理内存配比可以是1:1到1:1.5,如果不配swap,JVM在GC(垃圾回收)时内存瞬间飙升,很容易被内核干掉。

虚拟内存常见问题答疑

swap分区和swap文件有什么区别?

swap分区是磁盘上划分出来的独立区域,在安装系统时完成规划,优点是连续存储、性能略好,swap文件是存放在现有文件系统里的一个普通文件,用mkswap格式化后用作交换空间,优点是随时可以创建、调整大小,不需要重新分区硬盘,对于云服务器来说,swap文件更灵活,推荐优先使用。

虚拟内存设置多大对游戏服务器适用?

游戏服务器和普通Web服务器的区别在于,它需要承载大量长连接和实时交互,建议内存与swap的比例为1:1,比如8G内存配8G swap,因为网络游戏服务器经常遇到玩家同时上线的高峰流量,内存会在瞬间被占满,swap能延缓OOM的发生,给负载均衡分流和弹性扩容争取时间。

不建立虚拟内存,Linux服务器会直接死机吗?

通常不会立刻死机,内核会先触发OOM Killer杀进程来释放内存,如果你的服务进程被杀掉,表面上系统没死机,但服务已经挂了,这种“假死”状态在生产环境里比直接宕机更难处理,所以对正经跑业务的服务器来说,虚拟内存不是可选项,而是必需项,物理内存再大,也建议至少留出2G的swap作为兜底。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待