返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 编程硬核技术:高性能低延迟…
 英伟达确定1月4日举办GeForc…
 【硬件资讯】Nvidia又两款移…
 NVIDIA下一代显卡采用3nm工艺…
 据报道英伟达今日正式发售RT…
 英伟达显卡下架后换皮官宣!…
 自用过才有说服力为您推荐这…
 鑫谷(Segotep)额定500W GP…
 慧能泰“一线双芯”简单有效…
 德州仪器TPS5430实例应用-便…
 奥远HRF系列射频直流电源-奥…
 联想旗舰店购买新电脑到手却…
 最高人民法院发布第35批指导…
 【手慢无】别买SATA30了!一…
 给电脑重装系统分区的方法
 【手慢无】金士顿正品1TB固态…
 特瑞凯S3迷你电脑评测:以赛…
 湖北省沙洋汉津监狱打印机、…
 上海第二工业大学电脑打印机…
 惠普Victus 15笔记本电脑测评…
 成都市双流区中医医院电脑、…
 组装电脑配置清单2022(组装…
 组装电脑配件批发价格-最新组…
 组装机提示无法升级win11怎么…
 北京笔记本电脑回收价格一览…
 装电脑配件价格-最新装电脑配…
 超薄无边框结合AH-IPS屏 飞利…
 玛雅air 32QB 32寸2K显示器 …
 搭载B&O音响 华硕时尚超薄显…
 显示器超薄壁挂
 2022广州车展:捷途大圣i-DM…
 国产信创笔记本电脑生产厂家…
 华硕称 Ryzen 7000 笔记本处…
 十分钟教会你选购笔记本电脑…
 2022 年CPU天梯图显卡天梯图…
 世界上最快的CPU!英特尔发布…
 13代酷睿的灵巧座驾:华硕RO…
 梅捷B760主板发布:8+1+1相供…
 为您找到如何查看电脑主板是…
 新竞化 华硕B760、Z790系列主…
 堆料扎实的平民主板微星MAG …
 “SIMM”是“Single In-line…
 电脑开机蓝屏出现英文怎么解…
 开机后提示“内存错误英文字…
 u盘64位系统需要64位CPU的支…
 【内存卡英文】_内存卡英文价…
 电脑显卡是什么样子的图片
 Steam Deck配置相当于什么显…
 RTX 4070显卡上市时间是什么…
 显卡是什么?显卡和Graphics…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
编程硬核技术:高性能低延迟内存池实现技术
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/1/4 14:06:29 | 【字体:

  搜挑网调用malloc分配内存大概是微秒级别,高并发低延迟系统的关键路径上,要慎用malloc/new,特别是在线程数量很大的情况下。

  给一个测试数据:linux 64位系统,标准库malloc,单线优化,分配的size在4M以下随机,平均每次分配大概0.1-3微秒,具体数值跟分配行为有关,跟分配后是否free有关。

  微秒级的执行时间是什么概念?一般而言,简单的函数调用,里面做个加减乘除+拷贝几十个字节+逻辑判断,应该是几十个纳秒级别,由此可见,malloc/new调用是比较慢的。

  我们来看看doris是怎么做内存管理的,推测这个方案是从某个开源库借鉴(chao)过来的,any way,性能不错,值得研究。

  因为每个core都有一个ChunkArena对象,所以上层应用代码申请内存的时候,先获取代码正在哪个核上执行,从而找到对应的ChunkArena对象,再通过size找到对应的free列表,再从该free list上摘除一个块。

  多个逻辑线程依然可能调度到同一个核上执行,虽然多个线程不会在一个核上同时执行申请动态内存,但多个线程在一个核上交错执行(申请内存)的情况,依然会引发对free list的数据竞争(虽然这种情况出现的概率很小),这时候只需要用test_and_swap原子操作不停尝试就行了,如果尝试一定次数还不成功,则执行线程主动yield,让出CPU,从而让另一个在该核上执行内存分配的线程有机会继续执行,进而修改atomic_flag,然后之前yield CPU的线程被重新调度执行。

  TAS(test and swap)是很快的,且冲突概率变得非常小(因为每个核都有一个atomic_flag,不会所有线程竞争一个锁),这样的免锁设计,让分配内存变得很高效。

  Chunk就是底层接口单次分配的内存块,Chunk持有内存块首地址data,内存块大小size,以及分配的时候执行线程在哪个core上执行。

  ChunkInfo包含Chunk,同时多了一个int allocated_size,这是因为,为了减少对system_allocator::allocate()的调用次数,所以单次分配的chunk会比较大,几K,几十K,甚至XX M(兆),这个大的size记录在chunk-size上。但是,上层应用一次分配的内存可能比较小,几十字节之类,所以,该chunk还有多少字节可用(已经使用了多少字节),需要有一个记录,这就是allocated_size,相当于一个游标,每次从该chunk分配x字节,那就把allocated_size这个游标往增长的方向移动x字节(实际上会考虑到对齐)。

  所以,对system_allocator::allocate()的调用,相当于批发进货。对MemPool::allocate()的调用,相当于零售。效果上,就是减少了底层API的调用频率,减少了多线程竞争。

  MemPool持有一个next_chunk_size,它表示下次调用ChunkAllocator分配接口allocator的时候,需要分配多大,它被初始化为4K,下次分配的时候,会增加到8K,当然如果下次申请的size大于8K,则会取max。

  next_chunk_size会一直增加,直到触达最大配置值,这样的设计,目的还是为了减少底层分配次数。

  一个细节,关于ChunkAllocator,分配的时候,会首先从线程运行的core上的ChunkArena分配,如果没有合适的,会从其他Core的ChunkArena里分配,再分配不到,才会从system_allocate,这样做的目的,是减少内存cache量。

  很多人会质疑内存池的必要性,我只能说,如果线程很多,并发很大,时延要求也高,那可能真的需要加这么一层,不信你可以去测试一下。

  不过,所有的方案都有缺点都有优点,都需要通用性,专用性,性能,效率,内存利用率等各个方面做出权衡,要结合业务,结合上层代码来定制。

  nginx,clickhouse的内存管理方案也不错,读者有兴趣可以去找来看看。

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 编程硬核技术:高性能低延迟内存池实现技术 (01-04)
    普通电脑内存 “SIMM”是“Single In-line Memory Module”… (01-04)
    普通电脑内存 电脑开机蓝屏出现英文怎么解决 (01-04)
    普通电脑内存 开机后提示“内存错误英文字母不能为read” 这… (01-04)
    普通电脑内存 u盘64位系统需要64位CPU的支持 (01-04)
    普通电脑内存 【内存卡英文】_内存卡英文价格图片品牌_批发… (01-04)
    普通电脑内存 最新版区块链术语表(中英文对照) (01-03)
    普通电脑内存 电源三大烂是哪些 (电源的好坏) (01-03)
    普通电脑内存 强攻设计师电脑 技嘉推出DESIGNARE DDR4内存 (01-03)
    普通电脑内存 【三月线年上海市三校生三月专科层次自主招生… (01-03)
    普通电脑内存 惠普EliteBook 865 G9笔记本评测:Ryzen 7 Pr… (01-03)
    普通电脑内存 电脑内存条有什么用 电脑内存条使用方法【详解… (01-01)
    普通电脑内存 怎么看电脑内存三种看内存的方法任你选 (01-01)
    普通电脑内存 电脑内存条参数各有什么含义? (01-01)
    普通电脑内存 4000988800联想笔记本电脑内存占用过高怎么办 (01-01)
    普通电脑内存 内存条是什么?电脑内存条有什么用? (01-01)
    普通电脑内存 华为手机用户请留意关闭掉手机里面这4个功能至… (12-31)
    普通电脑内存 重装系统之痛 (12-31)
    普通电脑内存 微软晒Edge亮眼“战绩”:标签页睡眠模式降低… (12-31)
    普通电脑内存 手机内存怎么越来越不够用了? (12-31)