需求很简单,就是提供一个服务接口收集端上传来的日志文件并保存,要求能承受的QPS为5000。

以前从来都没考虑过Node服务的负载能力,用 koa + co-busboy 接受上传文件请求并用 fs 直接写文件开发完服务并用 pm2 进行进程管理,总觉得心里不踏实,便开始在服务器上,测试 Node 服务的负载能力。

服务器信息:

系统:CentOS release 6.7

CPU:48核

压测命令:(在另一台服务器上运行命令)

siege -c  -b -t 1m -l test.log http://xxx.xxx.xxx.xxx:3001 > siege.log

测试简单 Node 服务负载:(使用简陋的方法统计QPS的大概值)

server.js

 let http = require('http');
let count = 0,
start_timestamp = new Date().getTime(); let server = http.createServer((req, res) => {
try {
let cur_timestamp = new Date().getTime();
count++;
if (cur_timestamp - start_timestamp >= 1000) {
console.log(count);
start_timestamp = cur_timestamp;
count = 0;
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('hello world');
} catch (e) {
console.log(`err: ${e.message}`);
}
});
server.listen(3001);
console.log('run on 3001');

压测结果:

使用两台不同的服务器同时运行压测命令得到的结果:

如图可看出在服务器上单进程 Node 服务的性能极限,那么换成 koa 再来测一下会有什么结果呢?

server_koa.js

 const Koa = require('koa');
const app = new Koa(); let count = 0,
start_timestamp = new Date().getTime(); app.use(async (ctx) => {
try {
let cur_timestamp = new Date().getTime();
count++;
if (cur_timestamp - start_timestamp >= 1000) {
console.log(count);
start_timestamp = cur_timestamp;
count = 0;
}
ctx.body = 'hello world';
} catch (e) {
console.log(`err ${e.message}`);
}
}); app.listen(3001);
console.log('run on 3001');

看来用 Koa 的话对极限QPS的影响还是比较大的

如果使用 pm2 管理简单服务,结果如何?

左图为 pm2 使用 1 个实例,右图为使用 4 个实例,可以明显看到实例增加能大大提高程序负载能力,但是使用 2 台机器压测的结果却是这样:

有点奇怪了,照理来说 4 个实例的处理能力怎么说加起来应该远超过 1w 才对,试着加大实例数量到 48,再用 2 台机器压测结果如下:

提升的效果不是很让人满意,使用 3 台机器压测结果:

即使在 48 核的服务器上开了 48 个进程来跑,极限 QPS 也止步 1w。值得注意的是在 48 核的服务器上用 pm2 来跑 server_koa.js,极限 QPS 与跑 server.js 相近,都是略小于 1w。这说明此时极限 QPS 已经不是制约在服务代码实现上,而应该从 Node 底层实现寻找答案,在网上找了半天找到这篇博客干货比较多:http://taobaofed.org/blog/2015/10/29/deep-into-node-1/

由于 Node 的文件 I/O、事件循环的通知是 Libuv 维护的线程池来操作,且默认线程池的大小是 4,那么通过修改线程池大小 UV_THREADPOOL_SIZE 会发生什么现象呢?在 server.js 最顶上添加代码:

process.env.UV_THREADPOOL_SIZE = 64;

压测结果如下:

结果没有明显变化。这是因为 Linux 下,网络 I/O 采用的是 epoll 异步模型,不是通过线程池的方式处理。

如何修改 epoll 的参数来提升极限QPS呢?

Node负载能力测试的更多相关文章

  1. node相关--测试

    测试: assert模块; //node自带 var assert = require('assert'); var now = Date.now(); console.log(now); asser ...

  2. node压力测试

    压力测试 ab测试(ApacheBench); 介绍: 这是apache提供的压测工具; 使用: 启动node服务; 我用的XAMPP,进入bin文件夹,打开命令行,执行下面命令: // -n: 总请 ...

  3. 添加 node mocha 测试模块

    1.mocha  支持TDD 和 BDD两种测试风格 2.引用assert模块  此模块是node的原生模块,实现断言的功能,作用是声明预期的结果必须满足 3.mocha测试用例中可以使用第三方测试库 ...

  4. 四步完成NodeJS安装,配置和测试

    四步完成NodeJS安装,配置和测试 NodeJS 官网地址: http://nodejs.org/ 第一步:在官网点击 ’ INSTALL ’,下载相应的版本(我的机器是Win7专业版 64bit) ...

  5. Node.js 初探

    概念 Node.js 是构建在Chrome javascript runtime之上的平台,能够很容易的构建快速的,可伸缩性的网络应用程序.Node.js使用事件驱动,非阻塞I/O 模式,这使它能够更 ...

  6. 玩转Node.js单元测试

    代码部署之前,进行一定的单元测试是十分必要的,这样能够有效并且持续保证代码质量.而实践表明,高质量的单元测试还可以帮助我们完善自己的代码.这篇博客将通过一些简单的测试案例,介绍几款Node.js测试模 ...

  7. NPM(Node.js) 使用介绍

    前言:express 推出了4.X,自己尝试了一下,出现了各种问题.结果查看了各种文档和问题,现在在这个给大家分享下4.X版本的安装. NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具, ...

  8. node服务成长之路

    我们的系统也从第一代平台开始到现在第四代平台更换中,对这四代平台做一个简单的介绍: 第一代平台,主要是集中式,以快速上线为目的:第二代平台主要是分布式改造,缓解各服务压力:第三代平台主要做服务端SOA ...

  9. node.js爬虫

    这是一个简单的node.js爬虫项目,麻雀虽小五脏俱全. 本项目主要包含一下技术: 发送http抓取页面(http).分析页面(cheerio).中文乱码处理(bufferhelper).异步并发流程 ...

随机推荐

  1. DataUml Design 教程5-代码模板介绍(甚于T4模板技术)

    DataUml Design 代码模板全然基于C#语言来编写的. 不懂写模板的能够请教作者,随时欢迎. 以下是一段模板代码,这段代码能够获取一个类结构的全部信息.             <#@ ...

  2. 001-spring结合quartz使用

    一.添加pom 二.定义业务类 public class TestJobTask{ /** *业务逻辑处理 */ public void service(){ /**业务逻辑*/ .. } } 二.配 ...

  3. mysql监控报警工具

    #!/usr/bin/env python # coding:utf-8 import MySQLdb import requests, json import time url = "ht ...

  4. 解释一下python中的成员运算符

    通过成员运算符‘in’ 和 ‘not in’,我们可以确认一个值是否是另一个值的成员 print('me' in 'disappointment')#True print('us' in 'disap ...

  5. NHibernate 配置增加代码感知

    Adding the Schema Include the schema in your Project, Solution, or Visual Studios XML Schemas folder ...

  6. Linux 进程管理 vmstat、top、pstree命令

    vmstat命令:监控系统资源 vmstat 是 Linux 中的一个综合性能分析工具,可以用来监控 CPU 使用.进程状态.内存使用.虚拟内存使用.磁盘输入/输出状态等信息.vmstat 命令格式如 ...

  7. [转]hadoop2.x常用端口及定义方法

    端口 Hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于RPC访问以及HTTP访问.而随着Hadoop周边组件的增多,完全记不住哪个端口对应哪个应用,特收集 ...

  8. 优秀 H5 案例收集 vol.3(不定期更新)

    上期浏览:Vol.1   Vol.2 爱的不同定义,五笔连成爱http://news.163.com/special/fdh5_valentines/ 世界华语悬疑文学大赛—下一位悬疑大师,就是你!h ...

  9. Apache 工作模式配置优化

    Apahce 工作模式配置 1.查看当前MPM工作模式 /usr/local/apache2/bin/apachectl -V Server version: Apache/2.4.27 (Unix) ...

  10. 在两台服务器之间建立信任关系解决scp,ssh等不用输入密码等问题

    A服务器(client)向B服务(server)SCP,SSH. A服务器:ssh-keygen -t rsa -C "kangzj" 一直回车. cd .ssh vim id_r ...