去服务器2 cpu

时间:2017-03-07 20:20:19

标签: go server grpc go-server

我正在GO中构建一个GRPC服务器,我希望提高它的性能。我增加了我的机器并放置2CPUS以使其更好但我注意到我的服务器没有使用所有的CPU内核而我找不到修复它的方法(我已经运行了一些测试来制作服务器工人更难)。看起来我的服务器使用了1个cpu而另一个没有。我的负载平均值保持在1以上意味着我的服务器充满了请求但是当我看到netdata中的性能时,只有一个CPU在工作。

这是我的grpc代码:

package main
import (
    "fmt"
    "runtime"
    "log"
    "net"
    "google.golang.org/grpc"
    "golang.org/x/net/context"
    "google.golang.org/grpc/reflection"
    pb "teste/prototeste"

)
func (s *server) Test(ctx context.Context, n *pb.TestRequest)      (*pb.TestReply, error){
    return &pb.TestReply{Message: n.Name}, nil
}

type server struct{}

const (
    port = ":50051"
)

func main(){

    numOfCores := runtime.NumCPU()
    fmt.Println(numOfCores)
    runtime.GOMAXPROCS(numOfCores)
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    // Register reflection service on gRPC server.
    reflection.Register(s)

    s.Serve(lis)

}

请注意,在Serve函数中有一个goroutine,允许服务器并行接受多个请求。

API reference grpc in go

This is my cpu usage

有关如何解决此问题并使我的服务器使用2个cpus的任何提示?

1 个答案:

答案 0 :(得分:1)

在gRPC中,每个服务器处理程序都在自己的goroutine中运行。从那里开始,由Go调度程序确定要安排它们的CPU。根据您的服务器处理程序正在执行的操作,系统负载等,它们可能最终都安排在同一个CPU上。