java,netcore和nodejs api性能测试

一. 前言php

       做为有点经验的码农,如今退休在家带孩子。闲来无事,想对使用过的框架(若是写语言容易引战,php是世界上最好的语言)作一个性能测试。java

 

二. 背景node

      因为毕业后刚开始接触的编程语言是C#, 从aspx时代至mvc3, mvc4, 后来又出来netcore,见证了C#的掘起和没落(至少国内大环境不理想)。 因为大厂的示范效应加上java开源免费(如今oracle也要受权了),生态极好,因此使用spring boot开始编程,说实在的(不要喷),我我的仍是比较喜欢C#,由于语法糖太好用了, lambda,匿名函数匿名类,各种型之间的比较...。 因为nodejs的发明,使js变成先后端通吃的一门语言,异步单线程,事件驱动,适用于高并发的场景。 对于接触过的这些语言,我我的最喜欢js,由于弱类型,灵活。。。至于好或者很差,仁者见仁吧。平时一直在作码农也没时间去本身测试各类性能,如今正在赋闲,来测试一下我使用过的几个框架性能,也作一下比较。mysql

 

三. 框架说明web

     1. java如今最流行的web框架应该就是spring的全家桶套餐了,关于数据链接,我我的喜欢使用orm, 因此使用springboot + jpaspring

     2. netcore使用本身的mvc框架,数据库使用nhibernate, mvc+ nhibernatesql

     3. nodej 使用egg + typeorm数据库

 

四. 测试环境编程

     1. 服务器硬件:使用我2012年从原公司100块钱买的退役电脑当服务器,Dell OptiPlex 780,关键配置:CPU:Intel 酷睿2双核 E7500, 内存:8G(本身扩的8G)后端

     2. 服务器系统:服务器使用centos  7.7

初始使用为

 

     3. 数据库: mysql 8.5(放在个人测试机我的笔记本上,避免mysql影响其余框架

     4. 测试机(局域网内,TP-link百兆路由器链接, 本人笔记本)配置:  

 

 

     5. 各框架版本:

        1) java : 1.8 , spring boot 2.1.4, jpa 2.1.6

        2) netcore: 3.1,   nhibernate:5.2.7

        3) nodejs:v12.16.3,   egg:2.15.1     typeorm:0.2.24

五. 测试工具

     jmeter 5.1.1

 

六. 测试计划

     准备一张测试表

CREATE TABLE `db_test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`string_field` varchar(200) DEFAULT NULL,
`int_field` int(11) DEFAULT NULL,
`float_field` float DEFAULT NULL,
`create_time` timestamp NULL DEFAULT NULL,
`medium_string_field` mediumtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=585887 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

 

    1. 单项测试:

       1.1. 新增一条随机数据,因为带宽的缘由,不返回。, jmeter 线程数200 循环500次(10万次)

       1.2. 按id倒序 查询第1条数据,因为带宽的缘由,不返回。 jmeter 线程数200 循环500次(10万次)

       1.3. 新增一条随机数据,再删除掉, 因为带宽的缘由,不返回。jmeter 线程数200 循环500次(10万次)

       1.4. 随机建立1W个数字至数组,因为带宽的缘由,不返回。利用自身的排序进行正序排序, jmeter 线程数200 循环500次(10万次)

       1.5. 随机建立5W个数字至数组,因为带宽的缘由,不返回。利用自身的排序进行正序排序, jmeter 线程数200 循环500次(10万次)

       1.6. 随机建立10W个数字至数组,因为带宽的缘由,不返回。利用自身的排序进行正序排序, jmeter 线程数200 循环500次(10万次)

  1.7. 请求约0.1M的文件,jmeter 线程数200 循环500次(10万次, 因为网卡和路由器的缘由,不能在服务器上进行测试)

  1.8. 请求约1M的文件,jmeter 线程数200 循环500次(10万次, 因为网卡和路由器的缘由,不能在服务器上进行测试)

    2. 综合测试:将以上测试项(1.1- 1.6) 放在一块儿,分别测试并发200(200x1), 600(200x3), 1000(200x5),  5000(200x25), 10000(200x50)

    3. 用nodejs 写一个采集服务器数据的程序,每1秒采集一次服务器的CPU和内存的使用状况(经过centos的 top -b n 2 指令)插入至mysql数据库。表也放在测试机上。

CREATE TABLE `env_info` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL COMMENT '名称',
`cpu` decimal(10,3) DEFAULT NULL COMMENT 'CPU占有率',
`mem_private` bigint(20) DEFAULT NULL,
`mem_virtual` bigint(20) DEFAULT NULL,
`mem_usage` decimal(10,3) DEFAULT NULL,
`create_time` timestamp NULL DEFAULT NULL COMMENT '建立时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=51119 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

 

七. 测试指标

    1. jmeter聚合报告

    2. 资源占用(均为最高占用, 不是平均值)

 

 

 

八. 测试代码

      若是须要,能够给我发文件索取:lei_xu@163.com

 

九. 测试结果

1. jmeter聚合报告

 

    2. 资源占用(均为最高占用, 不是平均值)

 

 

十. 结论

 

 1. 从资源占用来看CPU都占满了, 但内存使用状况: java> dotnet > nodejs。

 2. 单表数据库操做,

     2.1. 吞吐量 nodejs > java > dotnet , nodejs 的吞吐量几乎是java的2倍;

     2.2. 平均值和中位数: nodejs > java > dotnet , nodej 几乎是java的1/2,说明nodejs的响应时间最少

     2.3. 标准误差: java > nodejs > dotnet, java 相对其余框架更平稳。

     2.4. 异常率:nodejs 在查询时出现了异常,未查缘由

    综上, nodejs 在小数据转发上具备先天优点,低消耗,转发能力最强,可是java更平稳。

3. 密集运算(排序)

    3.1. 吞吐量 java> nodejs > dotnet, 但随着数据量增多,nodejs和java的吞吐量愈来愈相近(?

    3.2. 平均值和中位数: java> nodejs> dotnet, 但随着数据量增多, nodejs和java的平均值和中位数愈来愈相近(?)

    3.3. 标准误差:nodejs > java> dotnet , nodejs 标准误差与其余两个不是一个量级,说明nodejs慢的比较平稳

    3.4. 异常率:sort1W时,java出现了异常,未查缘由

   综上, 密集运算java相对比较强势, nodejs表现中规中矩,相对更平稳。

4. 综合并发 

    4.1. 吞吐量 java> nodejs > dotnet, java几乎是nodejs的两倍

    4.2. 平均值和中位数: java> nodejs> dotnet, java几乎是nodejs的1/2。 

    4.3. 标准误差:java > nodejs> dotnet , java更平稳, 但随着并发数增高,java与nodejs相差不大,nodejs相对也平稳。

    4.4. 异常率:dotnet出现了异常。

   综上, 综合并发上java表现最突出,且运行相对平稳. nodejs因为先天的不足,只有java的1/2, 但运行平稳。 

 

综合以上简单的测试,

java springboot资源占用率最高(多是设置的), 综合吞吐量最高,运行也最平稳。综合表现最好.

nodejs egg资源占用率最低, 转发小规模数据表现亮眼,符合nodejs自己的特性,因为密集运算的拖累,综合表现不及java, 因此nodejs能够运用在数据转发方面。

dotnet mvc太令我失望了(多是框架搭的很差)

 

 

原创,转载请联系:lei_xu@163.com

相关文章
相关标签/搜索