• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Nazz
V2EX  ›  程序员

golang 内存 kv 缓存怎么做 gc 优化?

  •  
  •   Nazz · Feb 21, 2023 · 4870 views
    This topic created in 1354 days ago, the information mentioned may be changed or developed.

    大概几百万到一千万个 key

    Supplement 1  ·  Feb 22, 2023
    已经了解到, 尽量去使用值类型和切片就能缓解 GC 压力了, 谢谢各位. 可以完全使用切片去实现一个 HashMap, uint32 模拟前后指针实现链表, 使用[]byte 作为 KV, 这应该是目前最安全便利的方案了.
    42 replies  •  2024-10-21 08:35:08 +08:00
    selca
    selca
    Feb 21, 2023
    1
    挪到 redis 去,让 redis 自己优化
    Nazz
    Nazz
    OP
    Feb 21, 2023 via Android
    2
    @selca 要的就是避免网络 IO😂
    zoharSoul
    zoharSoul
    Feb 21, 2023
    3
    没得优化, 等堆外吧. 估计下个版本就出了
    fioncat
    fioncat
    Feb 21, 2023❤️5
    4
    提供一种思路,如果是容器应用,可以外挂一个 redis sidecar 来储存。通过 socket 进行通信。
    同一个 network namespace 下的 socket 通信开销几乎可以忽略的。
    我们通过这种方案解决过缓存占用问题,要知道 redis 的优化肯定会比你自己做好的。
    Nazz
    Nazz
    OP
    Feb 21, 2023
    5
    @zoharSoul 小技巧应该是有的
    Nazz
    Nazz
    OP
    Feb 21, 2023
    6
    @fioncat 可行性不错, 不知道领导满不满意
    8355
    8355
    Feb 21, 2023
    7
    同楼上 本质上还是本机应用 开销忽略不计 这样也好维护管理 可用性更高
    Nasei
    Nasei
    Feb 21, 2023
    8
    这个量级的 key fastcache 也满足不了吗
    Nazz
    Nazz
    OP
    Feb 21, 2023
    9
    @Nasei 感觉 freecache 比 fastcache 好. 还在想要不要自研, slice 的 hashmap 和 map + heap 的 ttl 我都造过轮子
    Nazz
    Nazz
    OP
    Feb 21, 2023
    10
    @Nasei fastcache 也不错, ttl 部分可以自己撸
    qieqie
    qieqie
    Feb 21, 2023 via iPhone
    11
    cgo
    dqzcwxb
    dqzcwxb
    Feb 21, 2023
    12
    你可以参考 caffeine 实现一个比较完善的本地缓存,如果只需要最简单的 LRU 那么只需要 Linkedhashmap 的数据结构就可以完成
    Masonnn
    Masonnn
    Feb 21, 2023
    13
    蹲一下
    Nazz
    Nazz
    OP
    Feb 21, 2023
    14
    @qieqie cgo 太不清真了
    zeonll
    zeonll
    Feb 21, 2023
    15
    如果使用 redis side car 的话,还得加一个 redis 的监控?
    biubiuF
    biubiuF
    Feb 21, 2023 via Android
    16
    用大数组存 kv
    cheng6563
    cheng6563
    Feb 21, 2023
    17
    不如直接用 unix socket 算了,性能高得很。
    Nazz
    Nazz
    OP
    Feb 21, 2023
    18
    @zeonll 有过期时间不加也没事, pod 本身有内存监控
    Nazz
    Nazz
    OP
    Feb 21, 2023
    19
    @cheng6563 还是觉得纯 Go 方案优雅些
    ToughGuy
    ToughGuy
    Feb 21, 2023
    20
    leveldb 有 cgo 的封装及原生实现,但是不知道可靠性与原生的 leveldb 相比如何。
    sampeng
    sampeng
    Feb 21, 2023
    21
    rocksdb 。
    PiersSoCool
    PiersSoCool
    Feb 21, 2023
    22
    问问是什么样业务 这么时延敏感吗 gc 要多久
    777777
    777777
    Feb 21, 2023❤️1
    23
    https://go.dev/doc/gc-guide 看一遍官方文档,你就会了
    kaf
    kaf
    Feb 21, 2023
    24
    https://github.com/bluele/gcache 是要实现这个?
    securityCoding
    securityCoding
    Feb 21, 2023
    25
    我工作的原则就是不做任何 gc 优化 233 ,不管是 java 还是 go ,横向拓展就好 233
    Nazz
    Nazz
    OP
    Feb 21, 2023 via Android
    26
    @securityCoding key 太多了还是要优化的
    Nazz
    Nazz
    OP
    Feb 21, 2023 via Android
    27
    @PiersSoCool 不做任何优化太浪费 CPU 和内存
    Nazz
    Nazz
    OP
    Feb 21, 2023 via Android
    28
    @kaf 实现类似的东西
    kiddult
    kiddult
    Feb 21, 2023
    29
    直接用现成的 bigcache 、freecache 那类就行,虽然多多少少有点坑,胜在能用
    fuxiaohei
    fuxiaohei
    Feb 21, 2023❤️1
    30
    最近有文章的 Ristretto 可以看看
    Nazz
    Nazz
    OP
    Feb 21, 2023 via Android
    31
    @kiddult 学习一下它们的实现方式也不错
    Nasei
    Nasei
    Feb 21, 2023
    32
    @Nazz 既然准备优化的话,是已经影响性能了?已经做过 profile 了吗?
    Nazz
    Nazz
    OP
    Feb 21, 2023 via Android
    33
    @Nasei 影响比较大
    lesismal
    lesismal
    Feb 22, 2023
    34
    如果是通用缓存基础设施,用已有的那几个就可以了。但通用缓存都是走了一道序列化的,如果追求性能,表现会差一些。
    如果不是通用缓存则不需要序列化,性能可以最大化,但要根据具体业务结合 kv 类型定制去指针化了。
    lesismal
    lesismal
    Feb 22, 2023❤️1
    35
    可以搜下几位专家的一些帖子看看,结合自己的数据类型定制+测试优化下就差不多了:
    真实环境下大内存 Go 服务性能优化一例
    曹大带我学 Go ( 11 )—— 从 map 的 extra 字段谈起
    Nazz
    Nazz
    OP
    Feb 22, 2023 via Android
    36
    Nazz
    Nazz
    OP
    Feb 22, 2023 via Android
    37
    @lesismal 有空自己写一个玩玩😀
    带 TTL 的 ConvurrentMap 和切片实现的 HashMap 我都实现过
    janxin
    janxin
    Feb 22, 2023
    38
    arena 试过了吗?
    Nazz
    Nazz
    OP
    Feb 22, 2023
    39
    @janxin 没用过
    Nazz
    Nazz
    OP
    Feb 22, 2023
    40
    @lesismal codec 的开销可以接受
    CloveAndCurrant
    CloveAndCurrant
    Feb 22, 2023
    41
    使用 arena 自己手动管理内存,不走 go 的 gc
    grzhan
    grzhan
    Oct 21, 2024
    42
    fastcache 的方案是 mmap 自己申请管理 kv 的内存,也绕过了 gc 。

    但是它的 hash -> idx ( bucket.m ) 索引本质是个 int->int 值类型的 map ,如果特别关注 gc 的话可能还是有一点优化的空间。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5131 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 06:19 · PVG 14:19 · LAX 22:19 · JFK 01:19
    ♥ Do have faith in what you're doing.