linux 性能优化-内存优化

news2024/11/24 12:12:32

CPU 管理一样,内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应 用程序的指令、数据、缓存等。

1.内存原理

1.1.内存映射

1.1.1.日常生活常说的内存是什么?

  • 我的笔记本电脑内存就是 8GB 的
  • 这个内存其实是物理内存
  • 物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)

1.1.2.虚拟地址空间

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。 这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。

虚拟地址空间内部

  • 虚拟地址空间的内部又被分为内核空间和用户空间两部分
  • 不同字长(单个 CPU 指令可以处理数据的最大长度)的处理器,地址空间的范围也不同

比如最常见的 32 位和 64 位,如下所示:

  • 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间
  • 而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的

1.1.3.进程的用户态和内核态

进程在用户态时,只能访问用户空间内存;只有进入内核态后,才可以访问内核空间内存。虽然每个进程地址空间都包含了内核空间,但这些内核空间,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存

1.1.4.内存映射

既然每个进程都有一个这么大的地址空间,那么所有进程的虚拟内存加起来,自然要比实际的物理内存大得多。

所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的。

内存映射,其实就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每个进程都维护了一张页

表,记录虚拟地址物理地址的映射关系,如下图所示:

  • 页表实际上存储在 CPU 的内存管理单元 MMU 中
  • 正常情况下,处理器就可以直接通过硬件,找出要访问的内存
  • 在页表的映射下,进程就可以通过虚拟地址来访问物理内存

1.2.虚拟内存空间分布

以 32 位系统为例,如下图所示:

通过这张图你可以看到,用户空间内存,从低到高分别是五种不同的内存段。

  • 只读段,包括代码和常量等;
  • 数据段,包括全局变量等;
  • 堆,包括动态分配的内存,从低地址开始向上增长;
  • 文件映射段,包括动态库、共享内存等,从高地址开始向下增长;
  • 栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8MB

在这五个内存段中,堆和文件映射段的内存是动态分配的。

1.3 SWAP运行原理

Swap 是把一块磁盘空间或者一个本地文件,当成内存来使用。它包括换出换入两个过程。

  • 换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
  • 换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来。

一个很典型的场景就是,即使内存不足时,有些应用程序也并不想被 OOM 杀死,而是希望能缓一段时间,等待人工介入,或者等系统自动释放其他进程的内存,再分配给它。除此之外,我们常见的笔记本电脑的休眠和快速开机的功能,也基于 Swap 。休眠时,把系统的内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就可以这样就省去了很多应用程序的初始化过程,加快了开机速度。话说回来,既然 Swap 是为了回收内存,那么** Linux**到底在什么时候需要回收内存呢?前面一直在说内存资源紧张,又该怎么来衡量内存是不是紧张呢?

一个最容易想到的场景就是,有新的大块内存分配请求,但是剩余内存不足。这个时候系统就需要回收一部分内

存,进而尽可能地满足新内存请求。这个过程通常被称为 直接内存回收 。

除了直接内存回收,还有一个专门的内核线程用来 定期回收内存 ,也就是 kswapd0。为了衡量内存的使用情况,

kswapd0 定义了三个内存阈值(watermark,也称为水位),分别是页最小阈值(pages_min)、页低阈值

(pages_low)和页高阈值(pages_high)。剩余内存,则使用 pages_free 表示

kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作。

  • 剩余内存小于页最小阈值,说明进程可用内存都耗尽了,只有内核才可以分配内存
  • 剩余内存落在页最小阈值页低阈值中间,说明内存压力比较大,剩余内存不多了。这时 kswapd0 会执行内

存回收,直到剩余内存大于高阈值为止

  • 剩余内存落在页低阈值和页高阈值中间,说明内存有一定压力,但还可以满足新内存请求。
  • 剩余内存大于页高阈值,说明剩余内存比较多,没有内存压力。

/proc/sys/vm/min_free_kbytes 来间接设置。min_free_kbytes 设置了页最小阈值,而其他两个阈值,都是根据页最

小阈值计算生成的,计算方法如下 :

pages_low = pages_min*5/4
pages_high = pages_min*3/2

2.内存性能统计信息

2.1.系统内存使用量

2.2.1内存的使用情况

显示系统内存情况

[root@centos7-2 ~]# free
total used free shared buff/cache available
Mem: 999720 550508 283544 6844 165668 279124
Swap: 2097148 0 2097148

