nginx服务器拥有支持高并发和低延迟的特性。它的第三方模块也受益于这个特点,我用一个nginx第三方模块HttpMemcModule和一般的php访问memcache的程序做个比较,看看两者之间的性能差距。
我的测试环境是典型的LNMP环境,自己在虚拟机上搭建的,php-cgi进程开了6个。
nginx的配置信息如下:
location /bar {
set $memc_cmd $arg_cmd;
set $memc_key $arg_key;
set $memc_value $arg_val;
set $memc_flags $arg_flags; # defaults to 0
set $memc_exptime $arg_exptime; # defaults to 0
memc_cmds_allowed get set add delete flush_all;
memc_pass 127.0.0.1:11211;
}
connect('localhost',11211) or die("Cound not connect");
$cmd=$_GET["cmd"];
$key=$_GET["key"];
$val=$_GET["val"];
if($cmd=="get"){
echo $mem->get($key);
}
else if($cmd=="set"){
$mem->set($key,$val,0,0);
}
else if($cmd=="delete"){
$mem->delete($key,0);
}
?>
可以看出只是针对memcache的几个基本操作
我们下面用ab测试工具做几组测试:(上nginx模块测试结果,下php代码测试结果)
A,100并发,10000请求,Set
[root@fedora nginx-1.1.12]# ab -c 100 -n 10000 http://127.0.0.1/bar?cmd=set&key=apple&val=fruits
[1] 27618
[2] 27619
[root@fedora nginx-1.1.12]# This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.1.12
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /bar?cmd=set
Document Length: 193 bytes
Concurrency Level: 100
Time taken for tests: 2.268 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Non-2xx responses: 10000
Total transferred: 3550000 bytes
HTML transferred: 1930000 bytes
Requests per second: 4409.82 [#/sec] (mean)
Time per request: 22.677 [ms] (mean)
Time per request: 0.227 [ms] (mean, across all concurrent requests)
Transfer rate: 1528.79 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 2.5 1 27
Processing: 9 21 4.8 20 37
Waiting: 7 20 5.2 20 36
Total: 14 22 4.8 21 45
Percentage of the requests served within a certain time (ms)
50% 21
66% 22
75% 25
80% 27
90% 30
95% 32
98% 34
99% 35
100% 45 (longest request)
访问很迅速,因为是本地测试的缘故,成功率也达到100%。
[root@fedora nginx-1.1.12]# ab -c 100 -n 10000 http://127.0.0.1/memc.php?cmd=set&key=pear&val=fruits
[1] 27789
[2] 27790
[root@fedora nginx-1.1.12]# This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.1.12
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /memc.php?cmd=set
Document Length: 164 bytes
Concurrency Level: 100
Time taken for tests: 9.590 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 3370000 bytes
HTML transferred: 1640000 bytes
Requests per second: 1042.71 [#/sec] (mean)
Time per request: 95.904 [ms] (mean)
Time per request: 0.959 [ms] (mean, across all concurrent requests)
Transfer rate: 343.16 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 3.4 0 40
Processing: 14 95 8.7 92 127
Waiting: 13 95 8.7 92 127
Total: 50 95 8.1 92 131
Percentage of the requests served within a certain time (ms)
50% 92
66% 93
75% 94
80% 97
90% 108
95% 116
98% 123
99% 124
100% 131 (longest request)
php的代码明显慢了许多,单个请求的处理时间大致为nginx模块的4到5倍
B,300并发,10000请求,Set
[root@fedora nginx-1.1.12]# ab -c 300 -n 10000 http://127.0.0.1/bar?cmd=set&key=bananp&val=fruits
[1] 28501
[2] 28502
[root@fedora nginx-1.1.12]# This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.1.12
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /bar?cmd=set
Document Length: 193 bytes
Concurrency Level: 300
Time taken for tests: 2.767 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Non-2xx responses: 10000
Total transferred: 3550000 bytes
HTML transferred: 1930000 bytes
Requests per second: 3613.84 [#/sec] (mean)
Time per request: 83.014 [ms] (mean)
Time per request: 0.277 [ms] (mean, across all concurrent requests)
Transfer rate: 1252.84 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 9.5 0 73
Processing: 20 35 7.1 32 67
Waiting: 18 35 7.1 32 67
Total: 20 37 13.1 32 107
Percentage of the requests served within a certain time (ms)
50% 32
66% 39
75% 41
80% 43
90% 46
95% 52
98% 96
99% 101
100% 107 (longest request)
[root@fedora nginx-1.1.12]# ab -c 300 -n 10000 http://127.0.0.1/memc.php?cmd=set&key=banane&val=fruits
[1] 28427
[2] 28428
[root@fedora nginx-1.1.12]# This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.1.12
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /memc.php?cmd=set
Document Length: 164 bytes
Concurrency Level: 300
Time taken for tests: 12.669 seconds
Complete requests: 10000
Failed requests: 151
(Connect: 0, Receive: 0, Length: 151, Exceptions: 0)
Write errors: 0
Non-2xx responses: 151
Total transferred: 3368188 bytes
HTML transferred: 1641359 bytes
Requests per second: 789.31 [#/sec] (mean)
Time per request: 380.076 [ms] (mean)
Time per request: 1.267 [ms] (mean, across all concurrent requests)
Transfer rate: 259.63 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 92 559.1 0 9024
Processing: 1 158 317.2 131 6605
Waiting: 1 158 317.2 131 6605
Total: 104 250 737.2 131 10480
Percentage of the requests served within a certain time (ms)
50% 131
66% 133
75% 141
80% 149
90% 167
95% 196
98% 3137
99% 3353
100% 10480 (longest request)
300的并发下,php代码的测试速度已经比较慢了,而且失败的请求数所占比有1.5%,虽然平均每个请求处理时间仍然为nginx模块的4到5倍,但是存在一些请求的相应非常慢,最长耗时请求是nginx模块的接近100倍
C,100并发,10000请求,Get
[root@fedora nginx-1.1.12]# ab -c 100 -n 10000 http://127.0.0.1/bar?cmd=get&key=bananp
[1] 28575
[root@fedora nginx-1.1.12]# This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.1.12
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /bar?cmd=get
Document Length: 193 bytes
Concurrency Level: 100
Time taken for tests: 2.577 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Non-2xx responses: 10000
Total transferred: 3550000 bytes
HTML transferred: 1930000 bytes
Requests per second: 3880.01 [#/sec] (mean)
Time per request: 25.773 [ms] (mean)
Time per request: 0.258 [ms] (mean, across all concurrent requests)
Transfer rate: 1345.12 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 2.1 0 29
Processing: 9 25 5.1 23 47
Waiting: 6 25 5.2 23 47
Total: 13 25 5.2 23 47
Percentage of the requests served within a certain time (ms)
50% 23
66% 25
75% 30
80% 31
90% 33
95% 35
98% 38
99% 41
100% 47 (longest request)
nginx模块的get相应也是很快,和set操作差不多
[root@fedora nginx-1.1.12]# ab -c 100 -n 10000 http://127.0.0.1/memc.php?cmd=get&key=bananp
[1] 28648
[root@fedora nginx-1.1.12]# This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.1.12
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /memc.php?cmd=get
Document Length: 164 bytes
Concurrency Level: 100
Time taken for tests: 10.220 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 3370000 bytes
HTML transferred: 1640000 bytes
Requests per second: 978.43 [#/sec] (mean)
Time per request: 102.205 [ms] (mean)
Time per request: 1.022 [ms] (mean, across all concurrent requests)
Transfer rate: 322.00 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 3.9 0 49
Processing: 18 101 9.4 98 133
Waiting: 17 101 9.4 98 133
Total: 57 102 8.7 98 145
Percentage of the requests served within a certain time (ms)
50% 98
66% 100
75% 102
80% 106
90% 117
95% 122
98% 126
99% 128
100% 145 (longest request)
D,300并发,10000请求,Get
[root@fedora nginx-1.1.12]# ab -c 300 -n 10000 http://127.0.0.1/bar?cmd=get&key=bananp
[1] 28757
[root@fedora nginx-1.1.12]# This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.1.12
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /bar?cmd=get
Document Length: 193 bytes
Concurrency Level: 300
Time taken for tests: 2.717 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Non-2xx responses: 10007
Total transferred: 3552485 bytes
HTML transferred: 1931351 bytes
Requests per second: 3680.52 [#/sec] (mean)
Time per request: 81.510 [ms] (mean)
Time per request: 0.272 [ms] (mean, across all concurrent requests)
Transfer rate: 1276.85 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 6 9.1 3 71
Processing: 7 32 14.9 28 468
Waiting: 6 29 15.3 25 468
Total: 17 37 18.5 33 469
Percentage of the requests served within a certain time (ms)
50% 33
66% 39
75% 43
80% 45
90% 51
95% 65
98% 99
99% 108
100% 469 (longest request)
下面是php的300并发的测试结果
[root@fedora nginx-1.1.12]# ab -c 300 -n 10000 http://127.0.0.1/memc.php?cmd=get&key=bananp
[1] 28878
[root@fedora nginx-1.1.12]# This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.1.12
Server Hostname: 127.0.0.1
Server Port: 80
Document Path: /memc.php?cmd=get
Document Length: 164 bytes
Concurrency Level: 300
Time taken for tests: 13.379 seconds
Complete requests: 10000
Failed requests: 149
(Connect: 0, Receive: 0, Length: 149, Exceptions: 0)
Write errors: 0
Non-2xx responses: 149
Total transferred: 3368212 bytes
HTML transferred: 1641341 bytes
Requests per second: 747.41 [#/sec] (mean)
Time per request: 401.385 [ms] (mean)
Time per request: 1.338 [ms] (mean, across all concurrent requests)
Transfer rate: 245.84 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 86 562.4 0 9027
Processing: 1 169 365.5 134 7848
Waiting: 1 169 365.5 134 7848
Total: 82 255 777.1 136 10853
Percentage of the requests served within a certain time (ms)
50% 136
66% 145
75% 159
80% 167
90% 194
95% 222
98% 3009
99% 3162
100% 10853 (longest request)
可以看出效率的差距也是比较明显的,而且失败的请求也有1.5%左右。(而在500并发的测试下php连接memcache就有点力不从心了,测试经常崩溃掉)
从上面的几组测试可以看出nginx的高并发低延迟的性能是非常明显的,而且较短的时间内响应可以减轻服务器的cpu负担,我们在测试过程中可以通过vmstat看到cpu资源经常被耗尽,都是满速在运转。
memc-nginx-module这个模块提供了get,set,add,replace,append,delete,flush_all,stats等常用memcache操作指令的支持,所以还是功能比较完整的模块,值得推广使用。