性能优化理论篇 | swap area是个什么东西
我们知道每台计算机的内存(RAM)都是有限的,而我们的应用程序需要加载到内存才能被运行,如果一台机器运行多个应用程序时,内存可能会耗尽。Linux 系统中的“交换空间(也称为交换分区)”可以帮助缓解内存不足的问题。
其实对于交换空间,如果能弄清楚以下几个疑问,那么对交换空间的理解也就差不多了。
-
什么是交换空间 ?
-
为什么需要交换空间?
-
如何查看交换空间大小?
-
Linux 需要交换空间吗?
-
机器的 RAM容量很大,还需要交换空间吗?
-
Linux 系统应该配置多大的交换空间?
-
交换空间如何工作?
-
频繁交换导致的性能问题
-
如何在 Linux 中增加交换空间?
什么是交换空间 ?
从物理层面(存储层面)看,交换空间只是辅助存储器(Secondary Memory,如硬盘)上的一个特殊区域,用于在 系统内存 不足时临时存储数据,此时,操作系统会将一些不常使用的数据从 内存 中移出,暂时存放在这个交换空间中,以腾出 内存 空间给需要的程序。
从虚拟内存的概念来看,交换空间是虚拟内存的一部分。
虚拟内存是操作系统通过将物理内存(RAM)和硬盘上的交换空间结合起来使用的一种机制。它让系统可以假装拥有比实际物理内存更多的内存资源。
为什么需要交换空间?
我们已经了解了交换空间是什么,接下来看看为什么交换空间对于系统来说是必需的:
-
低配置机器:如果机器的 内存 很小,例如只有 1GB 或更少,那么交换空间是必不可少的,因为大多数应用程序可能会耗尽这点 内存,如果没有交换分区,这台机器可能连一个应用程序都运行不起来。
-
防止系统崩溃:当系统内存耗尽时,如果没有交换空间,操作系统可能会无法再分配内存给新进程或需要更多内存的进程,这可能导致系统崩溃。有了交换分区,遇到这种情况时,系统可以暂时将一些不常用的数据移到交换空间,以腾出内存,避免系统整体崩溃。
总结一下,交换空间的作用,就像是安全带( 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 -mtotal 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 -htotal 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 大小的平方根,最多为其两倍。
交换空间如何工作?
引入交换空间后,涉及到交换分区的工作流程如下:
- 内存容量耗尽:当计算机的内存被完全使用完了,即没有足够的空间来处理新的任务时。
- 识别最近未访问的数据:操作系统会检查内存中的数据,找出那些最近没有被访问的数据。这些数据通常是暂时不需要的,可以安全地从内存中移出。
- 将数据从内存传输到交换空间:这些不活跃的数据会被移动到硬盘上的交换空间。这就像把书从桌子上移到书架上,以腾出空间让你继续在桌子上工作。
- 将新数据磁盘加载到内存:当新的任务需要内存或者之前移动的数据再次需要时,操作系统会将数据从交换空间移动回内存。
频繁交换导致的性能问题
在 物理内快满的情况下,可能会发生一种称为 “频繁交换”(thrashing) 的现象。这种现象通常会导致系统性能急剧下降,甚至使系统完全无响应。
当系统的物理内存几乎被完全占用,无法为新的或现有的进程提供足够的空间。
系统不断地将内存页移到交换空间,然后又从交换空间中取回。这种反复的页面切换占用了大量的 CPU 资源和 I/O 带宽,导致系统性能大幅下降变得极其缓慢,甚至无响应。
此时,如果使用 free 的命令来显示 CPU 负载和内存使用情况,你会发现 CPU 负载非常高,可能达到系统中 CPU 内核数量的 30 到 40 倍,并且内存和交换空间几乎完全被分配了。
$ free -htotal 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 -htotal 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
相关文章:

性能优化理论篇 | swap area是个什么东西
我们知道每台计算机的内存(RAM)都是有限的,而我们的应用程序需要加载到内存才能被运行,如果一台机器运行多个应用程序时,内存可能会耗尽。Linux 系统中的“交换空间(也称为交换分区)”可以帮助缓…...
Photoshop (PS)下载安装win/mac版
目录 一、概述 下载 二、安装步骤 三、使用教程 四、快捷键汇总 一、概述 Adobe Photoshop,简称“PS”,是由Adobe Systems开发和发行的图像处理软件。它主要处理以像素所构成的数字图像,涵盖了诸多领域,如图像编辑、图像合成…...

初识redis:Set类型
Set有很多种含义,比如集合,比如设置(和get相对应)。 在这里我们说的set是指的redis中的集合,并且这里的集合是无序的,和之前的list是对应的。 List : [1,2,3] 和 [2,1,3] 是两个不同的listSe…...
Qt 设置QTableView的某列或某行只读
我的做法是实现一个委托(delegate),然后把它设给你要只读的列或行 class ReadOnlyDelegate: public QItemDelegate {public:ReadOnlyDelegate(QWidget *parent NULL):QItemDelegate(parent){}QWidget *createEditor(QWidget *parent, const…...
这么多焊工证,我该拥有那种焊工证呢?
焊接与切割作为特种作业工作,国家根据不同的环境和作业特点,从事焊接工作的焊工需要持证上岗工作,那么是不是焊接就只有一种工作证呢?如果不是,焊工所在的工作岗位需要什么样的焊工证,如何取得焊工证&#…...
HttpWebRequest访问https请求被中止: 未能创建 SSL/TLS 安全通道
编写代码,使用HttpWebRequest访问网页,错误提示: 未能创建 SSL/TLS 安全通道 页面本来是Http网址,突然转换为https网址,所以遇到这个问题也算正常。将解决方法记录下来给需要的人。 //只需要在 HttpWebRequest 发送…...
响应式Web设计:纯HTML和CSS的实现技巧
文章目录 响应式Web设计:纯HTML和CSS的实现技巧一、响应式Web设计概述二、实现响应式设计的技巧1. 使用媒体查询(Media Queries)2. 使用弹性布局(Flexbox)3. 使用网格布局(CSS Grid)4. 使用相对…...
linux centos 防火墙常用命令
1、开放端口 firewall-cmd --zonepublic --add-port80/tcp --permanent 1 2、查看某端口是否开放 firewall-cmd --query-port80/tcp 1 3、查看端口开启列表 firewall-cmd --list-port 1 4、重启防火墙 firewall-cmd --reload 1 5、关闭防火墙 systemctl stop firewalld.se…...

iOS18 Beta7 最终测试版推送:苹果的又一次技术飞跃
苹果公司以其一贯的创新精神和对完美的追求,再次引领了科技界的新潮流。今天,我们聚焦于苹果最新推送的iOS18 Beta7最终测试版,这一版本不仅是苹果软件更新的里程碑,更是用户体验的一次重大升级。 最终测试版的亮相 在众多果粉的…...

超详细!2024叉车证办理及考试流程详解!速看!
根据《特种设备安全监察条例》规定:叉车操作员必须经专业培训和考核,取得地、市级以上质量技术监督行政部门颁发的作业人员资格证书,方可从事该项工作。叉车驾驶证是属于特种车辆驾驶证,要到全国市级质量监督局指定叉车训练基地报…...

浅谈监听器插件之SSHMon Samples Collector
浅谈监听器插件之SSHMon Samples Collector SSHMon Samples Collector 是 JMeter 的一个强大插件,它允许用户通过 SSH 协议远程监控目标服务器的资源利用率,为性能测试提供实时的系统性能数据。这对于评估应用在高负载条件下的表现以及定位性能瓶颈至关…...

R语言论文插图模板第7期—分组散点图
在之前的文章中,分享过R语言折线图的绘制模板: 柱状图的绘制模板: 本期再来分享一下散点图(分组)的绘制方法。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,…...
设计模式 抽象工厂方法模式
定义与特点 工厂方法模式(FactoryMethod),定义一个创建产品对象的工厂接口,让工厂子类决定实例化那一个产品类。工厂方法使一个类的实例化延迟到其子类。 我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂…...

PowerShell 一键配置IP
前言 实现一键更改Windows 网卡IP,子网,网关,dns,重命名网卡,获取的接口索引名称,获取接口名称,刷新组策略,刷新系统,脚本可重复配置,,以下环境我是两个网卡配置IP 前提条件 开启wmi,配置网卡,参考 创建更改网卡脚本 实验环境,两个网卡,清除默认,重命名(配置)…...

【Pyhthon读取 PDF文件表格 ,转为 CSV/TSV/JSON文件】
tabula-py tabula-py 是一个将 PDF 表格转换为 pandas DataFrame 的工具。 tabula-py 是 tabula-java 的包装器,需要您的机器上有 java。 tabula-py 还允许您将 PDF 中的表格转换为 CSV/TSV 文件。 tabula-py 的 PDF 提取准确度与 tabula-java 或 tabula app 相…...

<数据集>商品条形码识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:3748张 标注数量(xml文件个数):3748 标注数量(txt文件个数):3748 标注类别数:1 标注类别名称:[Barcode] 序号类别名称图片数框数1Barcode37484086 使用标注工具&am…...

无人机系统的关键技术
一、飞控系统:是无人机完成整个飞行过程的关键,决定了无人机的飞行性能和稳定性。 二、导航系统:提供无人机所需的位置、速度和飞行姿态等信息,引导无人机按照指定航线飞行。 三、动力系统:提供飞行动力,…...

(24)(24.4) MultiWii/DJI/HDZero OSD (version 4.2 and later)(一)
文章目录 前言 1 基于遥测的OSD 前言 ArduPilot 使用基于MSP(MultiWii 串行协议)的协议支持多种类型的屏幕显示(OSD): 基于 MSP 遥测的操作系统,如大疆 FPV 护目镜 V1/V2、大疆护目镜 RE、FatShark Byte…...

HiveSQL:提取json串内容——get_json_oject和json_tuple
提取json串中内容,json格式示例如下 方法(运行环境Hive) get_json_objectjson_tuple get_json_object select json_data,get_json_object(json_data,$.price) as price -- 取第一层,get_json_object(json_data,$.inquiry_params) as in…...
Clickhouse 二进制安装
下载对应版本https://github.com/ClickHouse/ClickHouse 分别选择arm64/x86_64 对应的tgz 场景是需要把ck所有文件安装指定目录,使用rpm会散布在各个目录不方便管控 下载client,common-static,server这三个 将相同的目录合并成一个(这里注意需要在l…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...