所有数值默认都是以字节(kb)为单位

  • 第一行 Mem:物理内存
  • 第二行 Swap:交换分区

你可以看到,free 输出的是一个表格,其中的数值都默认以字节为单位。表格总共有两行 六列,这两行分别是物理

内存 Mem 和交换分区 Swap 的使用情况,而六列中,每列数据 的含义分别为:

  • 第一列,total 是总内存大小;
  • 第二列,used 是已使用内存的大小,包含了共享内存;
  • 第三列,free 是未使用内存的大小;
  • 第四列,shared 是共享内存的大小;
  • 第五列,buw /cache 是缓存和缓冲区的大小;
  • 最后一列,available 是新进程可用内存的大小。

2.2.free命令参数

简写完成写法作用
-b–bytes所有数值单位是bytes
-k–kibi所有数值单位是kb
-m–mebi所有数值单位是mb
-g–gibi所有数值单位是gb
-h–human人性化输出
-W–wide将buff和cache拆分为单独的两个列显示
-C–count统计次数,默认是1次
-l–lohi显示详细的低内存和高内存统计信息
-S–seconds每次统计数据间隔时间
-t–total添加一行显示数据总和
–help
帮助文档
-V–version版本号

举例:

每隔 2s 输出一次统计信息,总共输出 2 次,并且人性化输出所有数值

[root@centos7-2 ~]# free -h -c 2 -s 2
total used free shared buff/cache available
Mem: 976M 537M 276M 6.7M 161M 272M
Swap: 2.0G 0B 2.0G
total used free shared buff/cache available
Mem: 976M 537M 276M 6.7M 161M 272M
Swap: 2.0G 0B 2.0G
[root@centos7-2 ~]#

2.3.top指令

[root@centos7-2 ~]# top
top - 11:49:39 up 50 min, 1 user, load average: 0.12, 0.08, 0.06
Tasks: 104 total, 2 running, 102 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 999720 total, 283960 free, 549672 used, 166088 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 279848 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1554 root 20 0 157836 2180 1540 R 0.3 0.2 0:00.05 top
1 root 20 0 125248 3716 2508 S 0.0 0.4 0:02.84 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 R 0.0 0.0 0:00.97 rcu_sched
10 root rt 0 0 0 0 S 0.0 0.0 0:00.07 watchdog/0
11 root rt 0 0 0 0 S 0.0 0.0 0:00.02 watchdog/1
12 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/1
13 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/1
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md

image.png
第一行:输出系统任务队列信息
image.png

  • 11:49:39:系统当前时间
  • up 50 min:系统开机后到现在的总运行时间
  • 1 user:当前登录用户数
  • load average: 0.12, 0.08, 0.06:系统负载,系统运行队列的平均利用率,可认为是可运行进程的平均数;三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值

第二行:任务进程信息
image.png

  • total:系统全部进程的数量
  • running:运行状态的进程数量
  • sleeping:睡眠状态的进程数量
  • stoped:停止状态的进程数量
  • zombie:僵尸进程数量

第三行:CPU信息
image.png

  • us:用户空间占用CPU百分比
  • sy:内核空间占用CPU百分比
  • ni:已调整优先级的用户进程的CPU百分比
  • id:空闲CPU百分比,越低说明CPU使用率越高
  • wa:等待IO完成的CPU百分比
  • hi:处理硬件中断的占用CPU百分比
  • si:处理软中断占用CPU百分比
  • st:虚拟机占用CPU百分比

第四行:物理内存信息
image.png
以下内存单位均为**MB **

  • total:物理内存总量
  • free:空闲内存总量
  • used:使用中内存总量
  • buw /cache:用于内核缓存的内存量

第五行:交换区内存信息
image.png

  • total:交换区总量
  • free:空闲交换区总量
  • used:使用的交换区总量
  • avail Mem:可用交换区总量

**注:**如果used不断在变化, 说明内核在不断进行内存和swap的数据交换,说明内存真的不够用了

进行信息区
image.png

  • PID:进程号
  • USER:运行进程的用户
  • PR:优先级
  • NI:nice值。负值表示高优先级,正值表示低优先级
  • **VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。 **
  • **RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享 内存。 **
  • **SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及 程序的代码段等。 **
  • S:进程状态 (R运行状态 S睡眠状态 D不可中断状态 T跟踪/停止 Z僵尸进程)
  • %CPU:CPU 使用率
  • **%MEM:进程使用武力内存占系统总内存的百分比 **
  • TIME+:上次启动后至今的总运行时间
  • COMMAND:命令名or命令行

