高速なTCPサーバーをGolangで作りベンチマークを取っていたのですが、CPUが2コアや4コアだと100%CPUを使い切れるのに、16コアになるとCPUを100%使いきれずアイドルする現象に困っていました。16コアのサーバーを用いても実質4コア分のパフォーマンスしか出せていませんでした。 goroutine同士は干渉しないのにCPU数を上げてもスケールしないのには納得がいかず、GolangのスケジューラがCPUをブロックしているのではないかと考え、実験しました。 goroutineをスイッチするタイミングについては 意外と知らないgoroutineのスケジューラーの挙動 #golang goroutineがスイッチされるタイミング これらの記事が参考になります。 実験環境 Cloud: Degital Ocean OS: Ubuntu16.04.3 ubuntu-16 CPU: 16 C