快报:深入理解 Linux 上的虚拟内存
2022-08-21 21:02:20来源:Linux迷
虚拟内存可帮助操作系统在不中断的情况下执行其进程。虚拟内存是现代操作系统的基础之一,但通常情况下,除非遇到问题,否则您也可能不会真正考虑它。Linux 发行版要求您在安装期间设置虚拟内存空间(交换分区),但大多数初学者并不知道这有多大用处。
以下是您需要了解的有关 Linux 上的虚拟内存的所有信息。
什么是虚拟内存?虚拟内存是从机器物理内存中提取出来的一种表示内存的方式。它利用了你的 RAM 和你的存储空间,无论是在传统的硬盘驱动器还是 SSD 上。
【资料图】
在 Linux 中,这是在内核和硬件级别完成的。CPU 有一个称为内存管理单元 (MMU) 的硬件,它将物理内存地址转换为虚拟内存地址。这些地址与它们在机器上的物理位置无关。这些地址空间被称为“页面”,它们可能位于 RAM 中,也可能位于您的硬盘驱动器或 SSD 中。操作系统将这些地址视为一个大内存池,称为“地址空间”。
虚拟内存利用了这样一个事实,即理论上并非所有正在使用的内存都一直在使用。内存中的程序被分解成页面,内核认为不必要的部分被“换出”或移动到硬盘驱动器。当需要它们时,可以将它们“换入”或带回 RAM。
驱动器上用于虚拟内存的空间称为“后备存储”或“交换空间”。在 Windows 世界中,它通常被实现为一个文件,称为“交换文件”。在 Linux 中也可以这样做,但使用专用磁盘分区更为常见。
Linux 上的交换文件通常保留给最小系统或嵌入式系统,后者通常在完全没有虚拟内存的情况下运行,因为嵌入式操作系统必须很小。
虚拟内存的结果是,可以通过使用比机器中的物理 RAM 更多的内存来运行大型程序,类似于信用卡可以让您以比银行账户中更多的钱进行大宗购买。就像信用卡一样,虚拟内存在您需要时很有用,但您不想过度使用它。
虚拟内存还允许开发人员创建应用程序,而不必知道计算机的内存是如何组织的。
历史上虚拟内存的主要缺点是硬盘驱动器比 RAM 慢。如果一台机器没有足够的 RAM,系统可以无休止地交换页面,这个过程被称为“抖动”。在具有更多 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 命令所做的是使用适合用作交换空间的 1024 KB 块创建一个空白的 2 GB 块文件。
然后,您可以像使用交换分区一样对交换文件使用mkswap和swapon命令:
sudo mkswap /path/to/swapfilesudo 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 number]”行,其中“[swappiness number]”是您想要的 swappiness 编号。在您可以安装更多 RAM 之前,这将是一个权宜之计。
虚拟内存让您的 Linux 系统平稳运行虚拟内存是现代操作系统(包括 Linux)的一个组件,可让您的计算机平稳运行。您可以使用交换文件,但通常的方法是专用分区。您不必考虑太多,但 Linux 交换分区和交换文件很容易设置和排除故障。
很多这样的建议也适用于其他系统,包括 Windows,即使设置虚拟内存的方法不同。