nginxでの話ではあるが。
nginxがノンブロッキングでリクエスト処理を行うため、コンテキストスイッチなどを考慮した場合に、コア数で立ち上げておけば効率よくCPUを使い切れるという前提があるからです。
一方で、例えば僕の用途では、現在画像の処理だったりとか、ngx_mrubyのようにリクエストの過程で一部ブロッキングされるような処理も増えてきているため、コア数以上の値に設定しておいた方が性能を発揮できるような状況も増えてきています。
マルチコア環境ではコア毎にworkerの処理を割り振っておいた方が効率的。これは分かる。
で、その上で何か重い処理があっても後続リクエストが待ち状態にならないように1コアで複数のWorkerをマルチタスクさせると。
かつ、あまり同時に走らせてもコンテキストスイッチのオーバーヘッドで遅くなるので、1コア辺り高々2-4辺りに留めておくと。
GunicornのWorker数も多分同じことなのだろう。