在 Linux 机器上,我们可以通过如下命令启用交换
sudo fallocate -l 500M /data/swapfile
sudo chmod 600 /data/swapfile
sudo mkswap /data/swapfile
sudo swapon /data/swapfile
但即使未启用此功能,当页面不在内存中时,内核仍会进行分页。
我们可以通过sar -B 1 30
在不设置任何交换文件的机器上运行命令来验证这一点。
03:08:40 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
03:08:41 AM 0.00 0.00 3.00 0.00 44.00 0.00 0.00 0.00 0.00
03:08:42 AM 0.00 0.00 19.00 0.00 30.00 0.00 0.00 0.00 0.00
03:08:43 AM 0.00 0.00 0.00 0.00 3.00 0.00 0.00 0.00 0.00
03:08:44 AM 24.00 0.00 2.00 1.00 7.00 0.00 0.00 0.00 0.00
03:08:45 AM 364.00 60.00 18.00 3.00 4.00 0.00 0.00 0.00 0.00
03:08:46 AM 140.00 0.00 392.00 2.00 243.00 0.00 0.00 0.00 0.00
仍然有majflt会触发将数据分页到磁盘。
我的问题是:
- 我们可以说操作系统上有两种类型的交换吗?
- 这两种机制的工作方式有何不同?
- 如果总有分页机制在工作,为什么还需要手动启用交换?
我知道有人说:
交换是指将整个进程地址空间,或者无论如何,不可共享的文本数据段,一次复制到交换设备,或者复制回来(通常是磁盘)。
而分页是指复制入/出地址空间的一页或多页。特别是,这是一个更精细的粒度。例如,在 1 GB RAM 地址空间中有约 250,000 个 4 KB 页。
但是,在《Understanding the Linux Virtual Memory Manager 》一书中,Linux中似乎并非如此。
严格来说,Linux 没有交换,因为“交换”是指将整个进程地址空间复制到磁盘,而“分页”是指复制出单个页面。Linux 实际上实现了分页,因为现代硬件支持它,但传统上在讨论和文档中将其称为交换。为了与该词的 Linux 用法保持一致,我们也将其称为交换。
有人可以对此有所了解吗?谢谢!
现代操作系统通常以称为页面的小块来实现其虚拟内存,包括换出到磁盘。与早期的 UNIX System V 一样,需要更换整个程序,这是一个改进。
一些人强调分页与旧的交换不同,包括在了解 Linux 虚拟内存管理器中。但请注意,交换术语仍然存在。
令人困惑的是,交换只是分页的一个子集。可执行文件或内存映射文件是页面错误可以独立于交换空间发生的示例。这些文件映射已经由永久存储支持。相反,交换空间在匿名页面周围移动。
因此,分页统计信息是与换入/换出
sar
不同的指标。vmstat
没有交换空间,就没有办法回收匿名页面。工作负载仍然需要它们的内存,因此文件缓存的压力更大。 添加一些交换空间也有助于快速移动。它没有帮助,因为“紧急内存”,积极回收缓慢的交换空间对性能来说是可怕的。
打个比方:考虑搬家。内存分配的“时间表”可能会迫使内核“移动者”在时间紧迫的情况下匆忙处理并移动所有内容。添加一个外部储物柜,不需要立即使用的东西可以提前以较少破坏性的较小负载存储在那里。那是有效使用的交换空间。
即使您没有启用交换,但内核仍然使用虚拟内存
在linux中进程定义结构是内核内存(逻辑地址),这意味着在内存不足的情况下,Linux内核不会换出进程结构。
Linux不像solaris那样交换自己,Solaris也交换进程的内核结构。
几乎每个操作系统都使用分页将虚拟内存转换为物理内存
Linux 使用页面回收系统在内存不足或用户数据未使用的页面的情况下释放内存,因此使用交换。
与用户空间相关的进程页面被称为虚拟内存,这些用户页面可以最终进入交换空间。
其中许多术语对 unix 来说是通用的,在 linux 和 unix 之间存在一些小的差异
进程段 text、data、s tack、bss、heap 驻留在用户空间中。