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

我们知道每台计算机的内存(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 -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 大小的平方根,最多为其两倍。

交换空间如何工作?

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

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

频繁交换导致的性能问题

在 物理内快满的情况下,可能会发生一种称为 “频繁交换”(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

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

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

相关文章

Google Play开发者账号地址验证难题?这些经验或许能帮到你

目前,想要把应用顺利上架到 Google Play,已经不像以前那么简单了,主要是开发者需要应对 Google 日益严格的审核机制。其中,账号验证的地址验证绝对是让很多人头疼的一个环节。 今天就来给大家分享一些真实的经验和干货&#xff0c…

IA实验:静态路由(1基础版)

实验拓扑: 实验要求: 1.实现全网通 实验思路: 1.给各个设备配置好端口的IP地址并且划分广播域,暂定网段为: 192.168.1.0 192.168.2.0 192.168.3.0 2.pc1去ping各网段的设备以及端口,发现3.0网段以及2.2网…

数控单主轴走心机多少钱

单主轴走心机的价格因品牌、型号、性能及配置等因素而异,因此无法给出一个具体的统一价格。一般来说,单主轴走心机的价格在数万元到数十万元不等。 市场上某些品牌的单主轴走心机价格可能在十几万之间不等,而另一些高端型号或定制产品的价格可…

苹果上架没有iphone、没有ipad也可以生成截屏

使用flutter、uniapp或其他跨平台框架开发ios的APP,上架的时候都会遇到一个问题,上架的时候需要各种尺寸的设备来做ios截屏。 比如目前最新的要求是,iphone需要三种不同尺寸的设备的截屏,假如支持ipad则还需要使用ipad 2代和ipad…

从0开始搭建个人博客《第十一期:优化网站访问速度》

目录 一、背景说明 二、Nginx性能优化 (一)文件句柄 1.系统全局性修改和用户局部性修改 2.进程局部性修改 (二)CPU亲和配置 1.设置工作进程数 2.设置连接数 (三)事件处理模型优化 (四&…

MySql 高阶 概念(了解即可)

mysql 分为4层结构: 连接层:负责处理链接,鉴权,安全。 服务层:负责sql接口,sql分析,sql优化,sql缓存。 引擎层:负责执行服务层的操作,不同的引擎拥有不同的特…

《机器学习》一元、多元线性回归的实现 No.4

一、一元线性回归实现 先直接看完整代码: import pandas as pd import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegressiondate pd.read_csv(data.csv) #导入数据plt.scatter(date[广告投入],date[销售额]) # 用散点图展示数据 plt.sh…

这对二婚夫妻结婚半年,一起生活才一个月,就走到了婚姻尽头!

这对二婚夫妻结婚半年,一起生活才一个月,就走到了婚姻尽头! 这是一篇涉离婚纠纷的民事起诉状 (范文点评) 离 婚 起 诉 状 原告:韩某斌,男,现年37岁,汉族,打…

记录一个变量溢出的bug

文章目录 如题 如题 count2变量溢出了(超过了255),结果导致busOff_16bitRecordHILTime变量莫名其妙被清0

「C++系列」vector 容器

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能教程 文章目录 一、vector 容器1. 基本特性2. 基本操作3. 注意事项 二、应用场景1. 应用场景2. 案例案例一&#xff1…

DRF——请求的封装与版本管理

文章目录 django restframework1. 快速上手2. 请求数据的封装3. 版本管理3.1 URL的GET参数传递(*)3.2 URL路径传递(*)3.3 请求头传递3.4 二级域名传递3.5 路由的namespace传递 小结 django restframework 快速上手请求的封装版本…

公司的全称可以申请注册商标吗,还有什么注意!

近日有个网友找到普推知产商标老杨,发来公司全称,问这个可以申请注册商标不,看发来是“贵州**酒业有限公司”,应该是做茅台镇酒的,以前以分析过《公司全称能不能注册商标》,这次帮网友分析完做下补充。 公…

基于springboot的招聘系统的设计与实现

TOC springboot614基于springboot的招聘系统的设计与实现--论文 研究背景 近年来,由于计算机技术和互联网技术的快速发展,使得所有企事业单位内部都是数字化、信息化、无纸化的发展趋势,随着趋势的发展,各种决策系统、辅助系统…

编码器精度

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录 前言一、影响因素二、编码器精度三、位置因素四、环境因素五、磁编码器 前言 送给大学毕业后找不到奋斗方向的你&…

IntelliJ IDEA 集成 ShardingSphere-JDBC 访问分库分表

背景 众所周知,IntelliJ IDEA 是 Java 领域常用的开发工具之一,IDEA Ultimate(旗舰版)或其他例如 DataGrip 等 Intellij 平台的工具都集成了对数据库的访问能力。 但是,对于做了分库分表的项目,直接使用 …

中秋节月饼销售利用106短信群发平台业绩翻倍案例分析

在中秋节这一传统佳节,月饼作为节日的标志性食品,其销售市场竞争尤为激烈。为了在众多品牌中脱颖而出,不少月饼销售企业开始探索创新的营销方式。其中,利用106短信群发平台进行精准营销,成为众多企业实现业绩翻倍的有效…

TCP端口范围

ip_local_port_range sysctl -a | grep ip_local_port_range | head 默认情况下,net.ipv4.ip_local_port_range的默认值为32768-60999。这意味着本地应用程序可以使用的端口号范围为32768到60999。 sysctl -a | grep net.ipv4.ip_local_reserved_ports |head …

C++ 特殊类设计以及单例模式

目录 1 不能被拷贝 2 只能在堆上创建对象 3 只能在栈上创建对象 4 禁止在堆上创建对象 5 不能被继承的类 6 单例类 特殊类就是一些有特殊需求的类。 1 不能被拷贝 要设计一个防拷贝的类,C98之前我们只需要将拷贝构造以及拷贝赋值设为私有,同时只声明…

2 种方式申请免费 SSL 证书,阿里云 Certbot

如何使用免费的 SSL 证书,有时在项目中需要使用免费的 SSL 证书,Aliyun 提供免费证书,三个月有效期,可以直接在aliyun 申请,搜索 SSL 证书,选择测试证书。 Aliyun 证书需要每三月来来换一次,页…

【学习笔记】8、脉冲波形的变换与产生

本章简略记录。 8.1 单稳态触发器(脉冲触发) 单稳态触发器 应用于 :(1)脉冲整型(2)脉冲延时 (3)定时 单稳态触发器的工作特性: 没有触发脉冲作用时&#xf…