服务器swap(服务器Swap为0)

http://www.itjxue.com  2023-02-21 18:10  来源:未知  点击次数: 

怎么创建linux swap分区

Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要。通过调整Swap,有时可以越过系统性能瓶颈,节省系统升级费用。

Linux系统下如何创建和删除swap分区?

创建Swap

首先,用拥有root权限的用户通过SSH远程登入或者本地终端登入到系统,进行创建Swap分区

dd if=/dev/zero of=/swap/swap bs=1024 count=1024000

if//输入

of//输出

bs//块儿大小

count//总大小

创建Linux交换文件

mkswap/swap/swap

立即激活/swap/swap交换文件

swapon/swap/swap

查看是否生效

[root@webserver~]#free-m

total used free shared buffers cached

Mem:2007 140 1867 0 8 35

-/+ buffers/cache:96 1911

Swap:972 0 972

通过以上输出信息可以看出,已经成功创建Swap分区

设置成永久生效

虽然现在已经生效,但是等到下次服务器重启之后。该Swap虚拟磁盘会失效,为保证永久生效,需要在/etc/fstab文件添加如下指令集:

echo "/swap/swap swap swap defaults 0 0"》》/etc/fstab

到这里,Swap分区已经完成创建了。

删除Swap分区

首先停止Swap分区

swapoff/swap/swap

删除swap分区文件

rm-rf/swap/swap

删除"/etc/swap" 指定文件

这样就可以手工添加和删除swap分区

代码如下:

sed -i “/‘\/swap\/ swap swap swap defaults 0 0’//” /etc/fstab

Linux开启Swap分区

title: 2021-02-07-Linux开启Swap分区

date: 2021-02-07 11:20:20

categories: [linux]

tags: [linux分区扩容]

toc: true

场景: 华为云购买的机器,默认不会开启 swap 分区,服务器运行内存只有 4GB ,不满足使用,开启 swap 交换分区

1、 开启 swap 分区

新建一个专门的文件用于 swap 分区

注:此文件的大小是 count 的大小乘以 bs 大小,上面命令的大小是 8GB

2、 通过 mkswap 命令将上面新建出的文件做成 swap 分区

3、 查看内核参数 vm.swappiness

若 vm.swappiness 为 0 则根据实际需要调整成 30 或者 60

注:若想永久修改,则编辑 /etc/sysctl.conf 文件

4、 启用此交换分区的交换功能

这里有可能会有报错,如下

解决方法:

尝试激活 Swap 文件

5、 关闭 swap 分区

6、 重新激活 swap 分区,没有写入系统配置文件中,系统重启后,就需要重新激活

7、 如果需要一直保持这个 swap ,可以把它写入 /etc/fstab 文件

8、 关机重启确认 Swap 大小

swap空间占用过高解决方案

1、 控制swap使用的系统参数:swappiness

如果swappiness设置太大(内存的速度会比磁盘快很多),这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。

2、 Linux默认swappiness

默认为60,也就是说当物理内存使用到40%的时候开始使用swap。

1、设置

2、激活

当以上方法无法解决问题,或者机器内存消耗大,添加内存,swap也要相应扩展。

1、 查看swap****空间

2、 查看/dev/zero

此/dev/zero一共就1.9G所以添加swap空间不可以超过1.9G

解释: /dev/zero也是一个伪文件,但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。写入它的输出会丢失不见,/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,像临时交换文件。可以用来创建swap。

3、 新建swap****分区空间

注意:创建好的交换文件不能删除,所以要提前找到一个目录。

解释:of为文件名。Bs为单个大小。Count为数量。我创建了一个1G的文件。

4、 mkswap****创建交换文件

5、 swapon****激活

6、 验证

7、 开机启动

由于以上操作为临时生效,服务器重启会失效。所以要设置开机启动。

8、 其他操作

a) 停用:swapoff swapfile

b) 删除:rm –rf swapfile

c) 删除随即启动swap:vi /etc/fstab

Linux上的虚拟内存swap简介

