各种存储性能瓶颈如何分析与优化?
【摘要】本文结合实践剖析存储系统的架构及运行原理,深入分析各种存储性能瓶颈场景,并提出相应的性能优化手段,希望对同行有一定的借鉴和参考价值。
【作者】陈萍春,现就职于保险行业,拥有多年的系统、存储以及数据备份等运维工作经验。
前言
可靠性、安全性和性能是 IT 系统最重要的三个评价维度。对于 IT 系统来说,可靠性和安全性是基础,系统故障或数据泄露等造成的破坏性是显而易见的;而性能则是核心能力,代表着 IT 系统的服务水平,性能瓶颈会制约企业业务的发展,严重影响用户体验。
存储系统是企业 IT 基础架构重要的组成部分,为企业内部众多的 IT 系统提供数据存储服务。随着数字化转型的深入,企业的 IT 系统建设也进一步加快,这一方面带来了数据量的急剧增长,另一方面也提高了数据的访问频率,存储的性能瓶颈的影响也会被进一步放大。本文将结合个人运维实践,剖析存储系统的架构及运行原理,深入分析各种存储性能瓶颈场景,并提出相应的性能优化手段,希望对同行有一定的借鉴和参考价值。
1. 存储系统概述
了解存储系统的架构及其运行原理是性能分析与优化的入门课,才能去全局分析解决存储性能问题。经过多年的技术演进和架构变化,存储系统可大致分为 SAN 存储、 NAS 存储以及分布式存储这三类,它们有类似之处,又各有特点。下文将分别详细剖析这三类存储架构及其运行原理。
1.1 SAN 存储
SAN ( Storage Area Network )本身是一个承担数据存储任务的存储网络,与业务 LAN 网相互隔离。SAN 存储则是一种基于存储块的存储系统,一般使用 FC 、 ISCSI 、 NVMe 等通信协议。
架构层面看, SAN 存储一般是存储控制器后端挂载磁盘阵列,数据最终储存在磁盘阵列,而磁盘阵列则包括了多个 RAID 组。N 个磁盘组成一个 RAID 组,在 RAID 组之上又会被划分出逻辑存储单元 LUN ,也就是共享存储池的逻辑磁盘,这些 LUN 会通过 SAN 网络与服务器的 HBA 卡相连,从而会被服务器的操作系统识别为磁盘,并被分区和格式化后使用,其架构如图 1 所示。
图 1.SAN 存储架构图
从存储的数据 IO 流角度来看,以常用的 FC-SAN 存储为例,服务器操作系统一般会使用文件系统管理文件,文件系统是建立在存储 LUN 之上,文件的读写会对应着存储的 IO 操作;文件会被分为多个 Block , Block 大小固定,一般是 4KB-16KB ;数据 Block 块会被发送到服务器的 HBA 卡, HBA 卡再将其转换为 FC 协议的数据帧( Data frame ),并通过 SAN 网络传输到存储系统的前端口;存储的前端口继续将这些数据帧重新封装成数据 Block , Block 大小一般为 4KB ,并将这些数据 Block 块传输到存储控制器中;存储控制器中会有存储缓存( Cache ),分为读缓存与写缓存,根据缓存的算法规则,部分缓存命中的 IO 数据流会立刻返回 IO 确认,缓存未命中的 IO 数据流则会需要继续访问磁盘阵列;由于多个磁盘组成了 RAID 组,一个数据 IO 流实际上对应着多个磁盘的并发读写。整个过程如图 2 所示:
图 2.FC-SAN 存储的数据 IO 流图
1.2 NAS 存储
NAS ( Network Attached Storage )存储一般也可认为是网络文件存储,用户数据大多数以文件形式存在,通过以太网访问模式走 NFS/CIFS 协议,提供了广泛兼容性易用性的共享能力。相比于 SAN 存储, NAS 存储不以磁盘形式提供存储服务,不需要分区和格式化,可以直接提供可以直接挂载的网络文件系统。
架构层面看, NAS 存储一般也是基于磁盘阵列(也有基于集群文件系统或分布式存储的实现方式)实现的,在磁盘阵列之上会有 NAS 机头来创建和管理文件系统;NAS 机头是 NAS 存储的核心逻辑部件,是典型的 C/S 架构风格,是对外提供网络文件服务的 Server 端;其他 client 端在获得授权后,可通过挂载文件系统、映射网络磁盘或 HTTP 、 FTP 等方式就可以共享访问 NAS 文件系统上的文件,其架构如图 3 所示:
图 3.NAS 存储架构图
从存储的数据 IO 流角度来看,以 NFS 为例, NAS 存储是有着明显异于 SAN 存储的特点,比如客户端缓存、 Server 的无状态性等。首先客户端并不是直接访问 NAS 文件系统,而是客户端缓存,是服务端的文件系统目录树映射到了客户端,实际在文件读写时,需要循环读写固定大小的页面,比如 64KB ;而 Server 端的无状态性体现在不需要维护客户端的协议状态信息,客户端通过 RPC 调用操作 Server 端的文件系统数据,但也不能获取 Server 端的状态,当连接中断时,可以不停地连接重试。如图 4 所示,基于 TCP 的应用层协议的 NAS 存储数据 IO 流会更加灵活,适配性较强,但数据 IO 路径更长,数据一致性较差,还会存在数据泄露等安全问题,数据传输效率也不高。
图 4.nfs 协议下的 NAS 存储数据 IO 流图
1.3 分布式存储
分布式存储系统是采用可扩展的集群架构,通过数据副本算法将数据分散存储在多台独立的设备上,分布式集群之间一般通过通用 TCP/IP 网络连接。相比于其传统的集中式存储阵列,分布式存储系统可以通过多台存储服务器来分担存储负荷,可以满足大规模存储应用的需要。常见的分布式存储系统的形式包括分布式文件系统(如 HDFS )和对象存储(如 Ceph )。
从架构层面来看,与集中式存储系统相比,分布式存储系统的部署架构相对简单,一般是通用服务器网络互联的方式,但其逻辑架构更加复杂。分布式存储系统的核心设计思想是去中心化, 去中心化的难点主要在于是主控节点的去中心化,有主控节点的架构比如 HDFS 的架构设计思路是 map-reduce ,化大为小,分而治之,再合并处理,其架构中需要主控节点来协调,只是主控节点的负载都分发到了数据节点,数据节点上则存放着数据副本,每个数据副本又都分布在三个不同的数据节点上,如图 5 所示;而无中心化的最大优点是解决了主节点本身的瓶颈,其架构设计思路则是均衡设计,这种架构只有数据节点,但是需要抽象出更多的逻辑功能组件,并均衡分布在不同节点上。以 Ceph 块存储的使用方式为例,除了 Mon 等集群管理监控组件之外, Ceph 中 OSD 组件用于管理物理磁盘,基于 OSD 去构建 PG ,而 PG 上存放着数据对象,数据对象则对应着 Ceph 块设备, Ceph 块设备可被格式化分区,从而被应用使用,其架构图如图 6 所示。
图 5. 有主控节点的分布式存储架构
图 6. 无主控节点的 Ceph 存储架构
从存储的 IO 数据流来看,不同于集中式存储较少的数据通道,分布式存储的数据入口可以更多更宽,但集群内部的数据流也更多。还是以 Ceph 的块存储为例,客户端应用访问的文件系统对应的是 Ceph 块设备, Block 数据通过网络访问 Ceph 集群 RBD 服务,最终对应于三副本 OSD 的磁盘读写,流程如图 7 所示。对于三副本的分布式存储系统,为保障数据的强一致性,一个写 IO ,一般需要主副本和另外两个从副本都写完后,才能最终确认写完成。
图 7.Ceph 存储 IO 数据流图
2. 存储性能分析
存储性能分析是性能优化的基础,虽然存在多种类型多种设计方案的存储系统,但性能分析方法却具有一定的通用性。存储性能分析方法可分为定性与定量两种方式,通常在接触了解、技术选型的初期可能并不具备定量分析的条件,则主要采用定性分析方法来评估存储系统的性能;而一旦进入 POC 测试、系统运维等阶段,则应以定量分析为主,通过实际的性能指标数据来判断存储性能瓶颈。
2.1 定性分析
定性分析是结合个人的运维经验,来分析存储系统的性能是否能满足应用系统的需求,来分析存储系统是否存在性能瓶颈,而这些都取决于对应用数据类型和存储系统的熟悉程度。
2.1.1 应用数据 IO 分析
了解应用数据 IO 的类型,是存储性能分析的基础。不同应用数据 IO 访问存在着差异,主要体现在 IO 大小、顺序或随机读写、读写比例等方面,如表 1 所示。
应用类型 | IO大小 | 读写比例 | 随机或顺序读写 |
一般文件 | 小 | 大比例读 | 主要随机读写 |
日志文件 | 小 | 大比例写 | 顺序读写 |
视频流 | 大 | 大比例读 | 主要顺序读写 |
操作系统 | 小 | 大比例读 | 多数是顺序读写 |
数据备份 | 大 | 大比例写 | 顺序读写 |
OLTP数据库 | 小 | 约70%读/30%写 | 主要随机读写 |
OLAP数据库 | 大 | 大比例读 | 主要顺序读写 |
表 1. 应用程序的数据 IO 类型
IO 大小
应用数据类型的差异会带来不同大小的数据文件,也对应着不同的数据 IO 大小。假设存储系统 IO 处理能力是固定的,显然单位时间内大 IO 处理的数据更多,那么合并小 IO 会更有效率;而假设存储系统每次处理数据 IO 大小有上限,那么每次处理大 IO 前都需要拆分,显然 IO 处理效率会下降。比如 SAN 存储具有很高的 IO 处理能力,但单次处理的 IO 偏小,那么更适宜性能要求高的、小 IO 应用系统,而处理大 IO 应用数据时,效率反而会下降。
读写比例
读写比例是应用数据的重要特征之一, IO 读和写操作存在着较大的差异。一般来说写操作对于存储性能的消耗更大,写 IO 处理能力、延时都较高,对缓存的需求差异也较大。对于分布式存储来说,多副本机制可以优化读操作,但却不利于写操作,写确认路径较长,需要优化数据传输路径、配置更多的写缓存,更适宜于读比例较高的应用系统。
顺序或随机读写
顺序或随机读写的差异主要表现在磁盘介质特性、预读取机制、缓存命中率等方面。对于机械硬盘来说,顺序读写的 IO 可以减少磁盘寻道时间,随机读写的 IO 则响应时间变长,可以通过提高缓存命中率的方式,将缓存中的数据转化为顺序读写到磁盘;而 SSD 硬盘则不存在机械寻道,随机读写能力会大大优于机械硬盘。
2.1.2 性能瓶颈分析
存储性能分析的关键是对性能瓶颈进行分析,包括两方面的内容:一是触发性能瓶颈的因素;二是性能瓶颈的定位,找出存储 IO 拥塞的位置。
1)触发性能瓶颈的因素
存储热点:存储热点是规划设计中的缺陷,典型场景包括数据 IO 负载过于集中在某个存储节点、端口、磁盘等,存储资源争用、锁竞争,软硬件参数的限制等。
性能尖峰:常见于数据 IO 高并发、性能需求短时间集中释放的场景,性能尖峰更会充分暴露出存在的热点问题,从而触发存储性能瓶颈,典型场景包括虚拟桌面启动风暴、秒杀类业务等。
服务能力下降:常见于故障场景,存储服务能力下降叠加数据 IO 繁忙阶段,会导致触发存储性能瓶颈。典型的故障场景包括 SAN 存储单存储控制器故障、磁盘 rebuild 等;分布式存储更容易出现性能抖动,主要也是由于某个节点或磁盘掉线或重建数据副本或某个数据副本响应变慢;客户端服务器的 CPU 、内存资源不足等。
2)性能瓶颈的定位
存储性能瓶颈的定位需要结合存储系统的架构来分析,按照存储系统的构成大致可分为以下几类性能瓶颈位置:
数据传输网络:存储外接和内接数据传输网络的带宽、端口速率、传输协议、传输路径的负载均衡度
存储控制器:控制器的 CPU 处理能力
缓存:主要分为客户端缓存和存储缓存,包括缓存大小、缓存命中率、读写缓存的分配比例
磁盘:主要分为机械硬盘、闪存盘等磁盘介质,包括磁盘转速、单盘读写的 IOPS 、磁盘容量大小、磁盘数量、磁盘冗余( RAID 、副本或纠删码)算法
客户端:体现在客户端的 CPU 、内存等资源的使用情况、其他应用对存储资源的占用等外部环境的影响
2.2 定量分析
定量分析是从数据指标角度来分析解决问题,既可以从存储侧来度量存储系统的服务能力,也可以从用户应用侧来衡量存储 IO 体验。一般来说,存储侧的定量分析排除了存储网络和客户端的影响,性能数据能说明存储系统本身是否存在性能瓶颈,可用于存储系统的性能监控;而用户应用侧的定量分析主要用于一些性能测试场景,通过基准测试工具,可以形成当前系统环境的性能基线。
2.2.1 三大性能指标
无论是存储侧还是用户应用侧的定量分析,都离不开三大存储性能数据指标:IOPS 、吞吐量( Throughput )、延时( Latency )。因此有必要弄清楚三个性能数据指标的含义及其关联关系。
IOPS :代表存储每秒所处理的 IO 操作数量。对于存储系统来说,我们在性能分析时,既需要关注整体的 IOPS ,有时也需要分析单个控制器、单个 LUN 或者单个磁盘的 IOPS ,甚至可能还需要区分读或者写的 IOPS 。
吞吐量( Throughput ):代表存储每秒所处理的 IO 数据量大小,也就是存储数据传输所占用的带宽,与 IOPS 类似,也可以细分读或者写,可以单独组件分析。
延时( Latency ):代表存储系统处理 IO 操作所需要的时间,通常情况下,是最重要的存储性能指标,与 IOPS 类似,也可以细分读或者写,可以单独组件分析。
三大性能指标分析中,对于 大 IO 的应用使用吞吐量来评测性能更加科学;而小 IO 的应用,比如数据库,则需要通过 IOPS 和延时的指标来评测性能,高 IOPS 和低延时同时满足的情况下,才能应对高并发且快速的数据库访问。
2.2.2 性能测试分析
存储性能测试可以更好地理解存储的性能指标,以某个存储性能测试为例,存储压测工具 vdbench (可针对裸盘与文件两种访问方式的压测),测试背景是存储上分配了 5 个 lun 给主机,主机对这五块裸盘做随机读写测试, 80% 读 20 写,逐渐调整 IO 的大小进行测试,三大性能数据指标如下表:
IO大小 | IOPS | 吞吐量(MB/s) | 延时(ms) |
4KB | 89288 | 348.78 | 0.411 |
16KB | 75209 | 1175.15 | 0.488 |
32KB | 59415 | 1856.72 | 0.617 |
64KB | 36612 | 2288.30 | 1.005 |
128KB | 20686 | 2585.82 | 1.833 |
表 2. 存储性能测试数据
该存储性能测试的结论如下:
1) 该存储的控制器 CPU 使用率峰值在 20%-45% ,说明该存储控制器还可以承受更高的 IO 负载,如图 8 所示。
图 8. 存储控制器 CPU 使用率
2) 该测试也未达到主机的系统性能瓶颈, CPU 使用了低于 20% ,这一点在存储性能分析中也很重要。
图 9. 主机系统的 CPU 使用率
3) 存储性能基线 :表 2 中的测试数据就是特定的主机使用该存储的 5 个 lun 在不同 IO 负载下的性能基线数据,在实际运行过程中,考虑到其他应用的 IO 、读写 IO 大小不均等因素,一般 IOPS 峰值在基线值的 50% 。
4) 吞吐量和 IOPS:吞吐量 =IOPS*IO 大小,相同的业务场景,一般 IO 大小不会有明显变化,那么极限测试下的吞吐量与 IOPS 会呈正比关系,但吞吐量受限于网络带宽, IOPS 又受限于存储 lun 的处理能力;
5) 延时和 IOPS:可以看出测试数据中延时和 IOPS 呈现出反比关系,即 IOPS 越低,延时反而越高,这是由于不同的 IO 大小的测试场景下,存储的负载压力不一样,即大 IO 的情况下,存储负载变大, IOPS 下降,延时加大。而存储系统正常运行状态下的 IOPS 和延时关系如图 10 所示,大多数情况下存储的负载压力变大, IOPS 增加,延时也开始变大,一旦 延时过高就会影响业务系统的性能。所以大多数情况下,延时是最重要的存储性能指标,一般性能要求较高的业务系统,存储的延时需要低于 5ms 。
图 10. 正常运行状态下的存储 IOPS 和延时
3. 存储性能优化
存储性能分析与优化是一项长期、复杂而重要的工作,需要明晰存储性能优化目标,做好详细性能分析,并制定阶段性的优化方案和验证方案,以确保存储性能优化工作的持续开展。
3.1 优化策略
存储性能优化工作具有一定的策略性,科学的优化策略才能指导制定更加合理的存储性能优化方案。
1) 通盘考虑:存储性能问题是一个全局性问题,需要通盘考虑 IO 路径上的性能瓶颈,分析性能优化方案中可能出现的连锁反应,以提高性能优化决策的正确性。
2) 优化的性价比:制定合理的性能优化目标,在多种性能优化方案的选择上,要综合考虑方案成本、实施复杂性、收益等。
3) 规划更重要:相比于存储性能优化带来的优化改造成本,提前做好合理的规划更为重要。比如兼顾业务性能需求的存储选型,系统上线前的存储性能测试的基线数据及性能容量管理,存储扩容要关注 性能容量指标(评估扩容后,存储的 IOPS/GB 是否有较大变化),以及存储性能负载的均衡分布等。
4) 完善性能监控:端到端的存储性能也是非常重要的,对整个数据 IO 路径进行监控,基于存储性能基线来分析实际运行中的性能数据,从而及时发现存储性能瓶颈,也能验证存储优化的成果。
3.2 优化方案
存储性能优化方案可以大致分为以下几类:
1) 硬件升级
单块机械硬盘的 IOPS 在 100 左右,延时在 5ms 以上,而单块 SSD 的 IOPS 在 1 万以上,延时小于 1ms ,传统机械硬盘替换为全闪存存储,性能可以得到极大的提升;NVMe 、 RDMA 等技术的应用,优化了底层通信框架,可以极大提高数据传输效率,降低存储延时;存储控制节点的横向或纵向扩展,可以有效增加存储负载能力;客户端的硬件升级,也能消除客户端的 CPU 、内存、网络等带来的性能瓶颈。
硬件升级是一种非常有效的存储性能优化手段,但是很多情况下需要比较高的硬件成本,投入产出比还需要仔细评估。
2) 上层应用优化
上层应用优化手段也比较丰富,主要目标是减少上层应用带给存储的 IO 负载,比如数据传输前启用重复数据删除或数据压缩;优化 IO 并发,将大量的小 IO 聚合成大 IO ;数据库的索引优化、 SQL 语句优化。
3) 调整性能负载
调整性能负载主要针对的存储性能热点问题,方案包括优化磁盘分布方式,调整磁盘负载;调整存储网络端口负载;调整存储控制器负载;新增存储,将部分负载调整到新的存储上。
4) 数据缓存优化
数据缓存是存储系统中非常重要的性能模块,一般缓存都采用内存或闪存等速度更快的存储介质,远远快于一般的磁盘。很多存储性能问题都因缓存而起,也经缓存优化而终结。数据缓存分为客户端本地缓存和存储缓存。比如客户端本地缓存对于一些分布式文件系统非常重要,增加缓存大小,可以有效提高缓存命中率;存储的缓存也极为重要,多层级的数据缓存技术可将热点数据存放在更快的存储介质上,降低存储延时。
相关文章:

