Linux虚拟内存(swap空间)设置

当我们使用阿里云 ECS 服务器,运行 Linux 操作系统时,如果物理内存不足,可以通过设置虚拟内存(也称为交换空间或swap空间)来使用磁盘空间作为额外的内存资源。

配置修改

以阿里云ECS Anolis OS 8.2 RHCK 64位操作系统为例,创建并配置一个大小为2G的交换文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 使用dd命令创建一个指定大小的交换文件。以下命令创建一个2GB的交换文件/swap/swapfile
sudo mkdir -p /swap 
# 这个命令执行非常慢可能是磁盘I/O性能较差或者其他系统资源争用的问题。可使用 fallocate 替换。
# sudo dd if=/dev/zero of=/swap/swapfile bs=1G count=2

# fallocate 是一个更高效的工具,用于立即分配文件空间,而不需要实际写入数据
sudo fallocate -l 2G /swap/swapfile
# 设置交换文件权限
sudo chmod 600 /swap/swapfile
# 使用mkswap命令将交换文件格式化为交换空间
sudo mkswap /swap/swapfile
# 使用swapon命令启用交换文件,使其立即生效
sudo swapon /swap/swapfile
# 设置开机自动挂载
echo "/swap/swapfile none swap defaults 0 0" >> /etc/fstab
# 设置swappiness参数值为30
sudo sed -i 's/^vm.swappiness = 0/vm.swappiness = 30/' /etc/sysctl.conf
sudo sysctl -p
# 验证
swapon -s
free -h

设置swappiness参数

  • 查看当前的swappiness值:使用cat /proc/sys/vm/swappiness命令可以查看当前的swappiness值。
  • 临时更改swappiness值:可以使用sysctl命令临时更改swappiness值,例如,将swappiness值设置为10,可以使用命令sudo sysctl vm.swappiness=10。这种更改在系统重启后会失效。
  • 永久更改swappiness值:为了在系统重启后保持更改,需要将新的swappiness值添加到/etc/sysctl.conf文件中。编辑该文件,添加或修改行vm.swappiness=10(以你希望的值为准),然后保存并关闭文件。之后,运行sudo sysctl -p命令来重新加载配置,使更改生效。
设置swappiness参数的意义

Swappiness参数的值范围从0到100,不同的值代表了内核在物理内存和交换空间之间选择的不同策略:

  • 低值(如0或接近0):内核会尽量避免使用交换空间,即使物理内存使用率达到较高水平,也会优先保留物理内存中的数据,这有助于减少磁盘I/O操作,提高系统响应速度。然而,在某些情况下,如果物理内存真的非常紧张,系统仍然可能会使用交换空间。
  • 高值(如100):内核会积极使用交换空间,即使物理内存还有剩余空间,也可能会将一些不常用的内存页面交换到磁盘上,以释放物理内存供其他进程使用。这种做法可能会导致频繁的磁盘I/O操作,降低系统性能。
  • 中间值(如默认值60):内核会在物理内存使用到一定程度后(如剩余物理内存低于40%),开始考虑使用交换空间。这是一个折衷的方案,旨在平衡内存使用和磁盘I/O性能。

交换空间(Swap Space)是硬盘上的一个特殊区域,被操作系统用作虚拟内存。当系统的物理内存(RAM)不足时,操作系统会将一部分数据移动到交换空间,以释放RAM上的空间,这个过程被称为“交换”(Swapping)或“页面交换”(Paging)。交换空间的存在确保了系统能够在物理内存不足时继续运行,而不会因内存耗尽而崩溃。