在Linux操作系统中,swap分区的作用相当于Windows系统下的虚拟内存。当物理内存不足时,将部分硬盘空间当内存使用,由于不是真正的内存,因此将其称之为虚拟内存,它的目的就是为了解决内存不足的情况。

Linux操作系统中的swap可以分为两种:一种是将某个物理磁盘分区作为swap,另一种是通过文件来实现swap。

既然配置swap对桌面系统有帮助,那么配置多少大小的swap比较合适呢?下面是ubuntu给出的建议:

或者直接将swap设置为物理内存的2倍!

输入命令 swapon -s 可以查看系统的swap信息,从下面的输出可以看出,设置了一个大小为1G的虚拟内存。

重启系统,再次执行 swapon -s 查看虚拟内存。

本文的测试环境为阿贝云免费云服务器(),阿贝云目前正在进行"免费虚拟主机"和“免费云服务器”体验活动,感兴趣的朋友可以试试。

Swap 机制

当发生了内存泄漏时,或者运行了大内存的应用程序,导致系统的内存资源紧张时,系统又会如何应对呢?

这其实会导致两种可能结果,内存回收和 OOM 杀死进程。

我们先来看后一个可能结果,内存资源紧张导致的 OOM(Out Of Memory),相对容易理解,指的是系统杀死占用大量内存的进程,释放这些内存,再分配给其他更需要的进程。

接下来再看第一个可能的结果,内存回收,也就是系统释放掉可以回收的内存,比如我前面讲过的缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page)

大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。而那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),就得先写入磁盘,然后才能进行内存释放。

这些脏页,一般可以通过两种方式写入磁盘。

除了缓存和缓冲区,通过内存映射获取的文件映射页,也是一种常见的文件页。它也可以被释放掉,下次再访问的时候,从文件重新读取。

除了文件页外,还有没有其他的内存可以回收呢?比如,应用程序动态分配的堆内存,也就是我们在内存管理中说到的匿名页(Anonymous Page),是不是也可以回收呢?

我想,你肯定会说,它们很可能还要再次被访问啊,当然不能直接回收了。非常正确,这些内存自然不能直接释放。

但是,如果这些内存在分配后很少被访问,似乎也是一种资源浪费。是不是可以把它们暂时先存在磁盘里,释放内存给其他更需要的进程?

其实,这正是 Linux 的 Swap 机制。Swap 把这些不常访问的内存先写到磁盘中,然后释放这些内存,给其他更需要的进程使用。再次访问这些内存时,重新从磁盘读入内存就可以了。

Swap 说白了就是把一块磁盘空间或者一个本地文件(以下讲解以磁盘为例),当成内存来使用。它包括换出和换入两个过程。

Swap 其实是把系统的可用内存变大了。这样,即使服务器的内存不足,也可以运行大内存的应用程序。

我们常见的笔记本电脑的休眠和快速开机的功能,也基于 Swap 。休眠时,把系统的内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就可以。这样就省去了很多应用程序的初始化过程,加快了开机速度。

既然 Swap 是为了回收内存,那么 Linux 到底在什么时候需要回收内存呢?前面一直在说内存资源紧张,又该怎么来衡量内存是不是紧张呢?

一个最容易想到的场景就是,有新的大块内存分配请求,但是剩余内存不足。这个时候系统就需要回收一部分内存(比如前面提到的缓存),进而尽可能地满足新内存请求。这个过程通常被称为 直接内存回收 。

除了直接内存回收,还有一个专门的内核线程用来定期回收内存,也就是kswapd0。为了衡量内存的使用情况,kswapd0 定义了三个内存阈值(watermark,也称为水位),分别是页最小阈值(pages_min)、页低阈值(pages_low)和页高阈值(pages_high)。剩余内存,则使用 pages_free 表示。

这里,我画了一张图表示它们的关系。

kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作。

