虚拟内存的存在,让操作系统的各类进程得以持续运转、不至于中断。作为现代操作系统的核心基石之一,虚拟内存平日里往往并不引人注意——除非系统真的出了状况,我们才会想起它的存在。安装Linux发行版时,系统会要求用户设置虚拟内存空间(也就是交换分区),然而不少新手用户其实并不清楚这一步骤究竟有何实际意义。
下面就带大家全面梳理一下Linux虚拟内存的相关知识。
虚拟内存究竟是什么?
简单来说,虚拟内存是从机器的物理内存中抽象提炼出来的一种内存表现形式,它同时调用了RAM与存储设备的空间,不论存储介质是传统机械硬盘还是SSD固态硬盘。
在Linux体系中,这项工作是在内核层面与硬件层面协同完成的。CPU内部配备了一种名为内存管理单元(MMU)的硬件模块,负责将物理内存地址转换为虚拟内存地址,这些转换后的地址与其在机器中的实际物理位置并无直接关联。这类地址空间被称作”页面”,它们既可能驻留在RAM中,也可能存放在硬盘或SSD上。操作系统会把这些地址统一视为一个庞大的内存池,称之为”地址空间”。
虚拟内存的运作逻辑,本质上利用了这样一个客观事实:正在使用中的内存,理论上并非时刻都处于活跃状态。程序在内存中会被拆解为若干页面,内核判断其中暂时不需要的部分,便会将其”换出”,转移至硬盘存放;等到日后再度需要时,再将其”换入”,重新调回RAM当中。
驱动器上专门划出用于虚拟内存的空间,被称为”后备存储”或”交换空间”。在Windows体系中,这一功能通常以文件形式实现,即所谓的”交换文件”。Linux下同样支持这种方式,不过更常见的做法是采用专用磁盘分区来实现。
Linux下的交换文件方式一般多用于最小化系统或嵌入式系统场景,这类嵌入式操作系统由于对体积要求极为苛刻,往往会在完全不配置虚拟内存的情况下运行。
虚拟内存带来的直接效果是,即便实际运行程序所需内存超出了机器自身的物理RAM容量,系统依然能够正常运转——这有点类似信用卡消费:即便账户余额不足,也能完成大额支出。但正如信用卡一样,虚拟内存虽在关键时刻能派上用场,却也不宜过度依赖。
此外,虚拟内存机制还使得开发者在编写应用程序时,无需深入了解计算机内存的具体组织结构。
从历史角度看,虚拟内存最主要的短板在于硬盘的读写速度远逊于RAM。倘若一台机器RAM配置不足,系统便可能陷入无休止的页面交换状态,这一现象被称为”抖动”(thrashing)。不过在如今RAM容量普遍充裕、SSD速度已远超传统机械硬盘的现代PC环境下,这类问题已大为缓解,但仍值得留意。
Linux交换分区配置方法
如前文所述,在Linux系统中配置虚拟内存最常用的方式是采用专用磁盘分区。系统安装程序会自动检测硬件配置,并给出包含交换分区在内的分区建议方案。
当然,你也完全可以在系统安装完成之后再补充设置交换分区。若打算在现有硬盘上新增分区,则需要借助GParted之类的无损分区工具来完成操作,并务必确认将分区的文件系统类型设置为”Linux swap”。
在对硬盘进行重新分区之前,请务必提前备份好重要数据,以防万一。
分区创建完毕后,需使用mkswap命令对其进行格式化: sudo mkswap /dev/sdX
接下来需要以root权限编辑/etc/fstab文件,将交换分区信息添加进去。在文件中加入以下这一行,即可实现开机自动挂载该交换分区: /dev/sdX none swap defaults 0 0
最后使用swapon命令激活新配置的交换空间(其中sdX替换为你实际的交换分区名称): sudo swapon /dev/sdX
在Linux中配置交换文件
借助命令行在Linux系统中设置交换文件其实操作起来相当简便。如果你不想折腾重新分区这一步,可以考虑直接编辑/etc/fstab。其中一种常见做法是借助fallocate命令来实现。
举例来说,若想创建一个2GB大小的交换文件,可执行: sudo fallocate -l 2G /path/to/swapfile
除此之外,也可以选用dd命令来创建交换文件: sudo dd if=/dev/zero of=/path/to/swapfile bs=1024 count=2048
需要特别留意的是,使用dd命令时务必谨慎操作,一旦输入文件与输出文件设置有误,极有可能导致数据丢失。正因如此,相较之下更推荐优先使用fallocate方式。
这里的/dev/zero是一种特殊设备,其作用是持续输出”0″。上述dd命令的实际效果,是利用适合作为交换空间使用的1024KB数据块,创建出一个空白的2GB块文件。
交换文件创建完成后,其后续使用方式与交换分区基本一致,同样可执行mkswap与swapon命令: sudo mkswap /path/to/swapfile sudo swapon /path/to/swapfile
那么该如何抉择——究竟是使用交换文件,还是专用交换分区呢?其实答案相对简单:在绝大多数场景下,建议优先选用分区方式,这也是Linux桌面系统或服务器环境下的最优方案。安装程序自动推荐的分区方案,通常已能很好地满足单用户Linux桌面的使用需求。
而如果你是在虚拟机、小型嵌入式系统中运行Linux,或者单纯不希望对现有Linux系统进行重新分区操作,此时选用交换文件的方式会更为合适。
交换空间该设置多大?
多年来,业界关于交换空间大小的经典建议是:设置为物理RAM容量的两倍。不过如今即便是最经济型的PC,也普遍配备了大容量硬盘与充裕内存,这一传统经验法则的适用性也开始受到一定质疑。
在不少系统环境下,若你打开top或htop工具进行查看,甚至可能会发现——只要系统配置得当,交换空间几乎完全用不上。

