性能优化理论篇 | 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…...
【maaath】Flutter for OpenHarmony 体重管理应用开发实战
Flutter for OpenHarmony 体重管理应用开发实战:从数据模型到完整功能实现欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 作者:maaath一、前言 随着 OpenHarmony 生态的快速发展,Flutter for OpenHarmon…...
PyTorch实战:基于ResNet-50的室内场景图像分类(附完整代码与MIT67数据集处理)
1. 室内场景分类与ResNet-50实战概述 室内场景分类是计算机视觉中的经典任务,比如区分客厅、厨房、卧室等不同功能区域。这个任务看似简单,但实际应用中会遇到光照变化、视角差异、物体遮挡等挑战。我去年参与过一个智能家居项目,就遇到过摄像…...
抠图opencv有现成的开源DNN库
OpenCV 本身并没有像“专门用于抠图(图像分割/抠前景)”的 DNN 模型库,但它可以直接使用一些流行的 语义分割/实例分割 模型来完成抠图。这里我给你梳理一下思路和方案:1️⃣ OpenCV DNN 支持的分割模型OpenCV 的 dnn 模块可以加载…...
儿童房 书房健康照明设计:国标 RG0/UGR<19/Ra≥90 武汉家装实用指南
摘要家里装儿童房、书房,灯光真不是随便装个灯就行。尤其武汉本地家庭,孩子长期在家写作业、看书,灯光选不对,很容易眼疲劳、揉眼睛、注意力不集中。本文结合实际家装经验,照着国标要求,用大白话讲清无蓝光…...
揭秘Midjourney底层图像编码协议:Rust逆向解析PNG元数据+动态DPI印相校准(含v6.2协议逆向日志)
更多请点击: https://intelliparadigm.com 第一章:Midjourney图像编码协议的演进与印相范式变革 Midjourney 的图像生成并非基于传统像素栅格的直接操作,而是依托一套动态演化的隐式编码协议——该协议将文本提示(prompt&#x…...
别傻傻手敲了!用C++文件读写自动生成OpenJudge NOI 1.1超级玛丽游戏代码
用C文件操作自动化生成OpenJudge NOI超级玛丽游戏代码 在信息学竞赛中,我们经常会遇到需要输出固定字符图案的题目,比如OpenJudge NOI 1.1中的超级玛丽游戏题目。手动编写这些图案的打印代码不仅耗时耗力,还容易出错。本文将介绍如何利用C的文…...
保姆级教程:在VMware Workstation 16 Pro上为ArchLinux配置完整的拖放和剪贴板共享
在VMware Workstation Pro上为ArchLinux配置无缝交互功能全指南 对于追求极致效率的开发者而言,虚拟机与宿主机之间的隔阂常常成为工作流中的瓶颈。想象一下,当你在宿主机上浏览到一个关键的技术文档,却无法直接将链接分享到虚拟机中的开发环…...
【信息科学与工程学】【通信工程】第十二篇 信息论01
信息论数学理论体系 信息论建立在坚实的数学基础之上,主要涉及概率论、统计学、随机过程、线性代数、优化理论和实分析等多个领域。以下是信息论中数学理论的全面梳理: 一、概率论基础 1.1 基本概念 概率空间 (Ω,F,P) 随机变量:离散型、连续型、混合型 概率分布:PM…...
ESP32无代码物联网开发:WipperSnapper实战指南
1. 项目概述:当ESP32遇上无代码物联网如果你手头有一块ESP32-S2或ESP32-S3开发板,想快速做个物联网小项目,比如远程控制个LED灯,或者把家里的温湿度数据传到网上看看,但一看到要写代码、配网络、调API就头疼࿰…...
Visual C++运行库终极解决方案:3分钟修复Windows软件启动失败
Visual C运行库终极解决方案:3分钟修复Windows软件启动失败 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经在打开游戏或专业软件时&#…...
