某种条件下,难免会遇到服务器内存不足的情况,这种时候就说明 该升级配置了👍
但是!还可以利用磁盘开启虚拟内存来给物理内存打鸡血👍👍 穷鬼必备(bushi)

美其名曰:节约成本,提高系统稳定性。

⚠️注意:此方法会磁盘 IO 性能 造成一定影响

参考系统环境:Ubuntu 20.04.1 LTS

虚拟内存是啥?

虚拟内存(交换空间),这是一种计算机系统内存管理技术,允许操作系统使用硬盘空间作为扩展的内存。主要目的是在 物理内存(RAM) 不足的情况下能够提供更多的内存资源。

工作原理

  • 内存使用 分页 的方式来进行管理。系统会将物理内存空间分割成固定大小的块,称为 页面,而虚拟内存也是通过在磁盘上划分相同大小的块作为存储单元,称为 页框
  • 物理内存中的 页面 通常分为 活跃不活跃 两种状态,当物理内存中的 页框 不足时,系统会将一部分 不活跃页面 移动到磁盘上的 交换空间 并赋予虚拟的内存地址,此过程为释放物理内存以便加载其他所需的 页面 ,这个过程就是 交换
  • 当程序尝试访问一个虚拟的内存地址时,该地址对应的页面不在物理内存中,就会触发 页面缺失 的机制,系统会从磁盘上的交换空间将所需的 页面 加载到物理内存中以供程序使用

优点与缺点

先说优点:

  1. 可以提高系统的稳定性:虚拟内存可以作为物理内存的扩展。当系统的物理内存耗尽时,虚拟内存可以防止应用程序崩溃或系统无响应。
  2. 更好的支持内存密集型程序:运行例如图像、视频编辑、数据库服务等需要大量内存的程序,虚拟内存可以提供额外的空间,使系统用于更大的数据集处理能力。
  3. 使更多的程序同时运行:让系统“假装”有很多内存,骗谁都不好使,但是能骗过一堆程序。
  4. 节省成本:都说了穷鬼专属,物理内存不足了怎么办,当然是拿钱堆的更好喽,但u1s1服务器的物理内存是很贵的耶。

说说缺点:

  1. 会导致性能下降:毕竟虚拟内存是存放在磁盘里的,一般来说磁盘跑跑起来肯定是没有物理内存那样快的 (如果你说你拿十几二十块 SSD 组阵列就当我没说),当系统频繁使用虚拟内存时,会出现“抖动”情况,即系统大量时间用于交换数据到磁盘,导致计算机性能显著下降,应用程序响应变慢,同时会占用磁盘过多的 IO 性能。
  2. 可能会对磁盘寿命造成影响:谁家机器用 HHD 跑系统啊,都是 SSD ,这玩意是有读写寿命的,当作虚拟内存来使当然随时都在经历擦写活动;但一般情况来说,好的 SSD 设计寿命都很长的,不需要太担心。
  3. 可能存在安全隐患:怎么说呢,内存这玩意得看程序会不会进行数据加密了,毕竟虚拟内存是直接存在磁盘里,是能够直接读取里面的数据的;但总的来说,利用好 Linux 足够厉害的权限机制,以及做好磁盘加密,就不需要太担心了。
  4. 占用硬盘空间:这么说叭,创建一个较大的交换空间会占用相应的磁盘空间,这对于存储空间有限的系统,比如一些小型服务器或嵌入式设备可能是个问题。

正片开始

⚠️本文方法在 Ubuntu 20.04.1 LTS 系统中已得到验证,对于其他系统仅作为参考使用

  • 本文内用到的所有演示的交换文件路径为 /root/swap
  • 此交换文件路径可以自行设置,当然也可以将它放在根目录下,比如 /swapfile
  • 本文对配置文件的修改操作默认使用 nano 编辑器进行演示,也包含一点点 vim 编辑器的基本操作,请熟知
  • 参考本文中出现的命令及操作需熟知其作用,请勿随意使用未经验证的命令,例如 “sudo rm *” 之类危险系数极高的命令,对于随意使用所造成的一切后果,博主无责也没有义务负责

开始操作的第一步:

?当然是打开终端了🤣🤣

首次创建虚拟内存:

1. 使用 dd 命令创建一个块大小为 1M ,总量为 1GB 的空白交换文件