尽管如此,若你对内存的使用需求相对较高,将交换空间设置为物理内存的两倍容量,仍不失为一个稳妥的起点与保险策略,后续也可根据实际情况灵活调整。倘若系统的RAM已被占用殆尽,那么在启用虚拟内存时,计算机很可能会遭遇性能方面的瓶颈。
不过放在当下,这已算不上什么大问题,因为即便是入门级PC所配备的RAM容量也已相当充裕,加之SSD的读写速度较传统机械硬盘有了质的飞跃。但这一点依然值得保持关注。
要解决这一问题,最直接的办法便是为计算机加装更多RAM。若这一方案暂时不具备可行性,也可以考虑尝试调整Linux内核的”swappiness”参数。
swappiness数值决定了内核对虚拟内存机制的依赖程度,其取值范围为0到100。设置为0,意味着Linux系统基本不会启用交换机制;设置为100,则系统会随时倾向于进行交换操作。多数系统默认设置该数值为60。
若想临时调整swappiness参数,可使用sysctl命令: sudo sysctl vm.swappiness=20
执行该命令后,”20″这一数值将在系统重启前持续生效。若希望实现永久性修改,则需以root权限编辑/etc/sysctl.conf文件,并在其中加入”vm.swappiness=[目标数值]”这一行,其中”[目标数值]”替换为你期望设置的swappiness参数值。在尚未加装更多RAM之前,这不失为一种权宜性的应对方案。
虚拟内存:保障Linux系统平稳运行的幕后功臣
虚拟内存作为现代操作系统(Linux自然也不例外)的重要组成部分,默默保障着计算机的平稳运行。你既可以选用交换文件的方式,也可以采用更为常见的专用分区方案。日常使用中其实无需为此耗费太多心思,因为无论是Linux交换分区还是交换文件,其配置与排查都相对简便易行。
值得一提的是,上述许多经验建议同样适用于其他操作系统(包括Windows在内),即便不同系统之间设置虚拟内存的具体方式存在差异。
原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/3256.html