在查看 top 输出时,你还要注意两点。
第一,虚拟内存通常并不会全部分配物理内存。从上面的输出,你可以发现每个进程的虚 拟内存都比常驻内存大得多

第二,共享内存SHR并不一定是共享的,比方说,程序的代码段、非共享的动态链接库,也都算在 SHR里。当然SHR也包括了进程间真正共享的内存。所以在计算多个进程的内存使用时,不要把所有进程的 SHR 直接相加得出结果。

2.4.缓存与缓冲区命中率

缓存是BufferCache两部分的总和BufferCache 的设计目的,是为了提升系统的 I/O 性能。它们利用内存充当起慢速磁盘与快速 CPU 之间的桥梁,可以加速 I/O 的访问速度。BufferCache 分别缓存的是对磁盘和文件系统的读写数据。

[root@centos7-2 ~]# free
			total used 	free 	 shared buff/cache available
Mem: 999720 542500 291348  6876  165872      290028
Swap: 2097148 0    2097148

字面意思,Buffer是缓存区,Cache 是缓存,两者都是数据在内存中的临时存储

2.4.1.Buffer 和 Cache 的区别

Buffer:内核缓冲区用到的内存,对应的是 /proc/meminfo 中的Buffer值;
Cache: 内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 **Cached **与 Slab之和;
Buffer

  • 对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB左右)
  • 内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等

Cached

  • 从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据
  • 下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。

2.4.2.proc 文件系统

  • /proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口。比方说,用户可以从 /proc中查询内核的运行状态和配置选项,查询进程的运行状态、统计数据等,也可以通过/proc来修改内核的配置
  • proc 文件系统同时也是很多性能工具的最终数据来源

2.4.3.缓冲命中率

缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比。

命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。

下面是查看系统缓存命中情况的工具:

  • cachestat 提供了整个操作系统缓存的读写命中情况。
  • cachetop 提供了每个进程的缓存命中情况。
$ cachestat 1 3
TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
	2 		0 		2 		1 			17 					279
	2 		0 		2 		1 			17 					279
	2 		0 		2 		1 			17 					279
  • TOTAL:表示总的 I/O 次数;
  • MISSES:表示缓存未命中的次数;
  • HITS:表示缓存命中的次数;
  • DIRTIES:表示新增到缓存中的脏页数;
  • BUFFERS_MB:表示 Buffers 的大小,以 MB 为单位;
  • CACHED_MB:表示 Cache 的大小,以 MB 为单位。
$ cachetop
11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
13029 root python 1 0 0 100.0% 0.0%

它的输出跟 top 类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命中情况。具体到每一个指标,这里的 HITSMISSESDIRTIES ,跟 cachestat 里的含义一样,分别代表间隔时间内的缓存命中次数、未命中次数以及新增到缓存中的脏页数。

3.性能分析

首先,你最容易想到的是 系统内存使用情况 ,比如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等。

  • 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存;
  • 共享内存是通过tmpfs(内存的文件系统 )实现的所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实也是一种特殊的缓存;
  • 可用内存是新进程可以使用的最大内存,它包括剩余内存和可回收缓存;
  • 缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度。另一部分,则是 Slab 分配器中的可回收内存;
  • 缓冲区是对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据。这样内核就可以把分散的写集中起来,统一优化磁盘写入。

第二类很容易想到的,应该是 进程内存使用情况,比如进程的虚拟内存、常驻内存、共享内存以及Swap 内存等。

  • 虚拟内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等。这里要注意,已经申请的内存,即使还没有分配物理内存,也算作虚拟内存;
  • 常驻内存是进程实际使用的物理内存,不过,它不包括 Swap 和共享内存;
  • 共享内存,既包括与其他进程共同使用的真实的共享内存,还包括了加载的动态链接库以及程序的代码段等;
  • Swap 内存,是指通过 Swap 换出到磁盘的内存。

第三类 缺页异常 ,系统调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分配。缺页异常又分为下面两种场景。

  • 可以直接从物理内存中分配时,被称为次缺页异常。
  • 需要磁盘I/O介入(比如 Swap)时,被称为主缺页异常。

