性能优化理论篇 | swap area是个什么东西

news2024/11/15 20:03:24

我们知道每台计算机的内存(RAM)都是有限的,而我们的应用程序需要加载到内存才能被运行,如果一台机器运行多个应用程序时,内存可能会耗尽。Linux 系统中的“交换空间(也称为交换分区)”可以帮助缓解内存不足的问题。

其实对于交换空间,如果能弄清楚以下几个疑问,那么对交换空间的理解也就差不多了。

  • 什么是交换空间 ?

  • 为什么需要交换空间?

  • 如何查看交换空间大小?

  • Linux 需要交换空间吗?

  • 机器的 RAM容量很大,还需要交换空间吗?

  • Linux 系统应该配置多大的交换空间?

  • 交换空间如何工作?

  • 频繁交换导致的性能问题

  • 如何在 Linux 中增加交换空间?

什么是交换空间 ?

从物理层面(存储层面)看,交换空间只是辅助存储器(Secondary Memory,如硬盘)上的一个特殊区域,用于在 系统内存 不足时临时存储数据,此时,操作系统会将一些不常使用的数据从 内存 中移出,暂时存放在这个交换空间中,以腾出 内存 空间给需要的程序。

从虚拟内存的概念来看,交换空间是虚拟内存的一部分。

虚拟内存是操作系统通过将物理内存(RAM)和硬盘上的交换空间结合起来使用的一种机制。它让系统可以假装拥有比实际物理内存更多的内存资源。

为什么需要交换空间?

我们已经了解了交换空间是什么,接下来看看为什么交换空间对于系统来说是必需的:

  1. 低配置机器:如果机器的 内存 很小,例如只有 1GB 或更少,那么交换空间是必不可少的,因为大多数应用程序可能会耗尽这点 内存,如果没有交换分区,这台机器可能连一个应用程序都运行不起来。

  2. 防止系统崩溃:当系统内存耗尽时,如果没有交换空间,操作系统可能会无法再分配内存给新进程或需要更多内存的进程,这可能导致系统崩溃。有了交换分区,遇到这种情况时,系统可以暂时将一些不常用的数据移到交换空间,以腾出内存,避免系统整体崩溃。

总结一下,交换空间的作用,就像是安全带( safety belt),如果有进程悄无声息地消耗越来越多的内存(比如内存泄漏 Memory Leak),内存吃不消的情况下,没关系,还有交换空间这个缓冲区。操作系统会帮你将某些内存置换到交换空间,来满足你的需求,直到交换空间也顶不住了为止。

假如没有交换空间,操作系统的OOM大神就会嘎崩脆地杀死了一些进程,但是这些被杀的进程,不一定就是你想让它们死的进程。有了交换空间,在内存吃紧的情况下,你就会发现你的机器变慢了,反应很迟钝,很卡。这是因为原本正常情况下访问内存的操作,不得不先将磁盘上内容置换进入内存。这种很卡本身会给你提示,给你一个时间,给你一个机会,让你在交换空间 也耗尽之前,干掉你真正想干掉的进程。

为了理解上面的内容,这里做个小实验。

启动一个不断消耗内存的程序,看下linux如何应对这个进程。程序代码如下:

int main(int argc, char** argv)
{
    int max = -1;
    int mb = 0;
    char* buffer;

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer=malloc(10*1024*1024)) != NULL && mb != max)
    {
        memset(buffer, 0,10*1024*1024);
        mb = mb + 10;
        printf("Allocated %d MB\n", mb);
        sleep(1);
    }
    return 0;
}

首先我将交换空间 用swapoff -a 清空,然后swapon -a打开,然后执行这个程序。

root@manu-hacks:~/code/c/self/swap# swapoff -a
root@manu-hacks:~/code/c/self/swap# free -m
             total       used       free     shared    buffers     cached
Mem:          1942       1731        210          0         38        281
-/+ buffers/cache:       1411        530
Swap:            0          0          0

猜猜看,这个进程最多能分配多少内存?现在看起来free的只有530M ,这已经算上了cached的内容,也就是说,我们最多哪怕把所有的file cache也占用掉,也不过是能够分配530M的内存。事实上是这样吗?

root@manu-hacks:~/code/c/self/swap# swapon -a ;  free -m ; ./eat_mem 
             total       used       free     shared    buffers     cached
