文档章节

Node.JS vs PHP CLI Server 简单的HTTP服务器性能测试

eechen
 eechen
发布于 2015/01/19 22:02
字数 755
阅读 3710
收藏 17
环境:64位Ubuntu14.04,i5-3230M
PHP5.4.31 with ZendOPcache
Node.JS 0.10.35

Node.JS 测试

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'});
    res.write('<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Node测试</title></head><body>'+new Date().getTime()+'</body></html>');
    res.end();
}).listen(8082, '127.0.0.1');

运行程序:
node t.js
查看系统CPU空闲率:
sar 1
压力测试,并发100,完成10万请求:
ab -c100 -n100000 http://127.0.0.1:8082/
内存从11MB涨到61MB,系统CPU空闲率65%, RPS达到6049.
RPS即Requests per second,每秒处理的请求数,越大越好.

提示:点击图片,查看原图。






PHP CLI Server 测试

<?php header('Content-Type: text/html;charset=UTF-8'); ?>
<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>PHP测试</title></head><body><?php echo time(); ?></body></html>

运行程序:
php -S 127.0.0.1:8081 -t ./
查看系统CPU空闲率:
sar 1
压力测试,并发100,完成10万请求:
ab -c100 -n100000 http://127.0.0.1:8081/t.php
内存从19.6MB涨到20.0MB,系统CPU空闲率57%, RPS达到11405.
不开启OPCACHE时,内存从8.3MB涨到9.0MB,系统CPU空闲率57%,RPS达到8851.






PHP Swoole 测试

<?php
$http = new swoole_http_server("0.0.0.0", 9501);
$http->set([
    'worker_num' => 5 //开启5个工作进程
]);
$http->on('request', function (swoole_http_request $request, swoole_http_response $response) {
    $response->header('Content-Type', 'text/html;charset=UTF-8');
    $response->end('<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>PHP测试</title></head><body>'.time().'</body></html>');
});
$http->start();

运行程序:
php swoole.php
查看系统CPU空闲率:
sar 1
压力测试,并发1000,完成20万请求:
ab -c1000 -n200000 http://127.0.0.1:9501/
测试过程中系统CPU空闲率39%, RPS达到17554.


结论:Node.JS和PHP CLI Server都是单进程处理 HTTP 请求,但RPS上PHP几乎是Node.JS的两倍,内存占用上PHP却只有Node.JS的1/3。Node.JS值得称道的是,系统CPU空闲率要比PHP高8%左右。PHP Swoole应用了多进程和多线程,RPS近18K,充分利用了多核,所以CPU空闲率也是三者中最低的。另外,PHP-FPM虽然不支持HTTP协议,但其处理PHP请求的性能并不会比PHP CLI Server差,而且PHP-FPM可以开启多个工作进程,充分利用多核。

附加测试: 连接Redis的get/set测试

1. Apache 2.4.10 mpm_prefork_module 一个工作进程,使用pecl install redis安装Redis客户端.
<?php
header('Content-Type: text/html;charset=UTF-8');
$redis = new Redis();
$redis->pconnect('127.0.0.1', 6379);
$redis->set('time_php', time());
$redis->get('time_php');
?>
<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>PHP测试</title></head><body><?php echo time(); ?></body></html>

测试: CPU空闲率在65%, RPS达到5140.
ab -c100 -n50000 http://127.0.0.1:8080/redis.php


2.Node.JS,使用npm install redis安装Redis客户端.
var redis  = require('redis');
var client = redis.createClient('6379', '127.0.0.1');
var http   = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'});
    res.write('<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Node测试</title></head><body>'+new Date().getTime()+'</body></html>');
    client.set("time_node", new Date().getTime(), function (err, reply) {
        client.get("time_node");
    });    
    res.end();
}).listen(8082, '127.0.0.1');

测试: CPU空闲率在65%, RPS达到5369.
ab -c100 -n50000 http://127.0.0.1:8082/


也就是说,就算在Apache老式的Prefork面前,Node.JS(RPS 5369)对比PHP(RPS 5140)的性能优势也不明显.别忘了,Apache还是一个经典的完备的HTTP服务器.

© 著作权归作者所有

共有 人打赏支持
eechen

eechen

粉丝 1004
博文 107
码字总数 55962
作品 1
深圳
私信 提问
加载中

评论(28)

mark35
mark35

引用来自“june-映君”的评论

请问你的MEM查看内存使用的命令是不是自己写的

引用来自“eechen”的评论

在~/.bashrc里加 mem () { top -n1 -b | head -n7 | sed '1,6d' && top -n1 -b | sed '1,7d' | grep --color=auto $1 } 然后 source ~/.bashrc 或者重新打开终端就可以了.
应该是用别名吧 alias mem=' top -n1 -b | head -n7 | sed '1,6d' && top -n1 -b | sed '1,7d' | grep --color=auto $1'
eechen
eechen

引用来自“june-映君”的评论

请问你的MEM查看内存使用的命令是不是自己写的
在~/.bashrc里加 mem () { top -n1 -b | head -n7 | sed '1,6d' && top -n1 -b | sed '1,7d' | grep --color=auto $1 } 然后 source ~/.bashrc 或者重新打开终端就可以了.
yifon
yifon
请问你的MEM查看内存使用的命令是不是自己写的
0Scn
0Scn

引用来自“O油菜”的评论