第四类重要指标就是** Swap的使用情况** ,比如 Swap 的已用空间、剩余空间、换入速度和换出速度等。

  • 已用空间和剩余空间很好理解,就是字面上的意思,已经使用和没有使用的内存空间。
  • 换入和换出速度,则表示每秒钟换入和换出内存的大小。

4.调优工具

4.1.根据内存指标

在这里插入图片描述

4.2.性能工具

在这里插入图片描述

5.内存调优策略

常见的优化思路有这么几种。

  1. 最好禁止 Swap。如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。
  2. 减少内存的动态分配。比如可以使用内存池、**大页(HugePage)**等。
  3. 尽量使用缓存和缓冲区来访问数据。比如可以使用堆栈明确声明内存空间,来存储需要缓存的数据;或者用Redis 这类的外部缓存组件,优化数据的访问。
  4. 使用 cgroups 等方式限制进程的内存使用情况。这样可以确保系统内存不会被异常进程耗尽。
  5. 通过 /proc/pid/oom_adj ,调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不会被 OOM杀死。

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

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

相关文章

Java最全面试题专题---5、Spring面试题(1)

Spring概述(10) 什么是spring? Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式&#xff…

联合体(C语言)

小伙伴们又来学习知识啦~,今天我要给大家介绍一下联合体的使用,话不多说,我们开始今天的正题吧! 联合体的介绍 C语言的联合体(union)是一种特殊的数据类型,它可以在同一内存空间中存储不同的数…

龙迅LT86102UXE HDMI一分二HDMI,支持音频剥离,支持4K60HZ

描述: 龙迅 LT86102UXE HDMI2.0 分路器具有符合 HDMI2.0/1.4 规范的 1:2 分路器、最大 6Gbps 高速数据速率、自适应均衡 RX 输入和预加重 TX 输出(用于支持长电缆应用)、内部 TX 通道交换以实现灵活的 PCB 布线。 LT86102UXE HDM…

机器学习之线性回归(Linear Regression)附代码

概念 线性回归(Linear Regression)是机器学习中的一种基本的监督学习算法,用于建立输入变量(特征)与输出变量(目标)之间的线性关系。它假设输入变量与输出变量之间存在线性关系,并试图找到最佳拟合线来描述这种关系。 在简单线性回归中,只涉及两个变量:一个是自变量…

Ubuntu 常用命令之 passwd 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 在Ubuntu系统中,passwd命令用于更改用户的密码。系统管理员可以使用此命令更改任何用户的密码,而普通用户只能更改自己的密码。 passwd命令的参数如下 -l, --lock:锁定密码,使账户…

Apache+PHP环境配置 手动配置

准备工作,在G盘新建一个WAMP目录 1.获取Apache 打开下载地址Apache VS17 binaries and modules download,下载 httpd-2.4.58-win64-VS17.zip 将下载好的httpd-2.4.58-win64-VS17.zip拷贝到G:\WAMP目录下并解压到当前目录,得到Apache24目录 …

石墨匣钵,预计到2025年将达到3.973亿美元

石墨匣钵是陶瓷和耐火材料工业用于烧制和烧结各种材料的高温容器。在陶瓷产品需求增加和耐火材料行业增长的推动下,全球石墨匣钵市场在过去几年出现了显着增长。2020 年全球石墨匣钵市场价值为 3.039 亿美元,预计到 2025 年将达到 3.973 亿美元&#xff…

找不到x3daudio1_7.dll文件的解决方法分享

今天我想和大家分享的是关于“找不到X3DAudio1_7.dll无法继续执行代码问题”的解决方法,以及X3DAudio1_7.dll丢失是什么意思,它的作用是什么,以及丢失对计算机有什么影响。 首先,我们来解释一下X3DAudio1_7.dll是什么。X3DAudio1…

Python Hook钩子函数详解

更多资料获取 📚 个人网站:ipengtao.com 在Python编程中,Hook钩子函数是一种重要的编程机制,允许程序在运行时的特定点执行自定义代码,以修改或扩展程序的行为。本文将深入介绍Python中Hook钩子函数的基本概念、使用场…

Axure RP 8 for Mac/win中文版:打造完美交互式原型设计体验