Mem:          1942       1741        200          0         38        282
-/+ buffers/cache:       1421        521
Swap:         3907          0       3907
Allocated 10 MB
Allocated 20 MB
Allocated 30 MB
Allocated 40 MB
Allocated 50 MB
Allocated 60 MB
Allocated 70 MB
Allocated 80 MB

.......
Allocated 3020 MB
Allocated 3030 MB
Allocated 3040 MB
Allocated 3050 MB
root@manu-hacks:~/code/c/self/swap#
root@manu-hacks:~/code/c/self/swap#

我们看到,实际上,分配了3050MB,才被杀死。这个过程中,cache中内容被驱逐,cache越来越小,而Swap used部分越来越多,越来越多的内容被置换到swap area 。感兴趣的筒子可以用 watch ‘free -m’ 查看这个内存的变换过程,很有意思。

如何查看交换空间大小?

查看交换空间的大小以及使用情况,一般使用free命令即可,如下所示:

qin@linux-01:~$ free -h
              total     used     free      shared  buff/cache   available
Mem:        15Gi       4.7Gi    6.3Gi       986Mi     4.5Gi     9.5Gi
Swap:       2.0Gi        0      2.0Gi

Linux 需要交换空间吗?

建议为系统配置一定量的交换空间。虽然交换空间不是 Linux 系统的运行的必备条件,但它与充足的 RAM 一起,可以确保系统的性能和稳定性。

在 Ubuntu 系统中,默认会自动创建一个 2GB 的交换文件,这在一定程度上也表明了在 Linux 系统中使用交换空间的重要性,否则就没必要默认自动创建交换分区了。

机器的 RAM容量很大,还需要交换空间吗?

如果系统配置了 64GB 或更多的 内存,那么通常很难用完所有的 内存。因此,在这种情况下,交换空间的重要性降低,可以不必配置。

但在某些特殊情况下,仍然可能需要少量的交换空间以确保系统的稳定性。例如,如果某个故障程序占用了大部分 内存,交换空间可以帮助提高系统的稳定性。虽然这种情况不常见,但一旦发生,交换空间可以为系统提供额外的缓冲,从而避免崩溃。而且增加交换空间不会对系统造成任何损害,为什么不配置一点了?

Linux 中应该配置多少交换空间?

关于交换空间的大小,过去有一种普遍的说法是交换空间应为 RAM 大小的两倍,但在现代计算机中,这个规则已经不再适用。实际上,交换空间的大小并没有严格的指导原则。

根据 Red Hat 的建议,对于配备 4GB 或更大容量 RAM 的现代系统,交换空间的大小建议为 RAM 大小的 20%。

CentOS 的建议与 Red Hat 略有不同,具体如下:

  • 如果 机器的内存 小于 2GB,交换空间应为 RAM 大小的两倍。

  • 如果 机器的内存 超过 2GB,则交换空间应为 RAM 大小 + 2 GB(例如 3GB RAM 对应 5GB 交换空间)。

在 Ubuntu 中,交换空间的大小取决于是否使用休眠模式:

  • 如果需要休眠,交换空间应等于 RAM 大小。

  • 如果不需要休眠,建议如下:

    • 内存小于 1GB:交换空间应至少等于 RAM 大小,最多为其两倍。
    • 内存大于 1GB:交换空间应至少等于 RAM 大小的平方根,最多为其两倍。

交换空间如何工作?

引入交换空间后,涉及到交换分区的工作流程如下:

  1. 内存容量耗尽:当计算机的内存被完全使用完了,即没有足够的空间来处理新的任务时。
  2. 识别最近未访问的数据:操作系统会检查内存中的数据,找出那些最近没有被访问的数据。这些数据通常是暂时不需要的,可以安全地从内存中移出。
  3. 将数据从内存传输到交换空间:这些不活跃的数据会被移动到硬盘上的交换空间。这就像把书从桌子上移到书架上,以腾出空间让你继续在桌子上工作。
  4. 将新数据磁盘加载到内存:当新的任务需要内存或者之前移动的数据再次需要时,操作系统会将数据从交换空间移动回内存。

频繁交换导致的性能问题

在 物理内快满的情况下,可能会发生一种称为 “频繁交换”(thrashing) 的现象。这种现象通常会导致系统性能急剧下降,甚至使系统完全无响应。

当系统的物理内存几乎被完全占用,无法为新的或现有的进程提供足够的空间。
系统不断地将内存页移到交换空间,然后又从交换空间中取回。这种反复的页面切换占用了大量的 CPU 资源和 I/O 带宽,导致系统性能大幅下降变得极其缓慢,甚至无响应。

