性能优化理论篇 | 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.rhkb.cn/news/406489.html

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

相关文章

使用AWS Lambda轻松开启Amazon Rekognition之旅

这是本系列文章的第一篇,旨在通过动手实践,帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章,大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧! 介绍 什么是Amazon Rekognition&…

微软的免费“后悔药“-Windows File Recovery (WinFR)

微软的免费"后悔药"-Windows File Recovery (WinFR) 当你不小心误删除了文件或因各种意外情况导致数据丢失,可以使用 EasyRecovery、Disk Drill、DiskGenius、Recuva 等“上古”软件,也可以交由专业机构进行恢复。微软(Microsoft&…

揭秘!移动安全管理系统是什么?有什么功能?(从小白到精通一文揭晓!)

在2024年,移动终端管控软件在企业和组织中的应用日益广泛。 移动安全管理系统不仅提高了管理效率,还增强了数据安全性和移动办公的便捷性。 以下是六款值得推荐的移动终端管控软件: 1. 安企神 特点:作为行业领头羊,…

框架漏洞大全【万字总结】

文章目录 常见语言开发框架:Thinkphp远程代码执行5.0.23 rce介绍影响版本复现 CNVD-2018-24942介绍影响版本复现 任意文件包含包含日志-3.2x介绍影响版本复现 包含语言(QVD-2022-46174)介绍影响版本复现 sql注入漏洞(5.0.x)介绍影响版本复现 …

(26)微信检查联系人和清粉(针对删除和拉黑)-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙 出品 | CSDN(ID:lichao19897314) Q Q | 978124155 往期知识回顾 (1)开启探索微信自动化之路-微信UI自动化(.NetC#) (2)初始化微信窗体UI自动化实例-微信UI自动化(.NetC#) (3)采用热键终止微信采集任务-微信UI自动…

UI自动化测试:遍历页面元素并获取文本的实践分享!

遍历读取元素的文本 在写UI自动化过程中还会遇到需要遍历读取元素的情况。下面分享以「稿定设计」网站为例,想要通过UI自动化读取素材内容的操作菜单列表,如下图: 代码片段和解释 # 获取菜单列表元素的文本信息,例如&#xff1a…

算法基础及例题

1、双指针 维护区间信息、子序列匹配、利用序列有序性、单项链表找环双指针 - OI Wiki (oi-wiki.org) 盛最多水的容器https://leetcode.cn/problems/container-with-most-water/ public class Solution {public int maxArea(int[] height) {int l 0, r height.length - 1;int…

泡泡玛特2024半年报发布:首度划分四大品类 手办收入占比首次低于60%

8月20日,泡泡玛特发布2024上半年业绩报告。报告显示,2024年上半年泡泡玛特国际集团实现营收45.6亿元(人民币,下同),同比增长62.0%,经调整后净利10.2亿元,同比增长90.1%。 上半年泡泡…

MacOS升级ruby版本

​ ​ 您好,我是程序员小羊! 前言 升级Ruby版本在MacOS上相对简单,但需要一些基础的命令行知识。本文将详细介绍如何在MacOS上升级Ruby版本,包括使用常见的版本管理工具、解决可能遇到的问题、以及确保你的环境配置不会受到影响。…

第二百零九节 Java格式 - Java数字格式类

Java格式 - Java数字格式类 以下两个类可用于格式化和解析数字: java.text.NumberFormatjava.text.DecimalFormat NumberFormat 类可以格式化一个数字特定地区的预定义格式。 DecimalFormat 类可以格式化数字以特定区域设置的自定义格式。 NumberFormat类的 getXXXInstance…

宠物空气净化器怎么选?新手必看猫用除毛空气净化器热门品牌推荐

作为资深铲屎官来说,一到换毛季节,家里的猪咪经常会出现掉毛的情况,而且如果不勤打扫的话,粑粑的臭味也挺重的。如果长期不清理家里的浮毛,很容易就会得鼻炎。 看了身边好几个铲屎官都在用宠物空气净化器,…

什么牌子的开放式耳机性价比高?五款高口碑精品推荐!

由于传统入耳式耳机可能对耳道健康造成长期影响,许多人开始偏好选择开放式耳机的非侵入式设计。这种耳机有助于减少耳内湿润、细菌增长,以及耳道闷热的不适感。为了帮助大家在众多产品中挑选合适的开放式耳机,我将列举一些市场反馈良好的款式…

Android10.0 人脸解锁流程分析

人脸解锁概述 人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的支持,也为安全合规地启用集成交易的应用(网上银行或其他服务&am…

TikTok本土店海外仓发货总超时?EasyBoss ERP支持提前申请面单助力解决

近期有部分通过海外仓自发货的TikTok本土卖家表示:通过ERP推送订单至海外仓却无法立即出库,导致超出平台规定发货时间被平台处罚。 而出现这样的原因在于:通过ERP处理的TikTok订单,在使用认证的海外仓发货时,订单会先…

【C++ Primer Plus习题】2.2

问题: 解答: #include <iostream> using namespace std;#define LONG_TO_MA 220int main() {double distance 0;cout << "请输入距离(单位为long):";while (true){cin >> distance;if (cin.fail()){cout << "输入有误!请输入数字:&qu…

Redis 集群三主三从配置

1&#xff1a;安装 Redis安装Linux ubuntu_ubuntu离线安装redis7.2.5-CSDN博客 2&#xff1a;主从复制配置 参考 Redis主从同步配置-CSDN博客 3&#xff1a;哨兵配置 参考 Redis 哨兵模式配置-CSDN博客 4&#xff1a;集群配置 Redis 集群三主三从配置-CSDN博客 5&…

OpenCV与AI深度学习 | 使用OpenCV图像修复技术去除眩光

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;使用OpenCV图像修复技术去除眩光 眩光是一种因过度和不受控制的亮度而引起的视觉感觉。眩光可能会使人丧失能力或只是让人感到不舒服。眩光是一…

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)

文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布&#xff0c;2.0版本迎来第一个稳定版本&#xff0c;同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架&#xff0c;可以让你使用前端技术来构建桌面…

Redis7基础篇(九)

springboot集成redis 目录 springboot集成redis 总体概述 java连接redis常见问题 集成jedis 集成lettuce 集成redistemplate 连接单机 ​编辑​编辑​编辑redis集群 总体概述 java要想连接mysql的话需要jdbc java想要连接redis也需要中间件 jedis是第一代 lettuce第…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第三篇:登录功能优化

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…