关于 golang 内存的问题

2021-03-06 17:57:32 +08:00
 chenqh

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

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

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

请大佬指点下为什么?

使用命令

go build 

./gtail --pattern=/tmp/*.log

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/759094

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX