環境是 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');
}
沒有留言:
張貼留言