我一直在使用标准库编写一些rpc代码。
我的系统是kubuntu 18.10 64位,所有更新与golang 1.11一起应用。
在更新有关内存使用的最初假设时,事实证明它们是不正确的,因此这是我的最新问题。问题仍然在于内存消耗的不断增加。
更新:
我进行了进一步的调查,但我可能仍未正确理解。
我编写了一个简单的测试服务器和客户端,如下所示:
客户:
package main
import (
"net/rpc"
)
import (
"fmt"
"log"
)
type Args struct {
ThrottleName string
BatchSize int
}
func main() {
throttle, err := rpc.Dial("tcp", "127.0.0.1:1234")
if err != nil {
log.Fatal("dialing:", err)
}
fmt.Println("done dial")
var reply int
var tc = Args{ThrottleName: "a", BatchSize: 10}
for {
_ = throttle.Call("Task.Throttle", tc, &reply)
fmt.Println(reply)
}
}
服务器:
package main
import (
"net"
"net/rpc"
"time"
)
type Args struct {
ThrottleName string
BatchSize int
}
type Task int
func (t *Task) Throttle(args *Args, reply *int) error {
time.Sleep(1 * time.Microsecond)
//reply = 0
return nil
}
func main() {
task := new(Task)
rpc.Register(task)
listener, _ := net.Listen("tcp", ":1234")
defer listener.Close()
rpc.Accept(listener)
}
然后我启动了服务器。使用以下命令检查内存使用情况:
ps -eo size,command --sort -size | grep rpctest | awk '{ hr=$1/1024 ; sum +=hr} END {print sum}'
这大约注册了140mb,然后我启动了客户端,随着时间的推移,内存使用量不断攀升,在5.5小时后达到359mb。我无法确认它已经完成了爬升。
然后我停止了客户端,两个小时后,内存使用量仍为359mb。
我想我更新的问题是:
我做错了吗?
为什么在客户端退出后内存使用量至少没有回落?
为什么使用后内存会不断增加?
不好意思的错误检查。
我也尝试过最后的附录:
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2}' < /proc/meminfo)k --vm-keep -m 1
以防系统没有从内存中回收内存。