【发布时间】:2019-06-24 15:35:18
【问题描述】:
我有一个用 Golang 编写的小守护进程,它循环工作并执行一些操作。我发现,在使用 CGO_ENABLE=1 或 CGO_ENABLED=0 编译的情况下,守护程序的行为会有所不同。例如,在 CGO_ENABLE=1(默认值)的情况下,程序的 VSZ 在短时间内(一小时内)膨胀到 1-2GB。当 CGO_ENABLED=0 时,VSZ 在很长一段时间内(几天)是相同的。看看下面的数字:
CGO_ENABLED=1(守护进程工作了 5 分钟)
$ grep -E 'VmSize|VmRSS' /proc/14916/status
VmSize: 1084052 kB
VmRSS: 12524 kB
CGO_ENABLED=0(守护进程工作了大约 30 小时)
$ grep -E 'VmSize|VmRSS' /proc/15160/status
VmSize: 110232 kB
VmRSS: 9756 kB
守护进程不使用依赖于 CGO 的包或函数。其他 Go 编写的程序表现出相同的行为。我知道 VSZ 和 RSS 之间的区别,我很感兴趣这种行为的本质是什么?为什么用 CGO_ENABLED=1 编译的程序要求从内核提供这么多内存?
我更喜欢不是“别担心,VSZ 只是虚拟内存,实际上它不被进程使用”形式的答案。
【问题讨论】:
-
您可以比较 /proc/$pid/maps 来找出答案。 VSZ 不是“内核提供的内存”。毕竟它是虚拟的,包括换出的内存、与其他程序共享的内存、内存映射文件和其他东西。同样,/proc/$pid/maps 有故障。
-
@Peter,谢谢,但我在上面提到过我知道 VSZ 是什么。也许我使用了一些不正确的描述。 maps-file 对我来说也是众所周知的。我问了,为什么 CGO_ENABLED 会影响程序描述的行为,而不是 VSZ。
-
你是在 Linux 上试试这个吗?
-
是的,它在 Linux 上
标签: go