如何使我的服务器(用Golang编写)不会耗尽内存?

时间:2016-05-27 21:09:23

标签: memory memory-management go garbage-collection

我有一个小型服务器,必须处理大量文件。文件通过PUT请求发送到服务器。我正在使用服务器的net / http包。我知道每次请求都会打开一个例程。但问题是请求完成后,处理程序的已用内存不会被释放。

服务器(应该)在具有1GB内存的Raspery Pi 3上运行。问题是,当我发送大量文件时,内存不足。此时我不能等到垃圾收集器释放内存。

这两个主题是关于这个问题的:

Why is the memory block not cleaned by the garbage collector?

Go 1.3 Garbage collector not releasing server memory back to system

但我的问题没有解决办法。

现在的问题是:有没有办法让一个http处理程序标记为完全就绪,垃圾收集器是否释放调用例程的内存?我试图在处理程序的末尾添加return,但这不起作用。我现在仍然没有记忆。

1 个答案:

答案 0 :(得分:0)

答案简短: 我更新到1.6.2版。现在,每个例程都没有额外的内存分配。

谢谢大家的意见。他们把我带回了正确的轨道。

内存消耗来自一个为每个上传文件创建md5哈希的函数。所以100MB文件也需要100MB内存。进入为每个请求分配的版本1.3(转到例程)新内存。所以最大Raspbery内存不足1 GB上传的文件。

所有goroutine来自哪里?

一条评论是关于为每个请求打开go例程的逻辑。这个逻辑没有被我自己实现,它处理请求的方式。

您可以在这篇很棒的开源书籍中找到关于使用Go构建Web应用程序的更多信息:Get into http package

版本1.6.2中现在发生了什么?

对于每次上传,服务器都会分配内存。现在不同的是,Go保留了内存量,但它也用于其他例程。

版本1.6.2的示例:

1st file 10 MB -> 10 MB RAM is used by the server
2nd file 5 MB -> 10 MB RAM is used by the server
3rd file 100 MB -> 100 MB RAM is used by the server
4th file 50 MB -> 100 MB is used by the server

因此,直到没有文件大于服务器应该工作的内存。