Intenté hacer una prueba de referencia utilizando rpc y exec.command pero me quedé atascado en cmd.Run().
Estoy tratando de hacer una prueba de rendimiento con Go, usando rpc y exec.command. Aquí están partes de mi código. Tengo un maestro que envía rpc al trabajador para hacer algún trabajo.
func main() {
var wg sync.WaitGroup
var clients []*rpc.Client
client, err := rpc.DialHTTP(“tcp”, “addr”+”:1234″)
if err != nil {
log.Fatal(“dialing:”, err)
}
reply := &Reply{}
args := &Args{}
clients = append(clients, client)
fmt.Println(clients)
err = clients[0].Call(“Worker.Init”, args, reply)
if err != nil {
log.Fatal(“init error:”, err)
}
// llamada al servidor para inicializar el canal
// err = client.Call(“Worker.Init”, args, reply)
args.A = 1
wg.Add(200)
fmt.Println(time.Now().UnixNano())
for i := 0; i < 200; i++ {
go func() {
defer wg.Done()
err = client.Call(“Worker.DoJob”, args, reply)
if err != nil {
log.Fatal(“dojob error:”, err)
}
fmt.Println(“Done”)
}()
}
wg.Wait()
fmt.Println(time.Now().UnixNano())
}
y el código del trabajador
“`
func (w *Worker) DoJob(args *Args, reply *Reply) error {
// encontrar un canal para hacerlo
w.c <- 1
runtime.LockOSThread()
fmt.Println(“exec”)
// cmd := exec.Command(“docker”, “run”, “–rm”, “ubuntu:16.04”, “/bin/bash”, “-c”, “date +%s%N”)
cmd := exec.Command(“echo”, “hello”)
err := cmd.Run()
fmt.Println(“exec done”)
if err != nil {
reply.Err = err
fmt.Println(err)
}
fmt.Println(“done”)
<-w.c
return nil
}
Uso un canal de tamaño 12 para simular que la máquina solo tiene 12 hilos, y después de encontrar que se quedaba atascado en cmd.Run(), cambié el comando de ejecutar un docker a simplemente imprimir “hola”, pero todavía se queda atascado entre fmt.Println(“exec”) y fmt.Println(“exec done”). No sé por qué está sucediendo esto. ¿Estoy enviando demasiados rpcs y se están perdiendo muchos?
davy.ai
Parece que estás intentando hacer una prueba de rendimiento con Go usando RPC y exec.command. Tienes un maestro para enviar RPC al trabajador y hacer algún trabajo. Estás usando un canal de tamaño 12 para simular que la máquina tiene solo 12 hilos. Sin embargo, tu código se queda atascado entre
fmt.Println("exec")
yfmt.Println("exec done")
.Es posible que estés enviando demasiados RPC y algunos de ellos se estén perdiendo. Es posible que desees considerar reducir el número de RPC que envías o aumentar el tamaño del canal.