是rpc内存泄漏还是缺乏理解?

时间:2018-12-05 09:44:36

标签: go memory-leaks rpc

我一直在使用标准库编写一些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

以防系统没有从内存中回收内存。

0 个答案:

没有答案