此时,如果使用 free 的命令来显示 CPU 负载和内存使用情况,你会发现 CPU 负载非常高,可能达到系统中 CPU 内核数量的 30 到 40 倍,并且内存和交换空间几乎完全被分配了。

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           7.7G        7.3G        100M        500M        300M        200M
Swap:          2.0G        1.9G        100M

如何在 Linux 中增加交换空间?

首先,您需要检查系统是否已经启用了交换空间。您可以在终端中输入以下命令来检查:

qin@linux-01:~$ sudo swapon --show
NAME      TYPE      SIZE USED PRIO
/dev/sda5 partition 2G   0B   -2

也可以使用free命令查看。

qin@linux-01:~$ free -h
              total     used     free      shared  buff/cache   available
Mem:        15Gi       4.7Gi    6.3Gi       986Mi     4.5Gi     9.5Gi
Swap:       2.0Gi        0      2.0Gi

可以看出,这里我的机器有 15 GB RAM,分配的交换空间内存为 2 GB。

1. 创建交换文件

首先,使用以下 dd 命令创建一个 1 GB 大小的交换文件:

sudo dd if=/dev/zero of=/swap_file bs=1GB count=1
2. 设置权限

为了确保交换文件的安全性,您需要将其权限设置为 600,防止其他用户读取其中的敏感数据:

sudo chmod 600 /swap_file
3. 在交换文件上启用交换区域

使用 mkswap 命令将该文件设置为交换区域:

sudo mkswap /swapfile
4. 在 fstab 文件中添加条目

为了确保每次系统重启后交换空间依然有效,需要将交换文件的信息添加到 fstab 文件中。可以使用以下 echo 命令来进行操作,或者手动编辑 fstab 文件:

echo "swap_file swap  swap  defaults  0 0" >> /etc/fstab
5. 扩展交换空间

要启用交换文件,请使用以下 swapon 命令:

sudo swapon /swap_file
6. 检查交换空间

使用以下命令来确认交换空间是否已启用:

free -m 

#或者
swapon -s

如果需要禁用交换文件,可以使用以下 swapoff 命令:

sudo swapoff /swap_file

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VM相关配置及docker

NAT——VMnet8网卡 桥接——WLAN/网线 仅主机——VMnet1网卡 docker与虚拟机的区别 启动docker服务 systemctl start docker 重启 systemctl start docker关闭docker服务 systemctl stop docker.servicedocker的两大概念 镜像:images,应用程序的静态文…

nssctf-[SWPUCTF 2022 新生赛]1z_unserialize-简单的序列化题目

