2017-03-07 3 views
2

私はGOでGRPCサーバを構築していますが、パフォーマンスを向上させたいと思います。私は自分のマシンを増やして、2CPUSを入れてみましたが、私のサーバーがすべてのCPUコアを使用していないことに気づいたので、修正する方法が見つけられませんでした。労働者がより困難)。私のサーバーは1CPUを多く使い、もう1CPUは使っていないようです。私の負荷平均は1を超えています。これは、サーバーに要求が満ちていることを意味しますが、netdataでのパフォーマンスは1つのCPUしかありません。で、サーバーが並行して複数の要求を受け入れることができゴルーチンがあります機能を果たす2 cpusのサーバに移動

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) 

} 

お知らせ:

これは私のgrpcコードです。

API reference grpc in go

This is my cpu usage

この問題を解決し、2つのCPU、私のサーバーの使用を作成する方法の任意のヒント?

+0

Dockerを使用していますか?仮想マシン? CPUAffinityが設定されたsystemdユニットを使用して起動しますか?おそらく、サーバーのCPUAffinityがuser.sliceの1または2のCPUに設定されている可能性があります。おそらく、あなたのOSカーネルは、接続ハッシュごとにCPUへのネットワークトラフィックを駆動する何らかの設定を使用しており、あなたは1つのIPからテストしているだけかもしれません。 。 。 –

+0

私は1と2の異なるIPで多くのテストを実行し、結果は同じでした。私は仮想マシンを使用しています。このCPUAffinityとは何ですか?私はこれについて知らなかった。 – Vivi

+0

ああ、サーバーがLinuxのcentosで動作しています – Vivi

答えて

1

gRPCでは、各サーバーハンドラは独自のゴルーチンで実行されます。そこからGoスケジューラがスケジュールするCPUを決定します。あなたのサーバーハンドラがやっていること、システムの負荷などに応じて、それらはすべて同じCPU上でスケジュールされる可能性があります。

関連する問題