服务器优化(三)设置虚拟内存

本文章已收录至本站专栏
服务器优化系列

0、前言

虽然现在上云的成本已大大降低,但是个人开发者依然负担不起高配置服务器的费用。但是在运行程序的过程中,难免出现内存不够用的情况,触发OOM Killer。
如何避免应用出现内存不足的错误?最简单的方法就是增加交换空间。
什么是交换空间?

Swap是存储盘上的一块自留地,操作系统可以在这里暂存一些内存里放不下的东西。

简而言之,Swap就是一块虚拟内存,设置得恰当的话,相当于增加了服务器的可用内存。虽然从Swap读写比内存慢,但是可以让服务器内存耗尽时不至于服务中断,算是内存不够时的安全网。

如果没有Swap,则服务器一旦内存不足,就会开始终止应用以释放内存,甚至会崩溃,这会让你丢失一些还没来得及保存的数据,或者造成当机。有些应用明确要求系统配置swap以确保数据访问的可靠性。

注意:swap通常在传统机械硬盘上表现更好,在SSD上使用swap可能会造成问题,尤其是硬件老化之后。
所以,对于使用基于SSD的云主机服务的用户,我们不推荐启用swap。

1、检查系统的Swap信息

首先我们需要检查系统的存储,看看是否已经配置过swap。
执行:

Bash
1
swapon -s

一般而言,会返回结果:

Bash
1
1

如果该命令没有返回出结果,则代表该系统尚未配置过swap。

我们也可以使用free工具来查看系统的整体内存使用情况,这里可以看到内存和swap的使用状态(显示单位为MB):

Text
1
free -m

返回结果:

Bash
1
2
3
4
             total       used       free     shared    buffers     cached
Mem:          3953        315       3637          8         11        107
-/+ buffers/cache:        196       3756
Swap:            0          0       4095

2、检查可用的存储空间

执行:

Bash
1
df -h

返回:

Bash
1
2
3
4
5
6
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

从第一行可以看到存储空间上还有59GB的空间剩余。

3、选择合适的大小

合适的swap空间是多大?一般来说,Swap应设置为内存容量的1.5倍至2倍。
但是,对于内存在16GB以上的用户,建议设置为4GB。
我的物理内存为4GB,在系统盘已经设置了4GB的虚拟内存,但是还是有些捉襟见肘,于是想在数据盘设置了8GB的Swap。

4、创建Swap文件

执行:

此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。

5、开机自动挂载

系统重启后,该swap会失效。要让系统在重启后自动生效swap,我们可以修改fstab文件。
编辑:

/etc/fstab

在文件末尾加入下面这行内容,告诉操作系统自动使用刚才创建的swap文件:

此处内容需要评论回复(自动审核)或加入 QQ 技术交流群(立即获得内容)后方可阅读。赞助(二维码在文章下方)后联系作者可一次性解锁所有(包括之后的新文章)。

6、优化配置

有几个涉及swap的设置可能会影响到系统的性能表现。
(1)Swappiness
swappiness参数决定了系统将数据从内存交换到swap空间的频率,数值设置在0到100之间。
该数值越接近于0,系统越倾向于不进行swap,仅在必要的时候进行swap操作。由于swap要比内存慢很多,因此减少对swap的依赖意味着更高的系统性能。
该数值越接近于100,系统越倾向于多进行swap。有些应用的内存使用习惯更适合于这种情况,这也于服务器的用途有关。

执行:

Bash
1
cat /proc/sys/vm/swappiness

查看swappiness。
CentOS 7默认设置为30。

使用sysctl命令可以修改swappiness。例如,swappiness设为10:

Bash
1
sudo sysctl vm.swappiness=10

本次修改将一直生效到下次重启前。如果希望永久修改该数值,则需要编辑sysctl配置文件:

/etc/sysctl.conf

将以下内容粘贴到文件末尾:

Text
1
vm.swappiness = 10

编辑完成后,保存退出,之后服务器每次重启的时候会将swappiness设置为该值。

(2)缓存压力
该配置项涉及特殊文件系统元文件条目的存储。对此类信息的频繁读取是非常消耗性能的,所以延长其在缓存的保存时间可以提升系统的性能。
通过proc文件系统查看缓存压力的当前设定值:

Bash
1
cat /proc/sys/vm/vfs_cache_pressure

使用sysctl命令进行设置:

Bash
1
sudo sysctl vm.vfs_cache_pressure=50

要让该设置永久有效,需要编辑sysctl配置文件:

/etc/sysctl.conf

在文件末尾添加如下内容:

Text
1
vm.vfs_cache_pressure = 50

保存退出,服务器就会在每次重启后都自动将缓存压力设置为50了。

7、总结

至此,我们的系统内存就获得了一些喘气的空间。有了swap空间可以有效避免一些常见的问题。

如果你仍然会遇到内存不足(OOM,out of memory)的错误信息,或者你的系统不能运行你需要的应用,那么最好的方法是优化你的应用配置或者升级你的服务器,不过配置swap空间也不失为一个灵活的节省方案。

服务器优化(三)设置虚拟内存

https://blog.tsinbei.com/archives/240/

文章作者
Hsukqi Lee
发布于

2022-03-20

修改于

2023-01-18

许可协议

CC BY-NC-ND 4.0

评论

昵称
邮箱
网址
2 条

雨呢

雨呢

感谢分享.

  回复

雨呢

雨呢

感谢分享

  回复