Axure RP 8,一款引领潮流的交互式原型设计工具,为设计师提供了无限的可能性,让他们能够创造出逼真的原型,从而更好地展示和测试他们的设计。 Axure RP 8拥有丰富的功能和工具,让设计师可以轻松地创建出复杂的交互式原…

程序员的50大JVM面试问题及答案

文章目录 1.JDK、JRE、JVM关系?2.启动程序如何查看加载了哪些类,以及加载顺序?3. class字节码文件10个主要组成部分?4.画一下jvm内存结构图?5.程序计数器6.Java虚拟机栈7.本地方法栈8.Java堆9.方法区10.运行时常量池?…

DDPM推导笔记

各位佬看文章之前,可以先去看看这个视频,并给这位up主点赞投币,这位佬讲解的太好了:大白话AI 1.前置知识的学习 1.1 正态分布特性 ​ (1)正态分布的概率密度函数 f ( x ) 1 2 π σ e − ( x − μ ) …

day38 1220

作业1&#xff1a;select客户端 1 #include <myhead.h>2 #define SERPORT 88883 #define SERIP "192.168.125.159"4 5 #define CLIPORT 66666 #define CLIIP "192.168.125.159"7 8 int main(int argc, const char *argv[])9 {10 int ret -1;11 …

uni-app的初使用(附源码学习)

uni-app代码编写&#xff0c;基本语言包括js、vue、css。以及ts、scss等css预编译器。 新建项目等基础指路&#xff1a; 关于uni-app的下载及使用-CSDN博客 1.vue文件 由三个一级节点组成&#xff0c;分别是template、script、style <template> </template><…

机器学习 | 密度聚类和层次聚类

密度聚类和层次聚类 密度聚类 背景知识 如果 S 中任两点的连线内的点都在集合 S 内&#xff0c;那么集合 S称为凸集。反之&#xff0c;为非凸集。 DBSCAN 算法介绍 与划分和层次聚类方法不同&#xff0c;DBSCAN(Density-Based Spatial Clustering of Applications with Noi…

Jmeter插件技术:性能测试中服务端资源监控

过程中我们需要不断的监测服务端资源的使用情况&#xff0c;例如CPU、内存、I/O等。 Jmeter的插件技术可以很好的实时监控到服务器资源的运行情况&#xff0c;并以图形化的方式展示出来&#xff0c;非常方便我们性能测试分析。 操作步骤&#xff1a; 1、安装插件管理器 插件…

用最通俗的语言讲解 TCP “三次握手,四次挥手”

目录 一. 前言 二. TCP 报文的头部结构 三. 三次握手 3.1. 三次握手过程 3.2. 为什么要三次握手 四. 四次挥手 4.1. 四次挥手过程 4.2. 为什么要四次挥手 五. 大白话说 5.1. 大白话说三次握手 5.2. 大白话说四次挥手 六. 总结 一. 前言 TCP 是一种面向连接的、可靠…

Ebullient开发文档之OTA升级(从TF中升级简洁明了)

一. 简介 这一篇将给大家介绍如何进行OTA升级(esp32s3), 为了简单方便&#xff0c;可操作性强&#xff0c;这次是从TF中读取固件来进行跟新&#xff0c;本来想看看网上有没有参考的&#xff0c;有是有&#xff0c;但绝大多数都是基于官方的例程&#xff0c;甚至贴出来的源码和…

Spring MVC框架支持RESTful,设计URL时可以使用{自定义名称}的占位符@Get(“/{id:[0-9]+}/delete“)

背景&#xff1a;在开发实践中&#xff0c;如果没有明确的规定URL&#xff0c;可以参考&#xff1a; 传统接口 获取数据列表,固定接口路径&#xff1a;/数据类型的复数 例如&#xff1a;/albums/select RESTful接口 - 根据ID获取某条数据&#xff1a;/数据类型的复数/{id} - 例…

mysql,mysqld,数据库的概念理解,为什么要有数据库,主流数据库,mysql架构介绍,存储引擎介绍,sql语句的分类,查看存储引擎(\G)

目录 概念理解 mysql 狭义 广义 CS模式 mysqld 守护进程 (daemon) 数据库服务 数据库 一般 广义上 数据库 为什么要有数据库 主流数据库​​​​​​​ mysql架构 第一层 -- 链接池 第二层 -- 翻译 第三层 -- 存储引擎​​​​​​​ 存储引擎介绍 总结 …