为什么限制打开的连接数会增加内存消耗?

Why does limiting number of open connections improve memory consumption?

提问人:Hoa 提问时间:11/8/2023 最后编辑:Jonathan HallHoa 更新时间:11/8/2023 访问量:56

问:

我正在比较文件上传 API 的 Go 和 Java 实现。API 将从多部分 POST 请求接收文件并将其写入本地目录。

对于 Go(缩写):

// In request handler...

file, fileHeader, _ := request.FormFile("file")
tempFile, _ := os.CreateTemp(path, filename+"*")
io.Copy(tempFile, request.File)

// then produce a message via messageQ

在另一台机器(“CLIENT”)上,我运行 JMeter 以向相应的 API 生成任意数量的请求(文件上传)。负载是并发线程数的增加 (8,16,32,...128),其中每个集合每个线程发出 10 个请求。

我在服务器上运行的 shell 脚本中使用如下命令来收集每个实现的使用情况统计信息。

top -pid $pid -stats "pid,cpu,mem,threads" | grep --line-buffered $pid > util.txt

Java 实现使用的内存比 Go 实现少得多,在戳了默认参数后,我尝试限制 Go 实现中的打开连接数,如下所示:

l = netutil.LimitListener(l, connectionCount)

对于介于 8 和 200 之间的所有值,我注意到内存使用量变得恒定,而不是随着请求数量的线性增加。connectionCount

我无法找到 Go 侦听器的并发连接数的默认值。我也无法找到我的 Java 实现(我正在使用 Spring Framework)的默认配置来尝试和模仿。

我的问题是:为什么限制打开的连接数量会改变 Go 中的内存消耗行为?

两者都是垃圾回收语言,但在内存消耗方面的表现却截然不同,我想知道为什么。

GO 内存管理 垃圾回收 网络编程

评论


答: 暂无答案