私は、スカラプレイフレームワーク2.5とゴランで単純なhello worldの例をベンチマークしています。ゴランはパフォーマンスを大幅に上回っているようですが、パフォーマンスを向上させるためにプレイフレームワークを最適化する方法を知りたいと思います。 私は私のプロジェクトでどこでもデフォルトの設定を使用しPRODモードでプレイ2.5を実行しているベンチマークscala Play 2.5 vs golangベンチマークとプレーフレームワークでのパフォーマンスの最適化
ab -r -k -n 100000 -c 100 http://localhost:9000/
に次を使用しています。誰かがパフォーマンスを最大限に引き出すためにプレイサーバーをチューニングするのを助けてくれますか?私はデフォルトのディスパッチャスレッドプールを読んだが、自分のPCにどのような設定を使うのか分からない。また、パフォーマンスに役立つことを確認できる他の分野もありますか?ここ
は、私がPRODモードで代替サーバーを実行するために、SBT(クリーンと段階)を使用して、ターゲット/ユニバーサル/段階で見つかったbatファイルを実行していますのでご注意ください私のmarchineスペック
Intel(R) Xeon(R) W3670 @ 3.20GHz 3.19GHz, 12.0 GM RAM, running windows 7 64-bit
です/ bin /。ここでプレーここ
package controllers
import play.api.mvc._
class Application extends Controller {
def index = Action {
Ok("Hello, world!")
}
}
のソースコードは、ABベンチマークここ
ab -r -k -n 100000 -c 100 http://localhost:9000/
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Software:
Server Hostname: localhost
Server Port: 9000
Document Path: /
Document Length: 13 bytes
Concurrency Level: 100
Time taken for tests: 1.537 seconds
Complete requests: 100000
Failed requests: 0
Keep-Alive requests: 100000
Total transferred: 15400000 bytes
HTML transferred: 1300000 bytes
Requests per second: 65061.81 [#/sec] (mean)
Time per request: 1.537 [ms] (mean)
Time per request: 0.015 [ms] (mean, across all concurrent requests)
Transfer rate: 9784.69 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 1
Processing: 0 2 1.9 1 72
Waiting: 0 2 1.9 1 72
Total: 0 2 1.9 1 72
Percentage of the requests served within a certain time (ms)
50% 1
66% 2
75% 2
80% 2
90% 3
95% 3
98% 5
99% 8
100% 72 (longest request)
からの結果は、ABベンチマークの結果はgolangここ
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, world!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
のソースコードされているありますゴラン用
ab -r -k -n 100000 -c 100 http://localhost:8080/
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Software:
Server Hostname: localhost
Server Port: 8080
Document Path: /
Document Length: 13 bytes
Concurrency Level: 100
Time taken for tests: 0.914 seconds
Complete requests: 100000
Failed requests: 0
Keep-Alive requests: 100000
Total transferred: 15400000 bytes
HTML transferred: 1300000 bytes
Requests per second: 109398.30 [#/sec] (mean)
Time per request: 0.914 [ms] (mean)
Time per request: 0.009 [ms] (mean, across all concurrent requests)
Transfer rate: 16452.48 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 1
Processing: 0 1 1.5 1 52
Waiting: 0 1 1.5 1 52
Total: 0 1 1.5 1 52
Percentage of the requests served within a certain time (ms)
50% 1
66% 1
75% 1
80% 1
90% 1
95% 2
98% 5
99% 7
100% 52 (longest request)
ありがとうございます フランシス
更新日:
性能向上では、次の結果が、私はまだパフォーマンスを向上させることができ、他のアイデアに興味
package controllers
import play.api.mvc._
import scala.concurrent.Future
import play.api.libs.concurrent.Execution.Implicits.defaultContext
class Application extends Controller {
def index = Action.async {
Future.successful(Ok("Hello, world!"))
}
}
@marcospereiraが言ったように、ベンチマークはプレイが比較的あり、
ab -r -k -n 100000 -c 100 http://localhost:9000/
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests
Server Software:
Server Hostname: localhost
Server Port: 9000
Document Path: /
Document Length: 13 bytes
Concurrency Level: 100
Time taken for tests: 1.230 seconds
Complete requests: 100000
Failed requests: 0
Keep-Alive requests: 100000
Total transferred: 15400000 bytes
HTML transferred: 1300000 bytes
Requests per second: 81292.68 [#/sec] (mean)
Time per request: 1.230 [ms] (mean)
Time per request: 0.012 [ms] (mean, across all concurrent requests)
Transfer rate: 12225.66 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 1
Processing: 0 1 2.2 1 131
Waiting: 0 1 2.2 1 131
Total: 0 1 2.2 1 131
Percentage of the requests served within a certain time (ms)
50% 1
66% 1
75% 1
80% 2
90% 2
95% 3
98% 5
99% 7
100% 131 (longest request)
これは、低レベルのhttpライブラリ( 'net/http'を参照)を高レベルのフレームワーク(Play)と比較しているためです。高水準のフレームワークは、より多くのユーティリティを提供し、ゆっくりとしているので、より多くのことをやっています。公平な比較は、ネット(http: "ライブラリ"、Playによって使用される)とGo'net/http'との間になります。一貫性のある結果が得られるまで(jvmでのjitコンパイルのため)、テストをプレイに対して実行することをお勧めします。 – marcospereira
@marcospereira私は 'net/http'を「低レベル」と呼ぶことはほとんどありません。それは主要な抽象化です。1行のコードで経路を開くことができ、着信要求が解析され、すべてのデータに簡単にアクセスできる素敵なオブジェクトに変換されます。実際にはバイナリデータを受け取っていることを考えると、かなり高いレベルになると思います。 OPに。 Playを使わないのはなぜですか?それは吸う。それは私の2セントです。それは過度に抽象化されているのでパフォーマンスが悪いですし、あなたのパフォーマンスが100%苦しんでいる間に、それがあなたに与えるものの80%を使用しないと確信しています。 – evanmcdonnal
プレーのような完全なスタックフレームワークと比較して、低レベルです。これが意味するところでした。 – marcospereira