介绍
其中一个提高服务器的响应速度和应用程序中的防范内存不足错误的最简单的方法是添加一些交换空间。 交换是已被指定为地方操作系统可以暂时硬盘驱动器上的一个区域存储它不能再保存在RAM中的数据。
基本上,这使您能够增加服务器可以在其工作“内存”中保留的信息量,并带有一些注意事项。 硬盘驱动器上的空间将主要用于当RAM中的空间不再足以用于数据时。
写入磁盘的信息将比保存在RAM中的信息慢,但操作系统将更喜欢在内存中保持运行应用程序数据,并对旧数据使用交换。 总的来说,交换空间作为一个倒退,当你的系统的RAM被耗尽是一个很好的安全网。
在本指南中,我们将介绍如何在Ubuntu 14.04服务器上创建和启用交换文件。
尽管交换通常被推荐用于使用传统旋转硬盘驱动器的系统,但是使用SSD交换可能导致硬件随时间的退化问题。 由于这一考虑,我们不建议在DigitalOcean或任何其他使用SSD存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。
如果您需要提高服务器的性能,我们建议您升级您的Droplet。 这将导致一般更好的结果,并将降低可能影响您的服务的硬件问题的可能性。
检查系统的交换信息
在我们开始之前,我们将看看我们的操作系统,看看我们是否已经有一些交换空间可用。 我们可以有多个交换文件或交换分区,但通常一个应该足够了。
我们可以通过键入以下内容查看系统是否有任何配置的交换:
sudo swapon -s
Filename Type Size Used Priority
如果只返回表的标题,如上所示,您当前没有启用任何交换空间。
另外,检查交换空间更熟悉的方式与free
实用工具,它向我们展示了系统的内存使用情况。 我们可以通过键入以下内容查看我们当前的内存和交换使用情况(以兆字节为单位):
free -m
total used free shared buffers cached Mem: 3953 154 3799 0 8 83 -/+ buffers/cache: 62 3890 Swap: 0 0 0
如上所示,系统中的总交换空间为“0”。 这与我们使用上一个命令看到的一致。
检查硬盘驱动器分区上的可用空间
分配交换空间的典型方法是使用专用于任务的单独分区。 然而,改变分区方案并不总是可能的。 我们可以轻松地创建驻留在现有分区上的交换文件。
在我们这样做之前,我们应该知道我们当前的磁盘使用情况。 我们可以通过键入以下内容获取此信息:
df -h
Filesystem Size Used Avail Use% Mounted on /dev/vda 59G 1.3G 55G 3% / none 4.0K 0 4.0K 0% /sys/fs/cgroup udev 2.0G 12K 2.0G 1% /dev tmpfs 396M 312K 396M 1% /run none 5.0M 0 5.0M 0% /run/lock none 2.0G 0 2.0G 0% /run/shm none 100M 0 100M 0% /run/user
正如你可以看到第一行,我们的硬盘分区有55千兆字节可用,所以我们有大量的空间使用。 这是一个新鲜的,中型VPS实例,但是,因此您的实际使用可能会有很大的不同。
虽然对于交换空间的适当大小有很多意见,但它实际上取决于您的个人偏好和您的应用程序要求。 一般来说,等于或者是系统上的RAM的两倍的数量是一个很好的起点。
由于我的系统有4千兆字节的RAM,并且加倍将占用我的磁盘空间的一大块,我不愿意参与,我将创建一个4千兆字节的交换空间,以匹配我的系统的RAM。
创建交换文件
现在我们知道了可用的硬盘空间,我们可以在文件系统中创建一个交换文件。
我们将创建一个名为swapfile
在我们的根(/)目录中。 该文件必须分配我们想要的交换文件的空间量。 有两种主要的方法:
传统,慢的方式
传统上,我们将通过创建预分配的空间的文件dd
命令。 此通用磁盘实用程序从一个位置写入另一个位置。
我们可以用它来从位于Linux系统的专用设备零写入文件/dev/zero
,只是吐出了许多零的要求。
我们通过使用一个组合指定文件大小bs
为块大小和count
为块的数目。 我们分配给每个参数几乎完全是任意的。 重要的是它们的乘积的结果是什么。
例如,在我们的示例中,我们希望创建一个4 GB的文件。 我们可以通过指定1千兆字节的块大小和4:
sudo dd if=/dev/zero of=/swapfile bs=1G count=4
4+0 records in
4+0 records out
4294967296 bytes (4.3 GB) copied, 18.6227 s, 231 MB/s
按ENTER键,因为如果你点这有销毁数据的潜力之前,检查您的命令of
(代表输出文件),以错误的位置。
我们可以看到通过键入以下内容分配了4千兆字节:
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Apr 28 17:15 /swapfile
如果你已经完成了上面的命令,你可能会注意到它花了一段时间。 事实上,您可以在输出中看到我的系统创建文件需要18秒。 这是因为它必须向磁盘写入4千兆字节的零。
如果您想要了解如何更快地创建文件,请删除该文件,并按照以下步骤:
sudo rm /swapfile
更快的方式
得到相同的文件的更快的方式是通过使用fallocate
程序。 此命令立即创建一个预分配大小的文件,而不必实际写入虚拟内容。
我们可以通过键入以下内容创建一个4 GB的文件:
sudo fallocate -l 4G /swapfile
提示将立即返回给您。 我们可以通过键入以下内容来验证是否保留了正确的空间量:
ls -lh /swapfile
-rw-r--r-- 1 root root 4.0G Apr 28 17:19 /swapfile
如您所见,我们的文件是用正确的空间量创建的。
启用交换文件
现在,我们的文件被创建,但我们的系统不知道这应该用于交换。 我们需要告诉我们的系统将此文件格式化为交换,然后启用它。
在我们这样做之前,我们需要调整我们的文件的权限,以便除root以外的任何人都无法读取。 允许其他用户读取或写入此文件将是一个巨大的安全风险。 我们可以通过键入以下内容锁定权限:
sudo chmod 600 /swapfile
键入以下命令验证文件是否具有正确的权限:
ls -lh /swapfile
-rw------- 1 root root 4.0G Apr 28 17:19 /swapfile
如您所见,只有root用户的列具有启用的读写标志。
现在我们的文件更安全,我们可以告诉我们的系统通过键入以设置交换空间:
sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944
我们的文件现在可以用作交换空间。 我们可以通过键入:
sudo swapon /swapfile
我们可以通过检查我们的系统是否现在报告交换空间来验证过程是否成功:
sudo swapon -s
Filename Type Size Used Priority /swapfile file 4194300 0 -1
我们在这里有一个新的交换文件。 我们可以使用free
又实用程序来证实我们的发现:
free -m
total used free shared buffers cached Mem: 3953 101 3851 0 5 30 -/+ buffers/cache: 66 3887 Swap: 4095 0 4095
我们的互换已成功设置,我们的操作系统将开始使用它的必要。
使交换文件永久
我们已经启用了交换文件,但是当我们重新启动时,服务器不会自动启用该文件。 我们可以说,虽然通过修改改fstab
文件。
在文本编辑器中使用root权限编辑文件:
sudo nano /etc/fstab
在文件底部,您需要添加一行,告诉操作系统自动使用您创建的文件:
/swapfile none swap sw 0 0
保存并在完成后关闭文件。
调整您的交换设置
有几个可以配置的选项,在处理交换时会影响系统的性能。
该swappiness
参数配置系统的频率进行数据交换出内存的交换空间。 这是介于0和100之间的值,表示一个百分比。
当值接近零时,内核不会将数据交换到磁盘,除非绝对必要。 记住,与交换文件的交互是“昂贵的”,因为它们比与RAM的交互花费的时间长,并且它们可能导致性能的显着降低。 告诉系统不要依赖于交换,通常会使你的系统更快。
更接近100的值将尝试将更多的数据放入交换,以保持更多的RAM空间。 根据应用程序的内存配置文件或您使用服务器的情况,在某些情况下可能会更好。
我们可以通过键入以下内容查看当前的swappiness值:
cat /proc/sys/vm/swappiness
60
对于桌面,swappiness设置为60不是一个坏的值。 对于VPS系统,我们可能希望将其移动到更接近0。
我们可以通过设置swappiness为不同的值sysctl
命令。
例如,要将swappiness设置为10,我们可以键入:
sudo sysctl vm.swappiness=10
vm.swappiness = 10
此设置将持续到下次重新启动。 我们可以通过添加一行来我在重新启动时自动设置这个值/etc/sysctl.conf
文件中:
sudo nano /etc/sysctl.conf
在底部,您可以添加:
vm.swappiness=10
保存并在完成后关闭文件。
另一个相关的价值,你可能需要修改的是vfs_cache_pressure
。 此设置配置系统选择将高速缓存i节点和dentry信息与其他数据相比的多少。
基本上,这是访问文件系统的数据。 这通常是非常昂贵的查找和非常频繁地请求,所以它是一个伟大的事情,你的系统缓存。 您可以通过查询看到当前值proc
再次文件系统:
cat /proc/sys/vm/vfs_cache_pressure
100
由于它当前配置,我们的系统从缓存中快速删除inode信息。 我们可以通过键入以下内容将其设置为更保守的设置(如50):
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(内存不足)错误,或者您发现系统无法使用所需的应用程序,最佳解决方案是优化应用程序配置或升级服务器。 但是,配置交换空间可以给您更大的灵活性,并且可以帮助您在功能不太强大的服务器上购买时间。