記一次Node接口性能測試

前言

突發奇想,想作一點Node應用的性能測試,本身也瞭解一些性能測試方面的知識,因而用Eggjs寫了一個簡單的註冊接口,進行了簡單的壓力測試.

原料

  • 開發框架: eggjs sequlize mysql
  • 服務器: 阿里雲 1核 1GB 1Mbps(最低配)
  • 測試工具: jmeter

註冊接口編寫

async login(ctx) { // 登陸
        ctx.validate(userRule);
    
        // 用戶校驗
        const { name, passwd } = ctx.request.body;
        let user = await ctx.model.User.findOne({
            where: { name: name }
        });
    
        if (user) { ctx.error(user.passwd === passwd, "密碼錯誤或暱稱已存在", 10001); }
        else { user = await ctx.model.User.create({ name: name, passwd: passwd }); }
    
        // 生成token和session並存儲
        const token = await ctx.service.token.genToken(user.id, ctx.request.ip);
        await app.redis.set(`${app.options.sessionPrefix}:${token.id}`, JSON.stringify({
            user: user.id,
            token: token.id
        }));
        ctx.cookies.set("access_token", token.id);
        ctx.jsonBody = user;
    }

接口邏輯很簡單,可見接口中僅有4個I/O操做,下面的性能測試就是針對這個接口.java

安裝並配置jmeter

  • 安裝jmeter(啓動時須要java環境,自行安裝)下載傳送門
  • 解壓jmeter後,啓動腳本路徑爲 apache-jmeter-3.3/bin/jmeter.bat
  • 啓動成功後界面
    clipboard.png
  • 下面開始配置測試用例
  1. 配置併發數入口
    clipboard.png
  2. 配置監聽器
    clipboard.png
  3. 添加http請求入口/cookie/header等信息
    clipboard.png
  4. 配置好後以下圖所示
    clipboard.png

接下來點擊開始按鈕進行測試.mysql

測試結果及其分析

  • 首先看下圖形測試結果:
    clipboard.pngredis

    圖表底部參數的含義以下:sql

    • 樣本數目:總共發送到服務器的請求數。
    • 最新樣本:表明時間的數字,是服務器響應最後一個請求的時間。
    • 吞吐量:服務器每分鐘處理的請求數。
    • 平均值:總運行時間除以發送到服務器的請求數。
    • 中間值:表明時間的數字,有一半的服務器響應時間低於該值而另外一半高於該值。
    • 偏離:服務器響應時間變化、離散程度測量值的大小,或者,換句話說,就是數據的分佈。
  • 聚合報告結果:
    clipboard.pngapache

    部分參數解釋:json

    • Samples: 本次場景中一共完成了多少個Transaction
    • Average: 平均響應時間
    • Median: 統計意義上面的響應時間的中值
    • 90% Line: 全部transaction中90%的transaction的響應時間都小於xx
    • Min: 最小響應時間
    • Max: 最大響應時間
    • PS: 以上時間的單位均爲ms
    • Error: 出錯率
    • Troughput: 吞吐量,單位:transaction/sec
    • KB/sec: 以流量作衡量的吞吐量
  • 服務器內存/cpu監控:
    clipboard.png
    clipboard.png
  • 總結(不知對否,胡言亂語一下):服務器

    1. 能夠看到在2000併發的狀況下,Node應用並無跑死,只是響應變得比較慢(機器配置有必定緣由)
    2. 經過服務器狀態的監控發現cpu資源的消耗低於內存的消耗(我的以爲應該是Node在處理請求時,異步I/O致使了內存消耗比較高)
    3. 感受用戶量不是很大的應用Node應該仍是能知足需求的(把集羣用上)
相關文章
相關標籤/搜索