深入理解 Linux 上的虚拟内存

系统 Linux
Linux 发行版要求您在安装期间设置虚拟内存空间(交换分区),但大多数初学者并不知道这有多大用处。以下是您需要了解的有关 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/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 number]”行,其中“[swappiness number]”是您想要的 swappiness 编号。在您可以安装更多 RAM 之前,这将是一个权宜之计。

虚拟内存让您的 Linux 系统平稳运行

虚拟内存是现代操作系统(包括 Linux)的一个组件,可让您的计算机平稳运行。您可以使用交换文件,但通常的方法是专用分区。您不必考虑太多,但 Linux 交换分区和交换文件很容易设置和排除故障。

很多这样的建议也适用于其他系统,包括 Windows,即使设置虚拟内存的方法不同。

责任编辑:赵宁宁 来源: Linux迷
相关推荐

2022-10-24 08:48:07

虚拟内存Linux

2019-12-26 08:45:46

Linux虚拟内存

2013-06-20 10:25:56

2021-06-01 08:20:55

Linux虚拟内存命令

2023-11-05 12:05:35

JVM内存

2022-08-21 10:21:07

Linux虚拟内存

2022-07-06 08:05:52

Java对象JVM

2010-06-10 17:12:23

Linux 内存监控

2021-11-26 00:00:48

JVM内存区域

2020-11-04 15:35:13

Golang内存程序员

2021-07-02 06:54:44

Linux内核主调度器

2023-09-19 22:47:39

Java内存

2021-08-31 10:32:11

LinuxPage Cache命令

2023-02-10 08:11:43

Linux系统调用

2022-11-09 08:12:07

2016-08-31 15:41:19

PythonThreadLoca变量

2022-12-28 09:07:41

2017-01-12 19:34:58

2012-11-14 09:57:46

JavaJava虚拟机JVM

2020-04-14 16:03:31

Linux虚拟内存操作系统
点赞
收藏

51CTO技术栈公众号