我们可以看到,一旦剩余内存小于页低阈值,就会触发内存的回收。这个页低阈值,其实可以通过内核选项 /proc/sys/vm/min_free_kbytes 来间接设置。min_free_kbytes 设置了页最小阈值,而其他两个阈值,都是根据页最小阈值计算生成的,计算方法如下 :

很多情况下,你明明发现了 Swap 升高,可是在分析系统的内存使用时,却很可能发现,系统剩余内存还多着呢。为什么剩余内存很多的情况下,也会发生 Swap 呢?

看到上面的标题,你应该已经想到了,这正是处理器的 NUMA (Non-Uniform Memory Access)架构导致的。

关于 NUMA,我在 CPU 模块中曾简单提到过。在 NUMA 架构下,多个处理器被划分到不同 Node 上,且每个 Node 都拥有自己的本地内存空间。

而同一个 Node 内部的内存空间,实际上又可以进一步分为不同的内存域(Zone),比如直接内存访问区(DMA)、普通内存区(NORMAL)、伪内存区(MOVABLE)等,如下图所示

先不用特别关注这些内存域的具体含义,我们只要会查看阈值的配置,以及缓存、匿名页的实际使用情况就够了。

既然 NUMA 架构下的每个 Node 都有自己的本地内存空间,那么,在分析内存的使用时,我们也应该针对每个 Node 单独分析。

你可以通过 numactl 命令,来查看处理器在 Node 的分布情况,以及每个 Node 的内存使用情况。比如,下面就是一个 numactl 输出的示例:

这个界面显示,我的系统中只有一个 Node,也就是 Node 0 ,而且编号为 0 和 1 的两个 CPU, 都位于 Node 0 上。另外,Node 0 的内存大小为 7977 MB,剩余内存为 4416 MB。

了解了 NUNA 的架构和 NUMA 内存的查看方法后,你可能就要问了这跟 Swap 有什么关系呢?

实际上,前面提到的三个内存阈值(页最小阈值、页低阈值和页高阈值),都可以通过内存域在 proc 文件系统中的接口 /proc/zoneinfo 来查看。

比如,下面就是一个 /proc/zoneinfo 文件的内容示例:

这个输出中有大量指标,我来解释一下比较重要的几个。

从这个输出结果可以发现,剩余内存远大于页高阈值,所以此时的 kswapd0 不会回收内存。

当然,某个 Node 内存不足时,系统可以从其他 Node 寻找空闲内存,也可以从本地内存中回收内存。具体选哪种模式,你可以通过 /proc/sys/vm/zone_reclaim_mode 来调整。它支持以下几个选项:

到这里,我们就可以理解内存回收的机制了。这些回收的内存既包括了文件页,又包括了匿名页。

不过,你可能还有一个问题。既然有两种不同的内存回收机制,那么在实际回收内存时,到底该先回收哪一种呢?

其实,Linux 提供了一个 /proc/sys/vm/swappiness 选项,用来调整使用 Swap 的积极程度。

swappiness 的范围是 0-100,数值越大,越积极使用 Swap,也就是更倾向于回收匿名页;数值越小,越消极使用 Swap,也就是更倾向于回收文件页。

虽然 swappiness 的范围是 0-100,不过要注意,这并不是内存的百分比,而是调整 Swap 积极程度的权重,即使你把它设置成 0,当剩余内存 + 文件页小于页高阈值时,还是会发生 Swap。

在内存资源紧张时,Linux 通过直接内存回收和定期扫描的方式,来释放文件页和匿名页,以便把内存分配给更需要的进程使用。

你可以设置 /proc/sys/vm/min_free_kbytes,来调整系统定期回收内存的阈值(也就是页低阈值),还可以设置 /proc/sys/vm/swappiness,来调整文件页和匿名页的回收倾向。

在 NUMA 架构下,每个 Node 都有自己的本地内存空间,而当本地内存不足时,默认既可以从其他 Node 寻找空闲内存,也可以从本地内存回收。

你可以设置 /proc/sys/vm/zone_reclaim_mode ,来调整 NUMA 本地内存的回收策略。

(责任编辑:IT教学网)

更多