1. 打开题目是一段很简单的php代码 对代码进行分析,题目中有一个__destruct析构函数,这个函数是在对象被销毁的时候触发,那那么在这里new一下就相当于销毁一个对象,$a$this->lt;和$a($this->lly);相当于是$this->lt(thi…

CSS3-新特性

1.新增选择器 1.属性选择器 2.结构伪类选择器 3.伪元素选择器(重点) 4.CSS3 盒子模型 2.CSS3滤镜filter 3.CSS3 calc 函数 4.CSS3 过渡(重点)

8月18日微语报,星期日,农历七月十五

8月18日微语报,星期日,农历七月十五,周末愉快! 一份微语报,众览天下事! 1、南昌从业者谈蔬菜涨价:天热易变质增加损耗,农户收入未明显提升。 2、委员建议“行政教学分离”&#x…

后端开发刷题 | 寻找峰值【二分法】

描述 给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于 2.假设 nums[-1] nums[n] −∞ 3.对于…

【精选】基于Java摄影约拍系统设计与实现(全网独一无二,最新定制)

目录 目录: 系统简介: 核心技术介绍 mysql技术介绍 IDEA编译器介绍 Springboot框架简介 springmvc框架简介 Mybatis技术简介 Node.js技术简介 Vue.js技术简介 系统数据库详细设计 系统功能设计 系统测试运行 模块测试 系统整体测试 测试过程 测试…

启明欣欣STM32开发板运行ThreadX

ThreadX是非常优秀的RTOS,微软收购了ThreadX后就开源了,后来又交给Eclipse基金会, 本文讲述如何在STM32上运行ThreadX,使用CubeMX来实现。本人环境如下, CM4芯片:STM32F407ZGT6,内存192KB&am…

分布式事务方案——基于两阶段提交的 XA事务

分布式事务方案——基于两阶段提交的 XA事务 在这篇文章中深入理解分布式事务中的两阶段提交(2PC),什么是2PC,2PC原理是怎样?2PC有没有什么问题?解决方案?无法解决的情况? 我们详细…

24/8/18算法笔记 目标导向强化学习

目标导向强化学习(Goal-Oriented Reinforcement Learning,简称GORL)是强化学习的一个分支,它关注于智能体如何通过与环境的交互来实现特定的目标或任务。与传统的强化学习不同,目标导向强化学习更加关注目标的设定和达…

图像数据处理13

三、空域滤波 3.1滤波器的基本概念 什么是滤波? 简单来说就是从干扰信号中提取出有用的信号 3.1.1空域滤波(Spatial Domain Filtering) 空域滤波适用于简单的滤波任务,直接对图像的像素空间进行操作。它通过对图像中的每个像…

如何选择流量与商业潜力兼备的SEO关键词?

如何选择流量与商业潜力兼备的SEO关键词? 你选择的关键词可以成就或破坏你的SEO活动。 如果你明智地选择关键词,那么你制作的内容将有可能月复一月地吸引有价值的自然搜索流量。如果你选择了错误的关键词,你的内容将只能吸引低价值的流量&a…

Java流程控制07:增强for循环

本节内容视频链接:Java流程控制10:增强for循环_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p42&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的增强for循环(‌也称为“for-each”循环)‌是…

实用好软-----电脑端好用的免费音乐下载小工具 简单 快速

目前很多很多音乐软件都是收费的。要么是试听。前段时间分享了一款嗅探工具感觉很不错。今天分享的这款小工具超小。下载只有3M大小。解压后运行窗口简单。直接输入歌曲名字即可搜索出来。然后选择下载即可 界面 测试了下还是比较好用的。而且下载很快 ,不过软件显…

Ajax-02.Axios

Axios入门 1.引入Axios的js文件 <script src"js/axios-0.18.0.js"></script> Axios 请求方式别名: axios.get(url[,config]) axios.delete(url[,config]) axios.post(url[,data[,config]]) axios.put(url[,data[,config]]) 发送GET/POST请求 axios.get…

PROLOG实现亲属关系小型演绎数据库

问题 试编写一个描述亲属关系的PROLOG程序&#xff0c;然后给出一些事实数据&#xff0c;建立一个小型演绎数据库。 代码实现 % 基本事实 father(john, mike). father(john, lisa). father(boluo, ana). father(boluo, peter).mother(mary, mike). mother(mary, lisa). mother…

大厂进阶五:React源码解析之深度剖析Diff算法

本文主要针对React源码进行解析&#xff0c;内容有&#xff1a; 1、Diff算法原理、两次遍历 2、Diff瓶颈及限制 3、Diff更新之单节点和多节点原理 一、Diff源码解析 以下是关于 React Diff 算法的详细解析及实例&#xff1a; 1、React Diff 算法的基本概念和重要性 1.1 概念…

【串口助手开发】--温度曲线图实时显示功能,全流程小白教程,zedgraph控件的使用方法,Visual Studio 软件C#语言

1、ZedGraph.dll 控件下载 链接&#xff1a;下载ZedGraph&#xff08;ZedGraph.dll 和ZedGraph.Web.dll文件&#xff09; 打开链接后&#xff0c;图中红框显示的是仅下载zedgraph控件&#xff0c;本文所需的文件是ZedGraph.dll。 2、ZedGraph.dll 控件添加进Visual Studio 软…

【Arduino】ATmega328PB 连接 LSM6DS3 姿态传感器,并读数据(不确定 ESP 系列是否可行,但大概率是可行的)

总览 1.初始化 ATmega328PB&#xff0c;默认大家已经完成了 328 的配置准备工作&#xff0c;已经直接能够向里面写入程序 2.接线&#xff0c;然后验证 mega328 的 I2C 设备接口能否扫描到 LSM6DS3 3.编写代码&#xff0c;上传&#xff0c;查看串口数据。完成。 一、初始化 AT…

履带无人车+无人机+自组网:空地一体化技术详解

履带无人车、无人机与自组网技术的结合&#xff0c;构成了空地一体化技术的核心框架&#xff0c;这种技术在多个领域展现出巨大的潜力和应用价值。以下是对该技术的详细解析&#xff1a; 一、技术概述 空地一体化技术巧妙融合了履带无人车、无人机以及自组网技术&#xff0c;…