我有一个小型服务器,必须处理大量文件。文件通过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
,但这不起作用。我现在仍然没有记忆。
答案 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
因此,直到没有文件大于服务器应该工作的内存。