首页 > 其他分享 >盘一盘那些高性能设计的点(一)

盘一盘那些高性能设计的点(一)

时间:2023-07-04 09:34:04浏览次数:44  
标签:缓存 Page 高性能 内存 127 缓冲区 设计 一盘 分配

狭义地讲,性能是指软件在尽可能少地占用系统资源的前提下,尽可能高地提高运行速度。

谈及性能,我们的关注点不再是软件或者系统的功能,而是在其实现功能过程中所表现出来的资源效率。

image

一、池化思想

什么是池化?

简单的说就是设置一个公共对象池,对于其中的对象直接复用而不再使用新创建的方式。

1、JDK 的包装类型值缓存池

Integer::IntegerCache 整形包装类缓存

用于 [-128, 127] 之间数字装箱操作使用。最大值可以通过 "java.lang.Integer.IntegerCache.high" 设置。

第一次使用的时候初始化,其大小可以通过 -XX:AutoBoxCacheMax= 进行设置。

Character::CharacterCache

缓存大小为 size = 127,即存储 [0, 127] 值域的 char 字符。

Long::LongCache

缓存大小 size = -(-128) + 127,即存储 [-128, 127] 值域的 long 值。

Byte::ByteCache

缓存大小 size = -(-128) + 127,即存储 [-128, 127] 值域的 byte 值。

Short::ShortCache

缓存大小 size = -(-128) + 127,即存储 [-128, 127] 值域的 short 值。

2、Netty 内存池

Netty 支持通过内存池的方式循环利用 ByteBuf,避免了频繁的创建,销毁 ByteBuf 带来的资源及性能损耗。

ByteBuf byte 数据缓冲区,是NIO编程的主要对象。高负载情景下,ByteBuf 内存池使用,可以有效降低GC频率。

PoolArena Netty 的内存池实现类。PoolArena 是由多个Chunk组成的大块内存区域,每个 Chunk 由一个多个 Page 组成。

Chunk:组织管理 Page 的内存分配和释放,Page 被构建为二叉树形式:

image

PoolSubpage:对于小于 Page 的内存使用,直接在 Page 中完成分配,每个 Page 切分为大小相同的多个存储块儿,存储块儿的大小由第一次申请的内存块儿大小决定。

回收:Netty 使用状态位标识 Chunk 及 Page 内存可用性,Chunk 标识二叉树 Page 节点使用状态;Page 标识内部内存块儿的使用状态。

3、redis 共享对象池

当对象为整数且值在范围在[0-9999]时,redis 可以通过共享对象的方式来节省内存。

目前共享对象池只对整数设置了[0-9999]数据共享对象,一方面整数对象池复用率最大,同时等值判断上时间复杂度为O(1)。

4、线程池

线程的创建和销毁是一个非常重量级的操作,线程复用是加快服务响应的一个重要手段。

5、连接池

数据库连接池、Http 连接池等。

基于 TCP 的连接,其连接建立及断开需要经过三次握手及四次挥手的复杂交互过程。

... ...

二、缓存

缓存,即数据交换的缓冲区。通常来说,缓存数据存放于内存,因此拥有极高的数据操作效率。

1、数据存储缓存

数据的持久化存储一般依靠数据库、文件系统等存储介质。

直接的数据读取性能支撑有限,一般会设置分布式缓存或者本地缓存中间存储做热点数据响应。

2、Mysql 查询缓存

对于相同查询语句及相同查询条件的,Mysql 会使用首次缓存的结果进行相应。

同样的机制延伸到目前广泛使用的 Mybatis、Hibernate ORM 框架等。

3、Buffer

Kafka Buffer、Netty Buffer 等。

提供发送及接收缓冲区,网络数据发送及接收处理不再局限于实时。可以通过设定积攒一定的量后再去处理,并且或支持 Buffer 内容操作。

Mysql InnoDB 的 change buffer。

InnoDB 可以使用它的 change buffer(change buffer 的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果)来批量写二级索引记录。

... ...

三、内存分配

内存分配触及底层资源申请及使用,属于内存管理范畴内的优化。

内存分配方面的优化主要涉及内存分配次数及内存使用率等因素考量。

1、redis SDS

SDS 即 Simple Dynamic String, Redis 自定的字符串存储结构。

Redis 在SDS内存配置策略上采用了【空间预分配】 + 【惰性删除】相结合的策略。

空间预分配:

在一次 SDS 字符扩展操作中,扩展的空间大小会大于实际需要的空间大小。

预分配空间的大小基于以下规则计算:

SDS len<1M:分配len长度空间作为预分配空间;

SDS len>=1M:分配1M空间作为预分配空间;

惰性删除:

调整删除 SDS 中部分数据时,不会立刻执行内存重分配,而是会保留空出来内存,并更新内部 free 属性。以备将来有字符扩展需求,可以直接使用。

2、Netty 动态缓冲区分配