这里使用 dd 命令是因为几乎所有类 Unix 的操作系统都支持,同时也是 Linux 核心工具的一部分,但似乎 macOS 也能用。

sudo dd if=/dev/zero of=/root/swap bs=1M count=1024

2. 出于安全考虑,需要将这个交换文件的权限设置为 600 ,确保只能由 root 用户可以进行操作

sudo chmod 600 /root/swap

3. 将这个空白的交换文件格了,让其变成交换空间

sudo mkswap /root/swap

4. 启用这个交换空间,让系统好生使用它

sudo swapon /root/swap

5. 使用 echo 和 tee 命令将交换文件信息写入 /etc/fstab ,以便系统启动时自动启用

这里不一定必须用这种方法,改写配置文件的方法有很多种呢

echo '/root/swap none swap sw 0 0' | sudo tee -a /etc/fstab

6. 做完上述操作后,记得检查一下虚拟内存是否开启成功;如果使用命令后能够看刚才启用的那个交换空间,那就没问题了

free -h


对虚拟内存进行调整:

1. 先停用之前创建的交换空间

sudo swapoff /root/swap

2. 此后与创建首次创建虚拟内存的操作方法一样,这里方便演示将总量改为 2GB

sudo dd if=/dev/zero of=/root/swap bs=1M count=2048

3. 还是出于安全考虑,重复操作,以防万一

sudo chmod 600 /root/swap

4. 格式化这个交换文件

sudo mkswap /root/swap

5. 启用这个交换空间

sudo swapon /root/swap

6. 由于之前已经将交换文件信息写进 /etc/fstab 中了,这里是进行一次验证,如果没有的话请自行参考“首次创建虚拟内存/第五项”

cat /etc/fstab

7. 检查一下虚拟内存是否开启成功

free -h


附加内容

调整系统对虚拟内存的使用倾向(使用频率)

在 Linux 内核中有一条名为 “Swappiness” 的参数
这个参数定义了系统使用交换空间的倾向,参数的取值范围是从 0 至 100
“0” 表示尽量不使用交换空间,其意义为只有在物理内存不足时才使用交换空间
“100” 则表示积极使用交换空间,即使有足够的物理内存也会频繁将数据写入交换空间。

1. 使用 nano 打开系统配置文件 /etc/sysctl.conf

可以根据自己的喜好来进行编辑,此处默认使用 nano 编辑器进行操作

sudo nano /etc/sysctl.conf

2. 找到 vm.swappiness=** 的参数(如果没有可以手动在底部添加)

这里推荐的数值为”20”,即当物理内存使用率达到80%,系统会开始倾向于将一些不活跃的页面写入到交换空间中

vm.swappiness=20

3. 保存并退出编辑器

在 nano 中,按 Ctrl + O 是保存,按 Ctrl + X 为退出
如果是 vim ,操作方法为,使用 "vim /etc/sysctl.conf " 打开文件,按 [ I ] 进入编辑模式,编辑完成后依次按下 [ESC] > [ : ] > [W] > [Q] > [ENTER] 进行保存

4. 应用更改,让系统重新载入配置文件

sudo sysctl -p

关闭虚拟内存

如果某天你不想使用虚拟内存了,可以将其关掉,那样就会单纯的使用物理内存来运行系统和程序

1. 将设定的交换空间停用

sudo swapoff /root/swap

2. 打开 /etc/fstab ,删掉之前设定的虚拟内存自动开启参数

sudo nano /etc/fstab

3. 找到之前添加过的参数,并将其删掉

# 类似于此处表示的参数
/root/swap none swap sw 0 0

4. 保存并退出编辑器

在 nano 中,按 Ctrl + O 是保存,按 Ctrl + X 为退出
如果是 vim ,操作方法为,使用 "vim /etc/fstab " 打开文件,按 [ I ] 进入编辑模式,编辑完成后依次按下 [ESC] > [ : ] > [W] > [Q] > [ENTER] 进行保存

5. (可选)删除之前创建的交换文件

sudo rm /root/swap


⚠️ 如果你喜欢这篇文章,可以将本文链接收藏起来,请勿直接照搬此文章内容,如需转载请标注来源,这是对博主最大的尊重,谢谢!

Q.E.D.


内心幼稚,喜欢画画,爱听音乐的零零后男孩纸