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

相關文章
相關標籤/搜索