动态缓冲区分配器,源码说明:根据实时的反馈动态的增加或者减少预需的缓冲区大小。

如果上一次分配的缓冲区被填满了,则调高下一次分配的缓冲区大小。

如果连续两次实际使用的容量低于分配的缓冲区大小特定比例,则减小下一次分配的缓冲区大小。

其它情景,保持分配大小不变。

Netty 的这种“智能化”处理,可以说是相当有用的:

  • 首先,实际的应用场景千差万别,同一场景下不同时刻的缓冲区需求也是实时变化(一句话可以是一个字,也可能是1000个字),这就需要 Netty 动态调整缓冲分配大小以适应不同的业务场景,时刻场景。

    image

  • 其次,过大的不必要的内存分配,会导致 Buffer 处理性能下降;过小的内存分配,则会导致频繁的分配释放。这都是一个优良的网络框架不应该有的。

  • 最后,动态的调整最直接的好处就是内存的的高效使用,一定程度上做到了按需分配。

3、Memcached Slab Allocator

基于 Slab Allocator 内存分配机制。一个 slab 包含很多 page,一个 page 包含很多 chunk。

标签:缓存,Page,高性能,内存,127,缓冲区,设计,一盘,分配
From: https://www.cnblogs.com/niejunlei/p/17522879.html

相关文章

  • 大连人工智能计算平台——华为昇腾AI平台——高性能计算HPC平台异构计算——NVIDIA GP
       使用华为的超算平台已经好长时间了,一直有个疑问,那就是这个超算平台是否支持异构计算,于是用命令试验了一下,具体命令: /opt/batch/cli/bin/dsub  -ntask_test-Axxxxxxxxxxxx-eoerror.txt-oooutput.txt-R"gpu=1"/usr/bin/nvidia-smi-pm1     -......
  • 通过容器化实现前端微服务化架构设计
    微服务架构是一种软件架构模式,用于构建复杂应用程序。它将一个大型的单体应用程序拆分为一组更小、更独立的服务,每个服务都运行在自己的进程中,并通过轻量级的通信机制进行交互。每个服务都专注于解决特定的业务功能或服务,并且可以独立开发、部署和扩展。 微服务架构的一些主......
  • 画出创建型设计模式的类图
    工厂方法FactoryMethod抽象工厂AbstractFactory单例模式Singleton建造者模式Builder原型模式Prototype......
  • 错误码如何设计才合理?
    导读:对于错误码的设计,不同的开发团队有不同的风格习惯。本文分享阿里文娱技术专家长统对于错误码的看法,希望从错误码使用的不同场景讨论得到一个合理的错误码规约,得到一个面向日志错误码标准和一个面向外部传递的错误码标准。  导读:对于错误码的设计,不同......
  • 浅谈安科瑞EMS2.0能效管理平台在制药厂洁净室的电气设计与选型
    罗轩志安科瑞电气股份有限公上海嘉定201801摘要:从设计原则、动力配电、照明配电和通信等方面分析了在洁净室电气设计中应遵循的原则和应注意的问题,并通过附图详细表明了医药洁净室管线的密封处理方法。关键词:医药洁净室;药品生产质量管理规范;密封;照度;应急照明;防静电接地0引言随着......
  • SketchUp Pro 2023-草图大师3D设计软件mac/win版
    SketchUpPro2023是一款领先的3D建模和设计软件,广泛应用于建筑、室内设计、景观规划、工业设计等领域。它以其直观易用的特点而受到许多设计师和建筑专业人士的青睐。→→↓↓载SketchUpPro2023mac/win版 SketchUpPro2023拥有用户友好的界面和简单直观的工作流程,使得从......
  • JAVA设计模式之工厂模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • 画出结构型设计模式的类图
    装饰器模式Decorator适配器模式Adapter桥接模式Bridge组合模式Composite代理模式Proxy静态代理JDK动态代理享元模式Flyweight外观模式Facade ......
  • ASL芯片CS5466方案设计|集睿致远CS5466代理商|Type-c转HDMI电路原理
    CS5466作为ASL集睿致远新推出的高性能Type-CtoHDMI2.1协议转换器,可以通过HDMI输出端口作为TMDS或FRL发射机进行操作。CS5466适配于多个配件市场和现实应用主板,例如:主板,显示端口,扩展坞等。CS5266还配备了最高级别的HDCP嵌入式秘钥,能够安全传输受保护的内容,作为集睿致远ASL的一......
  • 狂收 3K Star!一个高性能、无侵入的 Java 性能监控和统计工具,十分强悍!
    背景随着所在公司的发展,应用服务的规模不断扩大,原有的垂直应用架构已无法满足产品的发展,几十个工程师在一个项目里并行开发不同的功能,开发效率不断降低。于是公司开始全面推进服务化进程,把团队内的大部分工程师主要精力全部都集中到服务化中。服务化可以让每个工程师仅在自己负......