你在搞笑吧,拿异步语言测试同步性能,你难道不知道php直接缓存掉页面?脑子被踢了?
弄一个返回随机数的页面重测,这数据蛋意义都没有。
+1
0Scn
0Scn

引用来自“penngo”的评论

io少的情况下,应该是这样的测试结果。

引用来自“eechen”的评论

网络I/O也是I/O,为什么说I/O少呢?

引用来自“AGF”的评论

IO指的是程序和外部系统之间的IO,比如说连接mysql,请求redis等。PHP是顺序执行的,当执行到外部IO的时候它只能等待,而nodejs是基于eventloop的,在外部IO的时候可以直接执行下一个事件。两者性能差距不是以道理计的。你这个测试完全没测到重点。
所以楼主可以换套写法体验下。 接受请求-->随机写个一两百KB的文件到磁盘上-->再从磁盘上读取这个文件-->响应中返回这个文件字符串内容 。
O油菜
O油菜
你在搞笑吧,拿异步语言测试同步性能,你难道不知道php直接缓存掉页面?脑子被踢了?
弄一个返回随机数的页面重测,这数据蛋意义都没有。
eechen
eechen

引用来自“qijingq”的评论

你确定你测的这是PHP不Apache?
PHP CLI Server 和 PHP Swoole 跟 Apache 一点关系都没有。加上 Apache + MOD_PHP 只是评论里有人需要。
qijingq
qijingq
你确定你测的这是PHP不Apache?
eechen
eechen

引用来自“北河”的评论

有失偏颇,nodejs执行的时候的单进程单线程的.在多核CPU下,只使用了一个核心,可否使用下面代码进行测试下.
评论里无法贴代码,发到我博客上了.http://my.oschina.net/itbeihe/blog/371023
文中的PHP CLI Server也是单核心单线程的,还有Apache Prefork我也配置了单个工作进程,所以说测试还是很公平的,从CPU空闲率也可以看得出来.
北河
北河
有失偏颇,nodejs执行的时候的单进程单线程的.在多核CPU下,只使用了一个核心,可否使用下面代码进行测试下.
评论里无法贴代码,发到我博客上了.http://my.oschina.net/itbeihe/blog/371023
swoole-1.7.7 发布,Http 服务器性能大幅提升

swoole-1.7.7 发布,内置Http服务器性能是Node.js的12倍 PHP的异步并发扩展swoole发布了 1.7.7 版本,此版本主要有: 增加对cygwin环境的支持 增加单次定时器的after接口 onClose事件调整为在...

matyhtf
2014/10/28
9K
65
swoole 1.7.13 发布,增加对 ARM 平台的支持

PHP的异步并行网络扩展 swoole 1.7.13 版本已发布,此版本现已提供下载: http://pecl.php.net/package/swoole https://github.com/swoole/swoole-src/releases/tag/swoole-1.7.13-stable 主......

matyhtf
2015/03/19
6.5K
15
巨头终极对决,Apache、Nginx 与 Node.js 之争

巨头之间的终极对决:崛起的新星 Node.js 能否战胜巨人 Apache 和 Nginx?WordPress 与 Ghost 的性能大对决! 我和你一样,都阅读过大量散布在互联网各处的意见或事实,其中有一些我认为是可...

局长
2016/12/02
9.8K
37
Node.js到底强在哪里?

PHP VS NODE.JS: THE REAL STATISTICS一文用PHP和Node.js实现文件读写的案例展示两者性能对比, 两者相差14倍之多。究其原因还是Node.JS的异步IO。 I/O是Web应用典型的消耗瓶颈,当一个请求达...

大糊涂
2015/06/20
0
0
Node.js之HTTP/2服务器推送

译者按: 盆友们,是时候拥抱新一代HTTP协议了! 译者:Fundebug 原文:HTTP/2 Server Push with Node.js Node.js 8.4.0已经开始支持HTTP/2,执行node命令时,加上选项就可以使用了。 在这篇...

Fundebug
2018/04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

带标题的图片轮询展示

<div> <table width="671" cellpadding="0" cellspacing="0"> <tr height="5"> <td style="background-image:url(include/image/news_left_top_circle.jpg)" width="7"> </td> <td style="ba......

JackChenzp
30分钟前
0
0
Hanlp中N最短路径分词详细介绍

N-最短路径 是中科院分词工具NLPIR进行分词用到的一个重要算法,张华平、刘群老师在论文《基于N-最短路径方法的中文词语粗分模型》中做了比较详细的介绍。该算法算法基本思想很简单,就是给定...

左手的倒影
38分钟前
1
0
es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

面试题 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 面试官心理分析 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好...

架构师springboot
39分钟前
7
0
php面试题常见面试题

又是跳槽季,跳槽就有面试,面试难免会问一些理论问题,前面面试了几家,做了一些面试题,记住了一部分,整理了一下: 1.cookie 和session区别 session存在服务器,cookie存在浏览器;sessi...

后盾风云
44分钟前
3
0
华为Mate X显示适配指导来了!带你完美适配折叠屏

华为Mate X一经发布便引发了世界级的关注,除了史无前例的交互体验外,作为一款可以变形的手机,它还拥有多种不同的形态:展开时是8英寸全面屏,折叠后又变身为6.6英寸和6.38英寸两块屏幕。 ...

安卓绿色联盟
55分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部