V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Nazz
V2EX  ›  程序员

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

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

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