介绍
让服务器响应更快、防止应用程序出现内存不足错误的最简单方法之一是添加一些交换空间。交换是存储驱动器上的一个区域,操作系统可以在其中临时存储无法保存在内存中的数据。
这使您能够增加服务器能够保存在其工作内存中的信息的数量,但有一些警告。读写交换比使用内存慢,但它可以为服务器内存不足时提供良好的安全网。
没有交换空间,服务器将耗尽内存。
CentOS 7服务器上创建和启用交换文件。
虽然通常推荐使用传统旋转硬盘的系统使用swap,但是随着时间的推移,与ssd一起使用swap会导致硬件退化的问题。因此,我们不建议在DigitalOcean或任何使用SSD存储的其他提供者上启用swap。这样做会影响您和您的邻居的底层硬件的可靠性。
如果您需要改进服务器的性能,我们建议您升级您的Droplet。这通常会导致更好的结果,并降低导致硬件问题的可能性
检查系统是否有交换信息
free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 0 0 4095
检查可用存储空间
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将告诉我们M(兆字节)或G(十亿字节)的空间使用情况和可用性,而不是在分区中输出原始的内存块数量。
正如您在第一行看到的,我们的存储分区有59gb可用空间,因此我们有相当大的空间可以使用。请记住,这是在一个新的、中等大小的VPS实例上进行的,因此您的实际使用可能非常不同。
尽管对于交换空间的适当大小有很多意见
创建交换文件
既然知道了可用的存储空间,我们就可以着手在文件系统中创建交换文件。我们将在根(/)目录中创建一个名为swapfile的文件,不过如果您愿意,您可以将该文件命名为其他文件。文件必须分配交换文件所需的空间。
创建交换文件的最快和最简单的方法是使用fallocate。这个命令立即创建一个预先分配大小的文件。我们可以通过输入:
1 。 sudo fallocate -l 4G /swapfile
在输入您的密码以授权sudo特权之后,交换文件将几乎立即创建,提示将返回给您。我们可以使用ls来验证为swap预留的空间是否正确:
ls -lh /swapfile
-rw-r–r– 1 root root 4.0G Oct 30 11:00 /swapfile
如您所见,我们的交换文件是在留出正确数量的空间的情况下创建的
启用交换文件
现在,我们的文件已经创建,但是我们的系统不知道这应该用于交换。我们需要告诉系统将此文件格式化为交换文件,然后启用它。
在此之前,我们应该调整交换文件的权限,以便除根帐户之外的任何人都无法读取它。允许其他用户读或写这个文件将是一个巨大的安全风险。我们可以通过chmod锁定权限:
2. sudo chmod 600 /swapfile
这将仅限制root帐户的读取和写入权限。我们可以再次使用ls -lh验证交换文件是否具有正确的权限:
ls -lh /swapfile
-rw——- 1 root root 4.0G Oct 30 11:00 /swapfile
既然我们的交换文件更安全,我们可以通过输入以下内容告诉我们的系统设置交换空间以供使用:
3. sudo mkswap /swapfile
Setting up swapspace version 1, size = 4194300 KiB
no label, UUID=b99230bb-21af-47bc-8c37-de41129c39bf
我们的交换文件现在可以用作交换空间。我们可以通过键入来开始使用它:
4. sudo swapon /swapfile
为了验证程序是否成功,我们可以检查我们的系统现在是否报告交换空间:
5. swapon -s
Filename Type Size Used Priority
/swapfile file 4194300 0 -1
此输出确认我们有一个新的交换文件。我们可以再次使用free程序来证实我们的发现:
6. free -m
total used free shared buffers cached
Mem: 3953 315 3637 8 11 107
-/+ buffers/cache: 196 3756
Swap: 4095 0 4095
我们的交换已成功设置,我们的操作系统将根据需要开始使用它。
swap是干嘛的?
在Linux下,SWAP的作用类似Windows系统下的“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。
SWAP意思是交换,顾名思义,当某进程向OS请求内存发现不足时,OS会把内存中暂时不用的数据交换出去,放在SWAP分区中,这个过程称为SWAP OUT。当某进程又需要这些数据且OS发现还有空闲物理内存时,又会把SWAP分区中的数据交换回物理内存中,这个过程称为SWAP IN。
当然,swap大小是有上限的,一旦swap使用完,操作系统会触发OOM-Killer机制,把消耗内存最多的进程kill掉以释放内存。
数据库系统为什么嫌弃swap?
显然,swap机制的初衷是为了缓解物理内存用尽而选择直接粗暴OOM进程的尴尬。但坦白讲,几乎所有数据库对swap都不怎么待见,无论MySQL、Oracal、MongoDB抑或HBase,为什么?这主要和下面两个方面有关:
1. 数据库系统一般都对响应延迟比较敏感,如果使用swap代替内存,数据库服务性能必然不可接受。对于响应延迟极其敏感的系统来讲,延迟太大和服务不可用没有任何区别,比服务不可用更严重的是,swap场景下进程就是不死,这就意味着系统一直不可用……再想想如果不使用swap直接oom,是不是一种更好的选择,这样很多高可用系统直接会主从切换掉,用户基本无感知。
2. 另外对于诸如HBase这类分布式系统来说,其实并不担心某个节点宕掉,而恰恰担心某个节点夯住。一个节点宕掉,最多就是小部分请求短暂不可用,重试即可恢复。但是一个节点夯住会将所有分布式请求都夯住,服务器端线程资源被占用不放,导致整个集群请求阻塞,甚至集群被拖垮。
从这两个角度考虑,所有数据库都不喜欢swap还是很有道理的!
swap的工作机制
既然数据库们对swap不待见,那是不是就要使用swapoff命令关闭磁盘缓存特性呢?非也,大家可以想想,关闭磁盘缓存意味着什么?实际生产环境没有一个系统会如此激进,要知道这个世界永远不是非0即1的,大家都会或多或少选择走在中间,不过有些偏向0,有些偏向1而已。很显然,在swap这个问题上,数据库必然选择偏向尽量少用。HBase官方文档的几点要求实际上就是落实这个方针:尽可能降低swap影响。知己知彼才能百战不殆,要降低swap影响就必须弄清楚Linux内存回收是怎么工作的,这样才能不遗漏任何可能的疑点。
开机启动Swap文件
我们的swap文件目前是启用的,但是当我们重新启动时,服务器不会自动启用该文件。我们可以通过修改fstab文件来改变这一点,fstab文件是一个管理文件系统和分区的表。
在文本编辑器中编辑具有sudo特权的文件:
1
|
sudo vi /etc/fstab
|
在文件的底部,你需要添加一行,告诉操作系统自动使用你创建的swap文件:
1
|
/swapfile swap swap sw 0 0
|
添加完行后,可以保存并关闭文件。服务器将在每次引导时检查此文件,因此从现在开始swap文件就可以使用了。
删除swap文件
如果你不想使用了swap空间你可以如下操作
1.首先通过键入以下命令禁用swap空间:
1
|
sudo swapoff -v /swapfile
|
2.接下来,从/etc/fstab文件中删除swap文件这一行/swapfile swap缺省值0 0,如下
1
|
/swapfile swap swap sw 0 0
|
3.最后,删除实际的swapfile文件:
1
|
sudo rm /swapfile
|