blog/docs/tech/How-to-Add-Swap-Space-on-Ubuntu-2404.md
2024-07-26 02:07:14 +08:00

214 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 在 Ubuntu 24.04 上添加交换空间
## 检查交换内存情况
在开始之前,我们可以检查系统是否已经有可用的交换空间。
``` bash
sudo swapon --show
```
``` title="输出"
NAME TYPE SIZE USED PRIO
/swapfile file 8G 135.2M -2
```
如果有类似上述的输出,这意味着系统目前有可用的交换空间。
如果没有任何输出,这意味着系统目前没有可用的交换空间。
你可以使用 `free` 来验证是否存在活动交换空间:
``` bash
free -h
```
``` title="输出" hl_lines="3"
total used free shared buff/cache available
Mem: 1.9Gi 995Mi 95Mi 51Mi 872Mi 724Mi
Swap: 8.0Gi 135Mi 7.9Gi
```
从以上输出结果的 `Swap` 行可以看到,系统上已经有可用的交换空间。
``` title="输出" hl_lines="3"
total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B
```
从以上输出结果的 `Swap` 行可以看到,系统上目前没有可用的交换空间。
## 创建交换文件
我们将在根目录 (/) 下分配一个交换文件,名为 `swapfile`。
创建交换文件的最佳方法是使用 `fallocate`。
我们将在本指南中创建一个 8G 的交换文件,请根据自己服务器的需要进行调整:
``` bash
sudo fallocate -l 8G /swapfile
```
验证一下是否预留了正确的空间:
``` bash
ls -lh /swapfile
```
``` title="输出"
-rw-r--r-- 1 root root 8.0G Jul 23 18:33 /swapfile
```
## 启用交换文件
首先,我们需要锁定文件的权限,只有拥有 root 权限的用户才能读取交换文件的内容。
这样,普通用户就无法访问该文件,否则会产生重大安全隐患。
``` bash
sudo chmod 600 /swapfile
```
验证权限更改:
``` bash
ls -lh /swapfile
```
``` title="输出"
-rw------- 1 root root 8.0G Jul 23 18:33 /swapfile
```
现在,我们可以输入以下命令将刚刚创建的文件标记为交换文件:
``` bash
sudo mkswap /swapfile
```
``` title="输出"
Setting up swapspace version 1, size = 8192 MiB (8589934592 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
```
标记交换文件后,我们可以启用交换文件,让我们启用它:
``` bash
sudo swapon /swapfile
```
验证交换文件是否可用:
``` title="输出"
NAME TYPE SIZE USED PRIO
/swapfile file 8G 135.2M -2
```
## 交换文件设置持久化
上述操作启用了交换文件,但仅在本次会话有效。
我们可以通过在 `/etc/fstab` 文件中添加 swap 记录来使交换文件设置持久化。
备份 `/etc/fstab` 文件,以防出错:
``` bash
sudo cp /etc/fstab /etc/fstab.bak
```
将 swap 记录添加到 `/etc/fstab` 文件末尾:
``` bash
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
```
## 调整相关设置
添加好交换文件后,我们可以配置一些对系统性能有影响的选项。
### 调整 swappiness 属性
`swappiness` 参数用于配置系统将数据从内存交换到交换空间的频率。该值介于 0 和 100 之间,代表一个百分比。
当值接近 0 时,除非绝对必要,内核不会将数据交换到磁盘上。这将会告诉系统不要过度依赖交换文件,通常会让系统运行得更快。
请记住,与交换文件的交互是更耗时的,因为它们比与内存的交互耗时更长,而且会导致性能大幅下降。
接近 100 的值会尝试将更多数据放入交换空间,以保持更多可用内存空间。根据应用程序的内存配置文件或服务器的用途,在某些情况下这样做可能更好。
我们可以通过以下命令来查看当前的 `swappiness` 值:
``` bash
cat /proc/sys/vm/swappiness
```
``` title="输出"
60
```
对于台式机来说,交换性设置为 60 也不错。对于服务器,我建议将其调整接近于 0。
我们可以使用 `sysctl` 命令将 `swappiness` 参数设置为不同的值。
例如,要将 `swappiness` 参数设置为 10我们可以输入
``` bash
sudo sysctl vm.swappiness=10
```
``` title="输出"
vm.swappiness = 10
```
以上设置仅在本次会话有效,因此我们可以在 `/etc/sysctl.conf` 文件中添加这一行,在重启时自动设置该值:
``` bash
sudo nano /etc/sysctl.conf
```
在 `/etc/sysctl.conf` 文件底部,您可以添加:
``` title="/etc/sysctl.conf"
vm.swappiness=10
```
### 调整 cache pressure 设置
另一个需要修改的相关值是 `vfs_cache_pressure`。
基本上,这是有关文件系统的访问数据。 一般来说,这些数据的查询成本很高,而且请求频率也很高,因此是系统缓存的最佳内容。
你可以通过再次查询 `proc` 文件系统来查看当前值:
``` bash
cat /proc/sys/vm/vfs_cache_pressure
```
``` title="输出"
100
```
按照目前的配置,我们的系统从缓存中删除 `inode` 信息的速度太快。
我们可以将其设置为更保守的值,比如 50只需输入
``` bash
sudo sysctl vm.vfs_cache_pressure=50
```
``` title="输出"
vm.vfs_cache_pressure = 50
```
同样,这只对当前会话有效。我们可以将其添加到配置文件中进行更改,就像刚才的设置一样:
``` bash
sudo nano /etc/sysctl.conf
```
在 `/etc/sysctl.conf` 文件底部添加:
``` title="/etc/sysctl.conf"
vm.vfs_cache_pressure=50
```