介绍
在应用程序中防止内存不足错误的一种方法是为服务器添加一些交换空间。在本指南中,我们将介绍如何向 Ubuntu 22.04 服务器添加交换文件。
什么是交换空间?
交换空间是硬盘存储的一部分,已被设置为操作系统临时存储无法放入 RAM 中的数据。这使您可以增加服务器可以保存在其工作内存中的信息量,但有一些注意事项。硬盘上的交换空间主要在 RAM 不足以容纳正在使用的应用程序数据时使用。
写入磁盘的信息将比保留在 RAM 中的信息慢得多,但操作系统会更倾向于将正在运行的应用程序数据保持在内存中,并使用交换空间来存储较旧的数据。总的来说,对于具有非固态硬盘存储可用的系统来说,将交换空间作为系统 RAM 耗尽时的备用选择可以成为防止内存不足异常的良好安全网。
步骤1 – 检查系统中的交换信息
在开始之前,我们可以检查系统是否已经有一些交换空间可用。系统可能有多个交换文件或交换分区,但通常一个应该足够。
我们可以通过输入以下命令来查看系统是否配置了任何交换:
如果没有返回任何输出,这意味着您的系统当前没有可用的交换空间。
您可以使用free
实用程序验证没有活动的交换:
Output total used free shared buff/cache available
Mem: 981Mi 122Mi 647Mi 0.0Ki 211Mi 714Mi
Swap: 0B 0B 0B
正如您在输出的交换行中所看到的,系统上没有活动的交换。
步骤2 – 检查硬盘分区上的可用空间
在创建交换文件之前,我们将检查当前磁盘使用情况,以确保我们有足够的空间。通过输入以下命令来执行此操作:
OutputFilesystem Size Used Avail Use% Mounted on
udev 474M 0 474M 0% /dev
tmpfs 99M 932K 98M 1% /run
/dev/vda1 25G 1.4G 23G 7% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
/dev/vda15 105M 3.9M 101M 4% /boot/efi
/dev/loop0 55M 55M 0 100% /snap/core18/1705
/dev/loop1 69M 69M 0 100% /snap/lxd/14804
/dev/loop2 28M 28M 0 100% /snap/snapd/7264
tmpfs 99M 0 99M 0% /run/user/1000
在挂载点
列中带有/
的设备是我们的磁盘。在这个例子中,我们有足够的空间可用(只使用了1.4G)。您的使用情况可能会有所不同。
虽然有很多关于交换空间适当大小的意见,但实际上这取决于您的个人偏好和应用程序的需求。一般来说,与系统上的RAM相等或是其两倍的空间是一个不错的起点。另一个好的经验法则是,如果您只是将其用作RAM备用,那么超过4G的交换空间可能是不必要的。
步骤3 – 创建交换文件
现在我们知道了可用的硬盘空间,我们可以在文件系统上创建一个交换文件。我们将在根目录(/
)中分配一个我们想要的大小的文件,称为swapfile
。
创建交换文件的最佳方式是使用fallocate
程序。此命令会立即创建指定大小的文件。
由于我们示例中的服务器有1G的RAM,我们将在本指南中创建一个1G的文件。请根据您自己服务器的需求进行调整:
我们可以通过输入以下命令来验证正确的空间量是否已被保留:
我们的文件已经创建,并正确设置了一定量的空间。
步骤4 – 启用交换文件
现在我们有一个正确大小的文件可用,我们需要将其转换为交换空间。
首先,我们需要锁定文件的权限,以便只有具有root权限的用户才能读取内容。这可以防止普通用户访问文件,这可能会带来重大的安全隐患。
通过输入以下命令将文件设置为仅限root访问:
通过输入以下命令验证权限更改:
Output-rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
可以看到,只有root用户启用了读取和写入标志。
现在,我们可以通过输入以下命令将文件标记为交换空间:
OutputSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
标记文件后,我们可以启用交换文件,让我们的系统开始使用它:
通过输入以下命令验证交换是否可用:
OutputNAME TYPE SIZE USED PRIO
/swapfile file 1024M 0B -2
我们可以再次检查free
实用程序的输出,以证实我们的发现:
Output total used free shared buff/cache available
Mem: 981Mi 123Mi 644Mi 0.0Ki 213Mi 714Mi
Swap: 1.0Gi 0B 1.0Gi
我们成功设置了交换空间,操作系统将根据需要开始使用它。
步骤5 – 使交换文件永久
我们最近的更改已经为当前会话启用了交换文件。但是,如果重新启动,服务器将不会自动保留交换设置。我们可以通过将交换文件添加到我们的/etc/fstab
文件中来更改这一点。
在出现问题的情况下备份/etc/fstab
文件:
将交换文件信息添加到您的/etc/fstab
文件的末尾,键入:
接下来,我们将审查一些可以更新以调整交换空间的设置。
第6步 – 调整交换设置
有几个选项可以配置,这些选项会影响您的系统在处理交换时的性能。
调整Swappiness属性
swappiness
参数配置系统将数据从RAM交换到交换空间的频率。这是一个介于0和100之间的值,表示一个百分比。
当值接近零时,内核只有在绝对必要时才会将数据交换到磁盘上。请记住,与RAM的交互比与交换文件的交互要“昂贵”得多,并且可能会导致性能显著降低。告诉系统不要过多地依赖交换通常会使您的系统更快。
接近100的值会尝试将更多数据放入交换空间,以保持更多的RAM空间空闲。根据您的应用程序内存配置文件或您为何使用服务器,这在某些情况下可能更好。
我们可以通过输入以下命令来查看当前的 swappiness 值:
Output60
对于桌面环境,swappiness 设置为 60 不是一个坏值。对于服务器,您可能希望将其调整到接近 0。
我们可以使用 sysctl
命令将 swappiness 设置为不同的值。
例如,要将 swappiness 设置为 10,我们可以输入:
Outputvm.swappiness = 10
这个设置将持续到下一次重新启动。我们可以通过将以下行添加到我们的 /etc/sysctl.conf
文件中,在重新启动时自动设置这个值:
在文件底部,您可以添加:
vm.swappiness=10
完成后保存并关闭文件。
调整缓存压力设置
您可能希望修改的另一个相关值是 vfs_cache_pressure
。此设置配置系统在缓存 inode 和 dentry 信息而不是其他数据时的选择程度。
基本上,这是有关文件系统的访问数据。这通常是非常昂贵的查找并且非常频繁地被请求,因此对于您的系统来说,将其缓存是一个很好的选择。您可以再次查询 proc
文件系统来查看当前值:
Output100
由于当前配置,我们的系统将 inode 信息从缓存中移除得太快了。我们可以将其设置为更保守的值,比如 50,输入:
Outputvm.vfs_cache_pressure = 50
再次强调,这仅适用于我们当前的会话。我们可以通过将其添加到配置文件中来更改,就像我们对swappiness设置做的那样:
在底部添加指定新值的行:
vm.vfs_cache_pressure=50
完成后保存并关闭文件。
结论
按照本指南中的步骤将使您在本应导致内存不足异常的情况下有些喘息之机。交换空间在避免一些常见问题方面非常有用。
如果您遇到内存不足错误(OOM错误),或者发现您的系统无法使用您需要的应用程序,则最佳解决方案是优化您的应用程序配置或升级服务器。
Source:
https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-22-04