Я написал код rpc в go, используя стандартную библиотеку.
Моя система - kubuntu 18.10 64-битные все обновления, применяемые вместе с golang 1.11.
В обновлении моих первоначальных предположений об использовании памяти они оказались неверными, поэтому вот мое обновлениевопрос.Вопрос по-прежнему связан с постоянным ростом потребления памяти.
Обновление:
Я провел дополнительное исследование и, вероятно, все еще не совсем правильно понял.
Iнаписал простой тестовый сервер и клиент следующим образом:
Клиент:
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}'
Это зарегистрировало около 140 МБ, затем я запустил клиент, использование памяти со временем возрастает, через 5,5 часов он достиг 359 МБ.Я не могу подтвердить, что он закончил лазать.
Затем я остановил клиент, и через 2 часа использование памяти все еще было на уровне 359 МБ.
Я думаю, мой обновленный вопрос:
Я делаю что-то не так?
Почему использование памяти по крайней мере не уменьшается после выхода из клиента?
Почему память продолжает расти при использовании?
Извините заУжасная проверка ошибок.
Окончательное дополнение Я также попробовал:
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2}' < /proc/meminfo)k --vm-keep -m 1
В случае, если система не возвращала память с ходу.