各种存储性能瓶颈如何分析与优化?
【摘要】本文结合实践剖析存储系统的架构及运行原理,深入分析各种存储性能瓶颈场景,并提出相应的性能优化手段,希望对同行有一定的借鉴和参考价值。 【作者】陈萍春,现就职于保险行业,拥有多年的系统、存储以及数据备…...

Android StateFlow初探
Android StateFlow初探 前言: 最近在学习StateFlow,感觉很好用,也很神奇,于是记录了一下. 1.简介: StateFlow 是一个状态容器式可观察数据流,可以向其收集器发出当前状态更新和新状态更新。还可通过其 …...

Docker Compose初使用
简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是 工程(project),服务(service)以及容器(cont…...

测试与FastAPI应用数据之间的差异
【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 当使用两个不同的异步会话来测试FastAPI应用程序与数据库的连接时,可能会出现以下错误: 在测试中,在数据库中创建了一个对象&#x…...

WebStorm 2023年下载、安装教程、亲测有效
文章目录 简介安装步骤常用快捷键 简介 WebStorm 是JetBrains公司旗下一款JavaScript 开发工具。已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的…...

k8s储存卷
卷的类型 In-Tree存储卷插件 ◼ 临时存储卷 ◆emptyDir ◼ 节点本地存储卷 ◆hostPath, local ◼ 网络存储卷 ◆文件系统:NFS、GlusterFS、CephFS和Cinder ◆块设备:iSCSI、FC、RBD和vSphereVolume ◆存储平台:Quobyte、PortworxVolume、Sto…...

【解决Win】“ 无法打开某exe提示无法成功完成操作,因为文件包含病毒或潜在的垃圾软件“
在下载某个应用程序,打开时出现了“无法成功完成操作因为文件包含病毒或潜在垃圾”的提示,遇到这个情况怎么解决? 下面为大家分享故障原因及具体的处理方法。 故障原因 是由于杀毒 防护等原因引起的。 解决方案 打开Windows 安全中心 选择…...

SpringBoot调用ChatGPT-API实现智能对话
目录 一、说明 二、代码 2.1、对话测试 2.2、单次对话 2.3、连续对话 2.4、AI绘画 一、说明 我们在登录chatgpt官网进行对话是不收费的,但需要魔法。在调用官网的API时,在代码层面上使用,通过API KEY进行对话是收费的,不过刚…...

element-table出现错位解决方法
先看示例图,这个在开发中还是很常遇到的,在table切换不同数据时或者切换页面时,容易出现: 解决方法很简单,官方有提供方法: 我们可以在重新渲染数据后: this.$nextTick(() > {this.$refs.…...

DC电源模块具有不同的安装方式和安全规范
BOSHIDA DC电源模块具有不同的安装方式和安全规范 DC电源模块是将低压直流电转换为需要的输出电压的装置。它们广泛应用于各种领域和行业,如通信、医疗、工业、家用电器等。安装DC电源模块应严格按照相关的安全规范进行,以确保其正常运行和安全使用。 D…...

zabbix自定义监控、钉钉、邮箱报警
目录 一、实验准备 二、安装 三、添加监控对象 四、添加自定义监控项 五、监控mariadb 1、添加模版查看要求 2、安装mariadb、创建用户 3、创建用户文件 4、修改监控模版 5、在上述文件中配置路径 6、重启zabbix-agent验证 六、监控NGINX 1、安装NGINX,…...

短信、邮箱验证码本地可以,部署到服务器接口却不能使用
应对公司双验证要求,对本系统做邮箱、短信验证码登录,本地开发正常发送,到服务器上部署却使用失败,已全部解决,记录坑。 一、nginx拦截 先打开你的服务器 nginx.conf 看看有没有做接口拦截。(本地可能做Sp…...

Java web基础知识
Servlet Servlet是sun公司开发的动态web技术 sun在API中提供了一个接口叫做 Servlet ,一个简单的Servlet 程序只需要完成两个步骤 编写一个实现了Servlet接口的类 把这个Java部署到web服务器中 一般来说把实现了Servlet接口的java程序叫做,Servlet 初步…...

【Linux学习】01Linux初识与安装
Linux(B站黑马)学习笔记 01Linux初识与安装 文章目录 Linux(B站黑马)学习笔记前言01Linux初识与安装操作系统简述Linux初识虚拟机介绍安装VMware Workstation虚拟化软件VMware中安装CentOS7 Linux操作系统下载CentOS操作系统VMwa…...

android 将数据库中的 BLOB 对象动态加载为 XML,并设置到 Android Activity 的内容视图上
以下是一个示例代码,演示如何将数据库中的 BLOB 对象动态加载为 XML,并设置到 Android Activity 的内容视图上: ```java import android.app.Activity; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import and…...

Android12之强弱智能指针sp/wp循环引用死锁问题(一百六十六)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…...

springboot自定义Json序列化返回,实现自动转换字典值
自定义序列化 原理 当你使用Spring Boot的Spring Data或者Spring MVC等组件来处理JSON序列化时,Spring框架会在需要将Java对象转换为JSON字符串时调用JsonSerializer。这通常发生在控制器方法返回JSON响应时,或者在将对象保存到数据库等操作中。 // 注册…...

Lostash同步Mysql数据到ElasticSearch(二)logstash脚本配置和常见坑点
1. logstash脚本编写(采用单文件对应单表实例) 新建脚本文件夹 cd /usr/local/logstash mkdir sql & cd sql vim 表名称.conf #如: znyw_data_gkb_logstash.conf 建立文件夹,保存资源文件更新Id mkdir -p /data/logstash/data/last_r…...

兔兔答题企业版1.0.0版本全网发布,同时开源前端页面到unicloud插件市场
项目说明 兔兔答题是用户端基于uniapp开发支持多端适配,管理端端采用TypeScriptVue3.jselement-plus,后端采用THinkPHP6PHP8Golang开发的一款在线答题应用程序。 问题反馈 线上预览地址 相关问题可以通过下方的二维码,联系到我。了解更多 …...

76、SpringBoot 整合 MyBatis------使用 sqlSession 作为 Dao 组件(就是ssm那一套,在 xml 写sql)
就是 ssm 那套,在xml 上面写sql ★ 基于SqlSession来实现DAO组件的方式 - MyBatis提供的Starter会自动在Spring容器中配置SqlSession(其实SqlSessionTemplate实现类)、并将它注入其他组件(如DAO组件)- DAO组件可直接…...

【ROS】RViz、Gazebo和Navigation的关系
1、RViz RViz(Robot Visualization,机器人可视化)是一个用于可视化机器人系统的开源工具,用于显示和调试机器人的传感器数据、状态信息和运动规划等。它是ROS(Robot Operating System)的一部分,是ROS中最常用的可视化工具之一。 RViz:“我们不生产数据只做数据的搬运…...

智能井盖:提升城市井盖安全管理效率
窨井盖作为城市基础设施的重要组成部分,其安全管理与城市的有序运行和群众的生产生活安全息息相关,体现城市管理和社会治理水平。当前,一些城市已经将智能化的窨井盖升级改造作为新城建的重要内容,推动窨井盖等“城市部件”配套建…...

JavaWeb开发-06-SpringBootWeb-MySQL
一.MySQL概述 1.安装、配置 官网下载地址:https://dev.mysql.com/downloads/mysql/ 2.数据模型 3.SQL简介 二.数据库设计-DDL 1.数据库 官网:http:// https://www.jetbrains.com/zh-cn/datagrip/ 2.表(创建、查询、修改、删除) #…...

十六、垃圾回收相关概念
目录 一、System.gc()的理解二、内存溢出和内存泄漏2、内存泄漏 三、Stop the World1、什么是 stop the word ? 四、垃圾回收的并行和并发1、并发和并发2、垃圾回收的并行和并发 五、安全点与安全区域1、什么是安全点?2、安全区域 六、强引用(不可回收&…...

hive、spark、presto 中的增强聚合-grouping sets、rollup、cube
目录 1、什么是增强聚合和多维分析函数? 2、grouping sets - 指定维度组合 3、with rollup - 上卷维度组合 4、with cube - 全维度组合 5、Grouping__ID、grouping() 的使用场景 6、使用 增强聚合 会不会对查询性能有提升呢? 7、对grouping sets、…...

elasticsearch bulk 批量操作
1:bulk 是 elasticsearch 提供的一种批量增删改的操作API bulk 对 JSON串 有着严格的要求。每个JSON串 不能换行 ,只能放在同一行,同时, 相邻的JSON串之间必须要有换行 (Linux下是\n;Window下是\r\n&#…...

力扣11、 盛最多水的容器
方法一:双指针 考察: 贪心、数组、双指针 说明 本题是一道经典的面试题,最优的做法是使用「双指针」。如果读者第一次看到这题,不一定能想出双指针的做法。 复杂度分析 时间复杂度:O(N),双指针总计最多…...

IIC协议详解
目录 1.IIC协议概述 2.IIC总线传输 3.IIC-51单片机应用 1.起始信号 2.终止信号 3.应答信号 4.数据发送 4.IIC-32单片机应用 用到的库函数: 1.IIC协议概述 IIC全称Inter-Integrated Circuit (集成电路总线)是由PHILIPS公司在80年代开发的两线式串行总线&…...

element ui-表头自定义提示框
版本 “element-ui”: “^2.15.5”,需求:鼠标悬浮到该列表头,显示提示框代码 <el-table:data"xxxx"><el-table-column label"序号" width"40" type"index" /><el-table-columnv-for"(ite…...

Python 图形化界面基础篇:创建顶部菜单
Python 图形化界面基础篇:创建顶部菜单 引言 Tkinter 库简介步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3:创建顶部菜单栏步骤4:处理菜单项的点击事件步骤5:启动 Tkinter 主事件循环 完整示例代码…...