V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
chenqh
V2EX  ›  Go 编程语言

关于 golang 内存的问题

  •  1
     
  •   chenqh · 2021-03-06 17:57:32 +08:00 · 1763 次点击
    这是一个创建于 1369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 golang 写了一个 gtail https://github.com/chen19901225/gtail, 为什么居然要 12M 左右的内存,

    感觉比 python 写的占用还多,感觉不科学呀?

    关键我查不到就是把 python 的逻辑复制到 golang, 没有什么奇怪的操作呀

    请大佬指点下为什么?

    使用命令

    go build 
    
    ./gtail --pattern=/tmp/*.log
    
    
    8 条回复    2021-03-07 13:37:23 +08:00
    shoaly
        1
    shoaly  
       2021-03-06 18:38:01 +08:00
    看了看 我的 16g 大内存笔记本, 这帖对我来说 可以略过了
    chenqh
        2
    chenqh  
    OP
       2021-03-06 18:55:53 +08:00
    @shoaly 我也是 16G 呀,但是 vagrant vbox 只分配了 6G,
    mogg
        3
    mogg  
       2021-03-06 19:53:05 +08:00   ❤️ 1
    不知道你 Python 怎么写的,看 go 的代码,内存占用最大的是 filepath.Glob,这个函数调用了*file.Readdirnames 会列出 /tmp 下面所有文件名。我在本机上试,/tmp 下面 2w 个文件,单独 Readdirnames 就占用 10M 内存……
    mogg
        4
    mogg  
       2021-03-06 20:21:15 +08:00
    @mogg 更正一下,Readdirnames 占用了 2M,剩下的应该都是 runtime 内存(
    chenqh
        5
    chenqh  
    OP
       2021-03-06 20:30:55 +08:00
    @mogg 我就是想它在不断的循环调用 glob 呀,因为如果是不断的调用 glob 的话,那么如果那个目录新加了文件,就会自动 tail 了,默认的 tail, 相当于了旨在第一次调用的时候,glob 了一下,这不是我想要的
    chenqh
        6
    chenqh  
    OP
       2021-03-06 20:31:43 +08:00
    @mogg 不是说 golang 比 py 省内存吗,为什么会占 10M ?
    monsterxx03
        7
    monsterxx03  
       2021-03-06 22:30:26 +08:00
    10M 左右对 go 来说并不多.

    就你这个程序, 我尝试编译跑了一下, 一个目录里只有两个文件, 无新写入, 内存占用在 7M 左右
    用 pmap 看了下, 3M 多是从 binary 里映射出来的 (不用 urfave/cli 估计能少 2M). go 的 gc 要等到 heap 增长到一定 size 才会触发

    GODEBUG=gctrace=1 ./gtail --pattern xxx

    可以看到 log:

    gc 1 @164.953s 0%: 0.055+0.85+0.016 ms clock, 0.44+0.50/0.67/0.21+0.13 ms cpu, 4->4->0 MB, 5 MB goal, 8 P

    在程序运行 164s 后触发了第一次 gc, 回收了 4M 的 heap 内存, 但你看到的 rss 并不会直接减少, runtime 会复用这段内存, 所以最后 rss 稳定在 7M 多.

    python 跑一个没任何变量分配的死循环也要占用 7M 多, go 不到 1M. 你没给出 python 的代码, 不好说.

    并没有 go 一定比 python 省内存这种说法, 完全取决于你的 workload, python 的引用计数+mark&seep 方式, 在简单代码里完全可能比 go 的 gc 省内存.
    chenqh
        8
    chenqh  
    OP
       2021-03-07 13:37:23 +08:00
    @monsterxx03 好吧,我还以为 golang 内存很小呢,4-5M 呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5576 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 03:38 · PVG 11:38 · LAX 19:38 · JFK 22:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.