環境是 Windwos server 2003+fast-cgi,PHP 為 PHP 5.4.45+wincache 及 PHP 5.6.24+opcache。
$ ab -n 100 -c 4 http://10.161.81.188/test/sdic_qry/index.php/sql_qry?dep=P020
hello-world,只是單純送出 "Hello, world!" 的字串,用來測試空的 framework 的性能。Slim 2 有加裝一些 package,也設定一些習慣使用的 Laravel 的靜態介面。
sql_qry 則進行資料庫的 query,用以測試資料庫存取的影響。其中,後端資料庫為安裝在 VM 的 SQL 2000 server。
PHP 5.6.24
Slim 2,debug off,hello-world,,Requests per second: 189.16 [#/sec]Slim 2,debug on,hello-world,Requests per second: 187.35 [#/sec] (mean)
Slim 2,debug off,sql_qry,Requests per second: 143.17 [#/sec] (mean)
Slim 2,debug on,sql_qry,Requests per second: 129.30 [#/sec] (mean)
Slim 3,debug on,hello-world,Requests per second: 143.44 [#/sec] (mean)
Slim 3,debug off,sql_qry,Requests per second: 118.56 [#/sec] (mean)
Laravel 5.0,hello-world, 66.33 [#/sec] (mean)
Laravel 5.0,sql_qry,5.6.24,Requests per second: 55.74 [#/sec] (mean)
Laravel 5.0,sql_qry,5.6.24,Requests per second: 55.74 [#/sec] (mean)
Slim 2,debug off,laravel-session (file/database),Requests per second: 60 [#/sec] (mean)
PHP 5.4.45
Slim 2,debug on,hello-world,Requests per second: 80.37 [#/sec] (mean)Slim 2,debug off,hello-world,Requests per second: 110.83 [#/sec] (mean)
Slim 2,debug off,sql_qry,Requests per second: 87.60 [#/sec] (mean)
Slim 2,debug on,sql_qry,Requests per second: 72.85 [#/sec] (mean)
L5,sql_qry,5.6.24,Requests per second: 25.22 [#/sec] (mean)
L5,hello-world, 29.75 [#/sec] (mean)
測試中,Tracy/Debuger 會造成 Failed requests。
在 Slim 2 中,加上 Laravel 的 session 後,效能降到和 Laravel 差不多。
其中,session 的垃圾收集,會大幅的拖慢效能。垃圾收集的時機,由設定中的 'lottery' => [2, 100] 來決定,此代表 50 次,會做一次垃圾收集。減少垃圾收集的機率,可提升效能。
請參考 PHP Session Garbage Collection: The unknown performance bottleneck
所以,是否使用 Laravel 的 session,會是一個決擇。然而,其可以選擇不同的 drvier,實在是非常方便的作法。
以下為使用下列指令測試的結果
$ ab -n 100 -c 10 http://10.161.81.188/test/sdic_qry/index.php/cou_cur/introduction?cur=P020
Slim 2 的結果如下
Server Software: Microsoft-IIS/6.0
Server Hostname: 10.161.81.188
Server Port: 80
Document Path: /test/sdic_qry/index.php/cou_cur/introduction?cur=P020
Document Length: 18064 bytes
Concurrency Level: 10
Time taken for tests: 1.373 seconds
Complete requests: 100
Failed requests: 26
(Connect: 0, Receive: 0, Length: 26, Exceptions: 0)
Write errors: 0
Total transferred: 1829852 bytes
HTML transferred: 1806452 bytes
Requests per second: 72.85 [#/sec] (mean)
Time per request: 137.275 [ms] (mean)
Time per request: 13.727 [ms] (mean, across all concurrent requests)
Transfer rate: 1301.74 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.7 0 4
Processing: 52 129 41.4 119 330
Waiting: 50 128 41.4 118 329
Total: 52 130 41.5 120 331
Percentage of the requests served within a certain time (ms)
50% 120
66% 131
75% 140
80% 145
90% 178
95% 206
98% 308
99% 331
100% 331 (longest request)
|
Laravel 5.0 的結果如下
Server Software: Microsoft-IIS/6.0
Server Hostname: 10.161.81.188
Server Port: 80
Document Path: /test/sdic_for_reg/index.php/cou_cur?cur=P020
Document Length: 14987 bytes
Concurrency Level: 10
Time taken for tests: 3.927 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 1606344 bytes
HTML transferred: 1498700 bytes
Requests per second: 25.46 [#/sec] (mean)
Time per request: 392.702 [ms] (mean)
Time per request: 39.270 [ms] (mean, across all concurrent requests)
Transfer rate: 399.46 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.1 0 5
Processing: 146 372 95.2 346 738
Waiting: 143 370 95.0 345 737
Total: 147 373 95.4 347 739
Percentage of the requests served within a certain time (ms)
50% 347
66% 400
75% 436
80% 463
90% 495
95% 527
98% 626
99% 739
100% 739 (longest request)
|
結果是 Slim 2 大概是 Laravel 5.0 的 3 倍。然後,隨著程式成長,使用 Slim 的環境,也由每秒完成的 request 也由 72 個降到 65 個左右。
再 Optimizing Composer's autoloader 一下,指令 composer dumpautoload -o,又稍微提升到每秒完成 75 個 request。
不過,結果不是很穩定,後來再測,降到約 70 [#/sec]。
使用 Apache 伺服器跑 Slim 時,用 ab 測效能,會變得很慢,一秒才處理一個 request。
這是因為 ab 送出 HTTP/1.0 的 request,它會等伺服器關閉 connection。可是 Slim 卻回應 HTTP/1.1 的 header,因此雙方在互相等待連線關閉。
解決辦法,針對所有的 HTTP/1.0 或沒有 Connection header 的 request,都送出 "Connection: close" 。在 Slim 初始化後,加上下面的程式碼。
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0' &&
empty($_SERVER['HTTP_CONNECTION'])
) {
// header('Connection: close');
$app->response->headers->set('Connection', 'close');
}
再 Optimizing Composer's autoloader 一下,指令 composer dumpautoload -o,又稍微提升到每秒完成 75 個 request。
2018-01-29 測試
應用程式的條件,使用 Laravel 的 DB 和 View,關掉 debug。在 optimize 以前,大約 100 [#/sec],optimize 後,約 118 [#/sec]。不過,結果不是很穩定,後來再測,降到約 70 [#/sec]。
使用 ApacheBench (ab) 測 Slim 變得很慢
參考 HTTP, Slim and ApacheBench使用 Apache 伺服器跑 Slim 時,用 ab 測效能,會變得很慢,一秒才處理一個 request。
這是因為 ab 送出 HTTP/1.0 的 request,它會等伺服器關閉 connection。可是 Slim 卻回應 HTTP/1.1 的 header,因此雙方在互相等待連線關閉。
解決辦法,針對所有的 HTTP/1.0 或沒有 Connection header 的 request,都送出 "Connection: close" 。在 Slim 初始化後,加上下面的程式碼。
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.0' &&
empty($_SERVER['HTTP_CONNECTION'])
) {
// header('Connection: close');
$app->response->headers->set('Connection', 'close');
}
沒有留言:
張貼留言