nginx+apache+php+redis 与 nginx+lua+redis 性能对比
系统环境
内存:16G
cpu:Intel® Core™ i3-4130 CPU @ 3.40GHz × 4
系统:ubuntu 14.04 lts 64bit 桌面版
nginx version: openresty/1.9.7.4
Apache/2.4.7 (Ubuntu)
PHP 5.5.9-1ubuntu4.9,启用opcache
LuaJIT 2.1.0-beta1
Redis server v=2.8.4
用同一个nginx,用worker_processes 为1,配置如下
server { listen 81; location /lua/lottery { default_type text/plain; content_by_lua_file /www/lua/lottery.lua; } location /php { proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080/; # apache } }
简单输出
测试代码
lua ngx.say('hello world!')
php echo 'hello world!';
apache+php
➜ ~ ab -c 500 -n 10000 http://127.0.0.1:8080/php/lottery.php
Concurrency Level: 500
Time taken for tests: 6.574 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 1990000 bytes
HTML transferred: 120000 bytes
Requests per second: 1521.09 [#/sec] (mean)
Time per request: 328.711 [ms] (mean)
Time per request: 0.657 [ms] (mean, across all concurrent requests)
Transfer rate: 295.60 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 13 112.0 0 1002
Processing: 2 168 850.5 23 6560
Waiting: 2 167 850.6 22 6560
Total: 9 182 872.8 23 6568
Percentage of the requests served within a certain time (ms)
50% 23
66% 25
75% 28
80% 31
90% 40
95% 47
98% 4938
99% 4990
100% 6568 (longest request)
nginx+apache+php
➜ ~ ab -c 500 -n 10000 http://127.0.0.1:81/php/lottery.php
Concurrency Level: 500
Time taken for tests: 3.456 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 1950000 bytes
HTML transferred: 120000 bytes
Requests per second: 2893.90 [#/sec] (mean)
Time per request: 172.777 [ms] (mean)
Time per request: 0.346 [ms] (mean, across all concurrent requests)
Transfer rate: 551.08 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.2 0 12
Processing: 7 109 315.4 26 3344
Waiting: 7 109 315.4 26 3344
Total: 14 110 316.3 26 3355
Percentage of the requests served within a certain time (ms)
50% 26
66% 28
75% 30
80% 32
90% 41
95% 1004
98% 1229
99% 1670
100% 3355 (longest request)
nginx+lua
➜ ~ ab -c 500 -n 10000 http://127.0.0.1:81/lua/lottery
Concurrency Level: 500
Time taken for tests: 0.402 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 1610000 bytes
HTML transferred: 130000 bytes
Requests per second: 24892.46 [#/sec] (mean)
Time per request: 20.086 [ms] (mean)
Time per request: 0.040 [ms] (mean, across all concurrent requests)
Transfer rate: 3913.76 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 2 5 1.0 5 12
Processing: 2 6 1.4 6 14
Waiting: 2 5 1.3 4 13
Total: 7 11 1.6 11 19
Percentage of the requests served within a certain time (ms)
50% 11
66% 11
75% 11
80% 12
90% 12
95% 16
98% 18
99% 18
100% 19 (longest request)
Redis 读取键值
键值内容对 aa: hi,redis!
测试脚本
lua
local redis = require "resty.redis" local red =redis:new() red:connect('127.0.0.1', '6379') local res,err = red:get('aa') ngx.say(res) php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); echo $$redis->get('aa');
nginx+apache+php
➜ ~ ab -c 500 -n 10000 http://127.0.0.1:81/php/lottery.php
Server Software: openresty/1.9.7.4
Server Hostname: 127.0.0.1
Server Port: 81
Document Path: /php/lottery.php
Document Length: 9 bytes
Concurrency Level: 500
Time taken for tests: 3.498 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 1910000 bytes
HTML transferred: 90000 bytes
Requests per second: 2859.16 [#/sec] (mean)
Time per request: 174.877 [ms] (mean)
Time per request: 0.350 [ms] (mean, across all concurrent requests)
Transfer rate: 533.30 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 34 177.4 1 1016
Processing: 3 78 186.0 37 3012
Waiting: 3 77 186.2 36 3012
Total: 5 113 253.4 39 3018
Percentage of the requests served within a certain time (ms)
50% 39
66% 45
75% 49
80% 52
90% 100
95% 1022
98% 1056
99% 1064
100% 3018 (longest request)
nginx+lua
➜ ~ ab -c 500 -n 10000 http://127.0.0.1:81/lua/lottery
Server Software: openresty/1.9.7.4
Server Hostname: 127.0.0.1
Server Port: 81
Document Path: /lua/lottery
Document Length: 10 bytes
Concurrency Level: 500
Time taken for tests: 1.144 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 1580000 bytes
HTML transferred: 100000 bytes
Requests per second: 8738.81 [#/sec] (mean)
Time per request: 57.216 [ms] (mean)
Time per request: 0.114 [ms] (mean, across all concurrent requests)
Transfer rate: 1348.37 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.1 0 13
Processing: 7 24 89.9 11 1014
Waiting: 7 24 89.9 11 1014
Total: 8 24 90.3 11 1014
Percentage of the requests served within a certain time (ms)
50% 11
66% 13
75% 13
80% 14
90% 16
95% 104
98% 114
99% 116
100% 1014 (longest request)
写入Redis列表
测试代码
php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->rPush('list_php', 'hi');
echo 'ok';lua
local redis = require "resty.redis"
local red =redis:new()
red:connect('127.0.0.1', '6379')
red:rpush('list_lua', 'hi');
ngx.say('ok')
nginx+apache+php
➜ ~ ab -c 500 -n 10000 http://127.0.0.1:81/php/lottery.php
Concurrency Level: 500
Time taken for tests: 4.036 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 1840000 bytes
HTML transferred: 20000 bytes
Requests per second: 2477.77 [#/sec] (mean)
Time per request: 201.794 [ms] (mean)
Time per request: 0.404 [ms] (mean, across all concurrent requests)
Transfer rate: 445.23 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 16 122.6 0 1000
Processing: 13 138 479.8 33 3316
Waiting: 13 138 479.9 33 3316
Total: 23 154 525.2 34 4022
Percentage of the requests served within a certain time (ms)
50% 34
66% 35
75% 37
80% 39
90% 52
95% 1004
98% 2823
99% 3306
100% 4022 (longest request)
nginx+lua
➜ ~ ab -c 500 -n 10000 http://127.0.0.1:81/lua/lottery
Concurrency Level: 500
Time taken for tests: 1.064 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 1500000 bytes
HTML transferred: 30000 bytes
Requests per second: 9398.94 [#/sec] (mean)
Time per request: 53.197 [ms] (mean)
Time per request: 0.106 [ms] (mean, across all concurrent requests)
Transfer rate: 1376.80 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.6 0 12
Processing: 6 13 7.7 12 418
Waiting: 6 13 7.7 12 418
Total: 7 13 8.5 12 418
Percentage of the requests served within a certain time (ms)
50% 12
66% 13
75% 13
80% 13
90% 15
95% 28
98% 35
99% 36
100% 418 (longest request)
测试结果
每秒处理请求数对比
nginx+apache+php | nginx+lua | |
简单输出 | 1521.09(无nginx)/2893.90 | 24892.46 |
Redis 读取键值 | 2859.16 | 8738.81 |
写入Redis列表 | 2477.77 | 9398.94 |
说明
用apache自带ab测试10000次请求,500并发无失败。redis 写入全部成功。
包子流弊