我用 golang 写了一个 gtail https://github.com/chen19901225/gtail
, 为什么居然要 12M 左右的内存,
感觉比 python 写的占用还多,感觉不科学呀?
关键我查不到就是把 python 的逻辑复制到 golang, 没有什么奇怪的操作呀
请大佬指点下为什么?
使用命令
go build
./gtail --pattern=/tmp/*.log
1
shoaly 2021-03-06 18:38:01 +08:00
看了看 我的 16g 大内存笔记本, 这帖对我来说 可以略过了
|
3
mogg 2021-03-06 19:53:05 +08:00 1
不知道你 Python 怎么写的,看 go 的代码,内存占用最大的是 filepath.Glob,这个函数调用了*file.Readdirnames 会列出 /tmp 下面所有文件名。我在本机上试,/tmp 下面 2w 个文件,单独 Readdirnames 就占用 10M 内存……
|
5
chenqh OP @mogg 我就是想它在不断的循环调用 glob 呀,因为如果是不断的调用 glob 的话,那么如果那个目录新加了文件,就会自动 tail 了,默认的 tail, 相当于了旨在第一次调用的时候,glob 了一下,这不是我想要的
|
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 省内存. |
8
chenqh OP @monsterxx03 好吧,我还以为 golang 内存很小呢,4-5M 呢
|