介绍
一个让你的服务器的响应,并防范内存不足,错误在应用程序中最简单的方法,就是增加一些交换空间。 交换就是操作系统可以暂时储存数据的存储驱动器上的一个区域,它可以不再保持在内存中。
这使您能够增加服务器在其工作内存中保留的信息量,并带有一些注意事项。 读取和写入交换比使用内存慢,但它可以为您的服务器内存不足提供良好的安全网。
没有交换,内存耗尽的服务器可能会开始杀死应用程序,释放内存,甚至崩溃。 这可能会导致您丢失未保存的数据或遇到停机。 为了确保可靠的数据访问,某些应用程序需要交换功能。
在本指南中,我们将介绍如何在CentOS 7服务器上创建和启用交换文件。
尽管交换通常被推荐用于使用传统旋转硬盘驱动器的系统,但是使用SSD交换可能导致硬件随时间的退化问题。 由于这一考虑,我们不建议在DigitalOcean或任何其他使用SSD存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。
如果您需要提高服务器的性能,我们建议您升级您的Droplet。 这将导致一般更好的结果,并将降低可能影响您的服务的硬件问题的可能性。
先决条件
在开始使用本指南之前,需要先完成几个步骤。
您将需要安装并使用具有非root用户配置一个CentOS 7服务器sudo
权限。 如果你还没有这样做的是,你可以通过1-4步骤运行CentOS 7初始服务器设置向导来创建此帐户。
一旦拥有非root用户,您可以使用它来SSH到您的CentOS服务器,并继续安装交换文件。
检查系统的交换信息
在我们开始之前,我们应该看看我们的服务器的存储,看看我们是否已经有一些交换空间可用。 虽然我们可以有多个交换文件或交换分区,但通常应该足够了。
我们可以看到,如果该系统具有通过使用任何配置的交换swapon
,一个通用交换效用。 与-s
标志, swapon
将显示交换使用情况和可用性我们的存储设备上的摘要:
swapon -s
如果命令未返回任何内容,则摘要为空,并且不存在交换文件。
检查交换空间的另一种方法是使用free
实用工具,它向我们展示了系统的整体内存使用情况。 我们可以通过键入以下内容查看我们当前的内存和交换使用情况(以兆字节为单位):
free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 0 0 4095
正如你所看到的,我们在系统的总交换空间为0,这与我们所看到的与swapon
。
检查可用存储空间
分配交换空间的典型方法是使用专用于任务的单独分区。 然而,由于硬件或软件的限制,改变分区方案并不总是可能的。 幸运的是,我们可以轻松地创建一个驻留在现有分区上的交换文件。
在我们这样做之前,我们应该知道我们当前的驱动器使用。 我们可以通过键入以下内容获取此信息:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 59G 1.5G 55G 3% /
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 8.3M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
注:在-h
标志只是告诉dh
,输出驱动器的信息在一个人性化的阅读格式。 例如,而不是在一个分区输出内存块的原始数量, df -h
会告诉我们在并购的空间使用情况和可用性(兆字节)或G(千兆字节)。
正如你可以看到第一行,我们的存储分区有59千兆字节可用,所以我们有相当多的空间来使用。 请记住,这是一个新鲜的,中型VPS实例,所以你的实际使用可能会有很大的不同。
虽然对于交换空间的适当大小有很多意见,但它取决于您的应用程序要求和您的个人偏好。 一般来说,等于或两倍的系统内存量是一个好的起点。
由于我的系统有4千兆字节的内存,并且加倍,从我的存储空间比我愿意放弃一个更大的块,我将创建一个4千兆字节的交换空间,以匹配我的系统的内存。
创建交换文件
现在我们知道了我们可用的存储空间,我们可以在我们的文件系统中创建一个交换文件。 我们将创建一个名为swapfile
在我们的根目录( /
)目录,但你可以将文件命名为别的东西,如果你喜欢。 该文件必须分配我们想要的交换文件的空间量。
创建一个交换文件的最快,最简单的方法是使用fallocate
。 此命令会立即创建一个预分配大小的文件。 我们可以通过键入以下内容创建一个4 GB的文件:
sudo fallocate -l 4G /swapfile
输入密码授权后sudo
特权,交换文件将被创建几乎瞬间,并及时将退还给你。 我们可以验证正确的空间量用预留交换ls
:
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Oct 30 11:00 /swapfile
如你所见,我们的交换文件是用正确的空间量创建的。
启用交换文件
现在,我们的文件被创建,但我们的系统不知道这应该用于交换。 我们需要告诉我们的系统将此文件格式化为交换,然后启用它。
在我们这样做之前,我们应该调整交换文件的权限,以便除root帐户以外的任何人都无法读取。 允许其他用户读取或写入此文件将是一个巨大的安全风险。 我们可以锁定的权限chmod
:
sudo chmod 600 /swapfile
这将只限制对root帐户的读取和写入权限。 我们可以验证交换文件已通过使用正确的权限ls -lh
再次:
ls -lh /swapfile
-rw------- 1 root root 4.0G Oct 30 11:00 /swapfile
现在我们的交换文件更安全,我们可以告诉我们的系统通过键入以设置交换空间:
sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf
我们的交换文件现在可以用作交换空间。 我们可以通过键入以下内容开始使用它:
sudo swapon /swapfile
要验证过程是否成功,我们可以检查我们的系统是否现在报告交换空间:
swapon -s
Filename Type Size Used Priority
/swapfile file 4194300 0 -1
此输出确认我们有一个新的交换文件。 我们可以使用free
又实用程序来证实我们的发现:
free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 4095 0 4095
我们的互换已成功设置,我们的操作系统将开始使用它的需要。
使交换文件永久
我们的交换文件目前已启用,但是当我们重新启动时,服务器不会自动启用该文件以供使用。 我们可以通过修改改变fstab
文件,这是一个管理文件系统和分区表。
编辑与文件sudo
在文本编辑器的权限:
sudo nano /etc/fstab
在文件底部,您需要添加一行,告诉操作系统自动使用您创建的交换文件:
/swapfile swap swap sw 0 0
添加完行后,您可以保存并关闭该文件。 服务器将在每次启动时检查此文件,因此交换文件将从现在开始使用。
调整您的交换设置(可选)
有几个可以配置的选项,在处理交换时会影响系统的性能。 在大多数情况下,这些配置是可选的,您所做的更改将取决于您的应用程序需要和您的个人喜好。
快乐
该swappiness
参数确定系统如何频繁交换数据的内存用于交换空间。 这是介于0和100之间的值,表示将触发使用交换的内存使用的百分比。
值接近零时,系统将不会交换数据到驱动器,除非绝对必要。 记住,与交换文件的交互是“昂贵的”,因为它们比与内存的交互慢得多,并且读和写速度的差异可能导致应用程序性能的显着降低。 告诉系统不要依赖交换,通常会使你的系统更快。
接近100的值将尝试将更多的数据放入交换,以尽量保持更多的内存。 根据应用程序的内存配置文件或您使用服务器的内容,在某些情况下,这可能是更好的选择。
我们可以通过阅读看到当前swappiness值swappiness
配置文件:
cat /proc/sys/vm/swappiness
30
CentOS 7默认为swappiness设置为30,这是大多数桌面和本地服务器的公平中间地带。 对于VPS系统,我们可能希望将其移动到更接近0。
我们可以通过设置swappiness为不同的值sysctl
命令。 例如,要将swappiness设置为10,我们可以键入:
sudo sysctl vm.swappiness=10
vm.swappiness = 10
此设置将持续到下次重新启动。 为了使重新启动的设置仍然存在,我们就可以输出的行添加到我们的sysctl
配置文件:
sudo nano /etc/sysctl.conf
将您的swappiness设置添加到文件底部:
vm.swappiness = 10
添加完行后,您可以保存并关闭该文件。 服务器现在将自动将swappiness设置为您在每次启动时声明的值。
缓存压力
另一个相关的价值,你可能需要修改的是vfs_cache_pressure
。 此设置会影响特殊文件系统元数据条目的存储。 不断地读取和刷新此信息通常是非常昂贵的,因此将其存储在缓存中更长时间对于您的系统的性能是非常好的。
您可以通过查询看到这个缓存压力的当前值proc
再次文件系统:
cat /proc/sys/vm/vfs_cache_pressure
100
由于它当前配置,我们的系统从缓存中过快地删除inode信息。 我们可以将其设置为一个比较保守的设置,像50,使用sysctl
:
sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50
同样,这只适用于我们当前的会话。 我们可以通过将它添加到我们的配置文件中来改变它,就像我们使用swappiness设置一样:
sudo nano /etc/sysctl.conf
在底部,添加指定新值的行:
vm.vfs_cache_pressure = 50
添加完行后,您可以保存并关闭该文件。 服务器现在将自动将缓存压力设置为您在每次启动时声明的值。
结论
按照本指南中的步骤,您将在内存使用方面为您的服务器提供一些Wheezy空间。 交换空间是非常有用的,以避免一些常见的问题。
如果您正在运行OOM(内存不足)错误,或者发现系统无法使用所需的应用程序,最佳解决方案是优化应用程序配置或升级服务器。 但是,配置交换空间可以给您更多的灵活性,并可以帮助您在不太强大的服务器上购买时间。