【问题标题】:Go server with 2 cpus带 2 个 cpu 的服务器
【发布时间】:2017-03-07 20:20:19
【问题描述】:

我正在 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 个 CPU 的任何提示?

【问题讨论】:

  • 你在使用 Docker 吗?虚拟机?通过设置了 CPUAffinity 的 systemd 单元启动它?也许您的服务器在 user.slice 中将 CPUAffinity 设置为 1 或 2 个 CPU。也许您的操作系统内核正在使用某种设置,该设置将网络流量驱动到每个连接哈希的 CPU,而您仅从一个 IP 进行测试。 . .
  • 我用 1 个和 2 个不同的 IP 运行了许多测试,结果是一样的。我正在使用虚拟机。这个 CPUAffinity 是什么?我不知道这个。
  • 啊,服务器运行在linux centos中
  • 如果您在虚拟机中运行,您为虚拟机配置了多少 CPU 以使用?
  • 有关可能适用的数据包转向的一些信息kernel.org/doc/Documentation/networking/scaling.txt

标签: go server grpc go-server


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2020-09-22
    • 2014-09-30
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多