在轻量云上安装了Mastodon后由于sidekiq调用ffmpeg导致轻量云的2G内存很紧张,甚至出现Out of memory的情况,ssh也无法相应,所以准备增加2GB的Swap
检查系统的交换信息
在开始之前,我们可以检查系统是否已经有一些可用的交换空间。 可以有多个交换文件或交换分区,但通常一个就足够了。
我们可以通过键入以下内容来查看系统是否有任何已配置的交换:
sudo swapon --show
如果您没有返回任何输出,这意味着您的系统当前没有可用的交换空间。
也可以使用free
验证:
free -h
Output
total used free shared buff/cache available
Mem: 987Mi 784Mi 85Mi 0.0Ki 116Mi 73Mi
Swap: 0B 0B 0B
正如您在输出的Swap行中看到的那样,系统上没有活动的交换。
检查硬盘分区上的可用空间
在我们创建我们的交换文件之前,我们将检查我们当前的磁盘使用情况以确保我们有足够的空间。 通过输入:
df -h
Output
Filesystem Size Used Avail Use% Mounted on
udev 479M 0 479M 0% /dev
tmpfs 99M 476K 99M 1% /run
/dev/vda1 40G 7.7G 30G 21% /
tmpfs 494M 8.0K 494M 1% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 494M 0 494M 0% /sys/fs/cgroup
tmpfs 99M 0 99M 0% /run/user/1000
该设备与/
在里面Mounted on
在这种情况下,列是我们的磁盘。 在这个例子中,我们有足够的可用空间(仅使用了 7.7G)。 您的用法可能会有所不同。
尽管对于交换空间的适当大小有很多意见,但这实际上取决于您的个人喜好和您的应用程序要求。 通常,等于或两倍于系统上的 RAM 量是一个很好的容量。 另一个好的经验法则是,如果您只是将其用作 RAM 后备,那么任何超过 4G 的交换都可能是不必要的。
创建交换文件
现在我们知道了可用的硬盘空间,我们可以在我们的文件系统上创建一个交换文件。 我们将分配一个我们想要调用的大小的文件swapfile
在我们的根(/
) 目录。
创建交换文件的最佳方法是使用fallocate
程序。 此命令会立即创建指定大小的文件。
由于我们示例中的服务器有 1G 的 RAM,我们将在本指南中创建一个 4G 的文件。 调整此项以满足您自己的服务器的需求:
sudo fallocate -l 4G /swapfile
我们可以通过键入以下内容来验证是否保留了正确的空间量:
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Mar 7 17:04 /swapfile
我们的文件已创建并预留了正确的空间量。
启用交换空间
现在我们有了一个正确大小的可用文件,我们需要将其实际转换为交换空间。
首先,我们需要锁定文件的权限,以便只有具有root权限的用户才能读取内容。 这会阻止普通用户访问该文件,这将产生重大的安全隐患。
内容使该文件只能root通过键入以下指令:
sudo chmod 600 /swapfile
通过键入以下内容验证权限更改:
ls -lh /swapfile
Output
-rw------- 1 root root 4.0G Mar 7 17:04 /swapfile
如您所见,只有root用户启用了读写标志。
我们现在可以通过键入以下内容将文件标记为交换空间:
sudo mkswap /swapfile
Output
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=15085099-a7fc-489f-86d6-c785ec646495
标记文件后,我们可以启用交换文件,让我们的系统开始使用它:
sudo swapon /swapfile
通过键入以下内容验证交换是否可用:
sudo swapon --show
Output
NAME TYPE SIZE USED PRIO
/swapfile file 4G 0B -2
我们可以检查输出 free实用程序再次证实我们的发现:
free -h
Output
total used free shared buff/cache available
Mem: 987Mi 779Mi 104Mi 0.0Ki 102Mi 86Mi
Swap: 4.0Gi 19Mi 4.0Gi
我们的交换已成功设置,我们的操作系统将根据需要开始使用它。
使交换文件永久化
我们最近的更改已启用当前会话的交换文件。 但是,如果我们重新启动,服务器将不会自动保留交换设置。 我们可以通过将交换文件添加到我们的/etc/fstab
文件。
备份/etc/fstab
文件以防出现任何问题:
sudo cp /etc/fstab /etc/fstab.bak
将交换文件信息添加到您的末尾/etc/fstab
通过键入文件:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
接下来,我们将查看一些可以更新以调整交换空间的设置。
调整您的交换设置
您可以配置一些选项,这些选项会在处理交换时影响系统的性能。
调整 Swappiness 属性
这swappiness
参数配置系统将数据从 RAM 交换到交换空间的频率。 这是一个介于 0 和 100 之间的值,表示百分比。
当值接近零时,除非绝对必要,否则内核不会将数据交换到磁盘。 请记住,与交换文件的交互是“昂贵的”,因为它们比与 RAM 的交互花费的时间要长得多,并且会导致性能显着降低。 告诉系统不要过多地依赖交换通常会使您的系统更快。
接近 100 的值将尝试将更多数据放入交换中,以保持更多 RAM 空间可用。 根据您的应用程序的内存配置文件或您使用服务器的目的,在某些情况下这可能会更好。
我们可以通过键入以下内容查看当前的交换值:
cat /proc/sys/vm/swappiness
Output
60
对于家用电脑,swappiness 设置为 60 并不是一个坏值。 对于服务器,大部分时候您可能希望将其移近 0。
我们可以使用 sysctl 命令将 swappiness 设置为不同的值。
例如,要将 swappiness 设置为 10,我们可以输入:
sudo sysctl vm.swappiness=10
Output
vm.swappiness = 10
此设置将持续到下一次重新启动。 我们可以在重启时自动设置这个值,方法是在我们的/etc/sysctl.conf
文件:
sudo nano /etc/sysctl.conf
在底部,您可以添加:
vm.swappiness=10
完成后保存并关闭文件。
调整缓存压力设置
您可能要修改的另一个相关值是vfs_cache_pressure
。此设置配置系统将选择缓存多少inode和dentry信息而不是其他数据。
基本上,这是关于文件系统的访问数据。 这通常查找成本非常高,并且请求非常频繁,因此对您的系统进行缓存是一件好事。 您可以通过查询来查看当前值 proc再次文件系统:
cat /proc/sys/vm/vfs_cache_pressure
Output
100
按照目前的配置,我们的系统从缓存中删除 inode 信息的速度太快了。 我们可以通过键入以下命令将其设置为更保守的设置,例如 50:
sudo sysctl vm.vfs_cache_pressure=50
Output
vm.vfs_cache_pressure = 50
同样,这仅对我们当前的会话有效。 我们可以通过将其添加到我们的配置文件中来更改它,就像我们对 swappiness 设置所做的那样:
sudo nano /etc/sysctl.conf
在底部,添加指定新值的行:
vm.vfs_cache_pressure=50
完成后保存并关闭文件。
配置完毕后重启一下系统
总结
遵循本指南中的步骤将为您的程序提供一些喘息空间,否则会导致内存不足异常。 交换空间对于避免其中一些常见问题非常有用。
如果您遇到 OOM(内存不足)错误,或者您发现您的系统无法使用您需要的应用程序,最好的解决方案是优化您的应用程序配置或升级您的服务器。
一键脚本
添加swap(单位MB)
#!/bin/sh
# size of swapfile in megabytes
swapsize=512
# does the swap file already exist?
grep -q "swapfile" /etc/fstab
# if not then create it
if [ $? -ne 0 ]; then
echo 'swapfile not found. Adding swapfile.'
fallocate -l ${swapsize}M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap defaults 0 0' >> /etc/fstab
else
echo 'swapfile found. No changes made.'
fi
# output results to terminal
cat /proc/swaps
cat /proc/meminfo | grep Swap
移除SWAP
#!/bin/sh
# does the swap file exist?
grep -q "swapfile" /etc/fstab
# if it does then remove it
if [ $? -eq 0 ]; then
echo 'swapfile found. Removing swapfile.'
sed -i '/swapfile/d' /etc/fstab
echo "3" > /proc/sys/vm/drop_caches
swapoff -a
rm -f /swapfile
else
echo 'No swapfile found. No changes made.'
fi
# output results to terminal
cat /proc/swaps
cat /proc/meminfo | grep Swap
参考与翻译自digitalocean