Linux的Swap是虚拟内存的表现形式,通常叫交换空间,或者交换文件、页面文件。当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。这些被释放的空间可能来自一些很长时间没有什么操作的程序,就会被临时保存到Swap空间中,等到这些程序要运行时,再从Swap分区中恢复保存的数据到内存中。因此,系统总是在物理内存不够时,才进行Swap空间交换。

熟悉Oracle的朋友,可能知道我们安装数据库时,就会用到交换空间,而且对它的容量有最低要求。

技术社群的这篇文章《Linux中swap几乎耗尽但物理内存还有充足剩余,如何解决这种现象?》给我们讲解了Swap已经耗尽了,但物理内存有充足剩余,应该操作什么能解决这个问题的场景,还是比较常见的。

故障现象,

Linux中swap耗尽问题解决的场景_运维

产生此现象的原因,

swappiness配额设置了偏高的值。

还有一个潜在的因素是某个程序因其自身对内存管理的缺陷,形成了zombie进程、且为及时关闭的处理任务还在持续消耗Mem及swap。

解决办法,

调低swappiness配额值,或者直接将swappiness配额设定为0 。

查看当前OS中的swappiness配额,

cat /proc/sys/vm/swappiness

设定当前OS中的swappiness配额值,临时设定,

sysctl vm.swappiness=10

永久设定,

tee -a /etc/sysctl.conf <<-’EOF’
Configure the maximum number of shared memory segments
vm.swappiness=10
EOF


sysctl -p

扩展知识,

Linux在内存被用完之前开始交换。这是为了提高性能和响应能力,性能提高是因为一些内存放磁盘缓存比方内存更合适。因此,最好将一个已经停用了一段时间的程序交换出去,而将经常使用的文件保存在缓存中。当系统处于空闲状态时、而不是当内存满时,一些程序正在运行并请求更多的RAM来完成任务时,响应能力会得到改善。

不建议关闭交换分区。的确,使用交换时,服务器性能会降低,但至少它是可操作的和可访问的。如果服务器需要更多的内存、但没有获得足额的内存,服务器将崩溃。因此有一个交换分区时(在某种程度上)可以避免这种情况的发生。

swappiness是Linux内核参数,作用在于控制换出运行时内存的相对权重。swappiness参数值可设置范围在0到100之间,较低参数值会让内核充分使用物理Mem。Linux的默认设置为60,当物理Mem使用到100-60=40%的时候,就开始使用交换分区。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且将内存上的数据及时地搬运到swap空间。

如果物理Mem用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误、程序进程将无法启动,通常会出现"application is out of memory"的错误,严重时会造成服务进程的死锁。

通常情况下,swap应大于或等于物理内存的大小,最小不应小于64M,通常swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的swap空间,而复杂的业务系统服务器则视情况不同需要不同大小的swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,一般来说对于4G 以下的物理内存,配置2倍的swap,4G 以上配置1倍。

另外,swap分区的数量对Linux及其上的程序进程运行性能也有很大的影响。因为swap交换是磁盘IO的操作,如果有多个swap交换区,swap空间的分配会以轮询的方式操作于所有的swap,这样会大大均衡IO的负载,也会加快swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。此时的CPU并不很繁忙,但Linux系统整体运行却很慢。

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"