Ubuntu 18 locust 压测 Node 服务

简介: Ubuntu 18 locust 压测 Node 服务

ocust 官网: www.locust.io/

安装 locust

pip install locust

$ python3 -V
Python 3.6.9
$ pip -V
pip 20.1.1 from /home/w/.local/lib/python3.6/site-packages/pip (python 3.6)
$ pip install locust
...
$ locust -V 
locust 1.0.3

测试脚本

locustfile.py

import random
from locust import HttpUser, task, between, constant
class QuickstartUser(HttpUser):
    # wait_time = constant(0.01)
  wait_time = between(5, 9)
  @task
  def get_users(self):
    print("get_users")
    name = "get_users"
    url = "/api/v1/users_manage"
    params = {}
    headers = {}
    res = self.client.get(url=url, headers=headers, params=params, verify=False, name=name)
  @task
  def get_user_info(self):
    print("get_user_info")
    name = "get_user_info"
    url = "/api/v1/user_info"
    params = {}
    headers = {}
    self.client.get(url=url, headers=headers, params=params, verify=False, name=name)
  def on_start(self):
    # response = self.client.post("/api/v1/login", {"phone": "13912345678", "password": "12345678"})
    print("start")

运行测试脚本

运行 locustfile.py 测试脚本文件

locust

locust -f locustfile.py

没有 webui 界面执行压测

locust -f locustfile.py --headless -u 100 -r 10 --run-time 5m --host http://192.168.199.172:3000 --stop-timeout 99

--headless 直接开始测试而不使用Web界面

-u 要产生的用户数

-r 每秒添加的用户数

--run-time 测试运行时间

--host IP地址

--stop-timeout 测试运行时间完成后,延迟99s再关闭整个任务

服务端

运行 Node 服务,接口返回静态数据

node server.js

server.js

let express = require('express')
let app = express()
let bodyParser = require('body-parser')
let fs = require('fs')
let multer = require('multer')
app.use(express.static('public'))
app.use(bodyParser.urlencoded({
  extended: false
}))
app.use(multer({
  dest: '/tmp/'
}).array('file'))
let cors = require('cors')
app.use(cors())
//  get /
app.get('/', (req, res) => {
  res.sendFile(__dirname + '/index.html')
})
// get users
app.get('/api/v1/users_manage', async (req, res) => {
  let data = [
    {
      user_id: 1,
      username: 'admin',
      password: '12345678',
      nickname: 'admin user'
    },
    {
      user_id: 2,
      username: 'aaa',
      password: '12341234',
      nickname: 'aaa user'
    }
  ]
  console.log('1')
  await new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('2s .')
      resolve()
    }, 2000)
  })
  res.end(JSON.stringify(data))
})
// get users
app.get('/api/v1/user_info', async (req, res) => {
  let data = {
    user_id: 1,
    username: 'admin',
    password: '12345678',
    nickname: 'admin user'
  }
  console.log('3')
  await new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('3s .')
      resolve()
    }, 3000)
  })
  res.end(JSON.stringify(data))
})
app.post('/api/v1/login', (req, res) => {
  let data = {
    status: 1
  }
  res.end(JSON.stringify(data))
})
// post 403
app.post('/post_403', (req, res) => {
  res.status(403).send({ error: 'Permission denied' });
})
// post test
app.post('/post_test', (req, res) => {
  console.log('post')
  let data = {
    'post_data': '123'
  }
  console.log('123')
  // res.end(JSON.stringify(data))
  res.end('123')
})
// put file_upload
app.put('/file_upload_put', (req, res) => {
  console.log('file_upload_put')
  let des_file = __dirname + '/public/images/' + req.files[0].originalname
  console.log('des_file: ', des_file)
  fs.readFile(req.files[0].path, (err, data) => {
    fs.writeFile(des_file, data, (err) => {
      if (err) {
        console.log(err)
      } else {
        response = {
          message: 'File Upload Success!',
          filename: req.files[0].originalname
        }
      }
      res.end(JSON.stringify(response))
    })
  })
})
// post file_upload
app.post('/file_upload', (req, res) => {
  console.log('file')
  // console.log(JSON.stringify(req))
  console.log(req.body)
  let file = req.files[0]
  let size = file.size
  // size limit  10MB
  if (size > 10240000) {
    res.end('File beyond size limit !')
    return false
  }
  // let mimetypeFlag = 0
  // let mimetypeArray = ['image/bmp', 'image/gif', 'image/jpeg', 'image/svg+xml', 'image/tiff', 'image/png']
  // let mimetype = file.mimetype
  // for (let i = 0; i < mimetypeArray.length; i++) {
  //   if (mimetype === mimetypeArray[i]) {
  //     mimetypeFlag = 1
  //   }
  // }
  // if (mimetypeFlag === 0) {
  //   res.end('Documents must be image format !')
  //   return false
  // }
  let des_file = __dirname + '/public/images/' + req.files[0].originalname
  fs.readFile(req.files[0].path, (err, data) => {
    fs.writeFile(des_file, data, (err) => {
      if (err) {
        console.log(err)
      } else {
        response = {
          message: 'File Upload Success!',
          filename: req.files[0].originalname
        }
      }
      res.end(JSON.stringify(response))
    })
  })
})
let server = require('http').createServer(app)
server.listen(3000, (req, res) => {
  let host = server.address().address
  let port = server.address().port
  console.log('server is running .  http://%s:%s', host, port)
})

package.json

{
  "name": "fileserver",
  "version": "1.0.0",
  "description": "File server project",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "gyw",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.2",
    "cookie-parser": "^1.4.3",
    "cors": "^2.8.5",
    "express": "^4.16.2",
    "express-session": "^1.15.6",
    "multer": "^1.3.0",
    "request": "^2.83.0",
    "serve-index": "^1.9.1",
    "serve-static": "^1.13.1",
    "socket.io": "^2.0.3"
  }
}

指标分析

施压端(测试机)

RPS: 吞吐量, 每秒钟系统可以处理的请求数、任务数

RPS(Requests Per Second) = 并发数 / 响应时间

注意

使用 locust 测试过程中,在压力机性能瓶颈范围内可以通过调整用户数和脚本 wait_time 参数来测试 RPS 值,超过压力机性能范围后 RPS 数值无法继续变大

被测端(服务端)

TPS(Transactions Per Second)事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数

并发数 = RPS * 响应时间

参考链接:

www.mamicode.com/info-detail…

blog.csdn.net/weixin_3067…

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
相关文章
|
2月前
|
Ubuntu 数据安全/隐私保护
在Ubuntu系统中增加Openfire服务设置和管理
至此,你已经完成了在Ubuntu中增加Openfire服务的设置和管理。希望你在这个过程中,能像享受一场摇滚音乐会一样,体验编程的乐趣和成就感。祝你玩得开心!
92 27
|
2月前
|
存储 运维 Ubuntu
Ubuntu环境下NTP时间同步服务的离线安装方法
以上就是Ubuntu环境下离线安装和配置NTP时间同步服务的全过程。这种有效的操作不仅可为有网络隔离需求的安全重要环境提供参考,同时也能帮助研发、运维人员在同类情况下处理问题。太阳走过万丈高空,而我们通过NTP服务,轻松把握时间,如同手握流沙,控制每一颗时间粒子的行走。
475 23
|
10月前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实战指南
【9月更文挑战第6天】在数字化时代的潮流中,后端开发作为支撑现代Web和移动应用的核心,其重要性不言而喻。本文将深入浅出地介绍如何使用Node.js及其流行的框架Express来搭建一个高效、可扩展的后端服务。通过具体的代码示例和实践技巧,我们将探索如何利用这两个强大的工具提升开发效率和应用性能。无论你是后端开发的新手还是希望提高现有项目质量的老手,这篇文章都将为你提供有价值的见解和指导。
|
11月前
|
存储 负载均衡 监控
检索服务elasticsearch节点(Node)
【8月更文挑战第23天】
133 5
|
11月前
|
JavaScript 前端开发 中间件
构建高效后端服务:Node.js与Express框架的完美搭档
【8月更文挑战第28天】在追求高性能、可扩展和易维护的后端开发领域,Node.js和Express框架的组合提供了一种轻量级且灵活的解决方案。本文将深入探讨如何利用这一组合打造高效的后端服务,并通过实际代码示例展示其实现过程。
|
9月前
|
消息中间件 监控 Ubuntu
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
267 3
大数据-54 Kafka 安装配置 环境变量配置 启动服务 Ubuntu配置 ZooKeeper
|
10月前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
115 0
Node服务连接Mysql数据库
|
11月前
|
监控 JavaScript 前端开发
深入浅出Node.js: 打造高效的后端服务
【8月更文挑战第27天】在这个数字化飞速发展的时代,后端技术成为支撑互联网服务的基石。Node.js作为其中的佼佼者,以其非阻塞I/O模型、事件驱动架构和丰富的生态系统,赢得了开发者的青睐。本文将带领读者深入理解Node.js的核心概念,通过实际案例分析其应用模式,并探讨如何利用Node.js构建高效、可扩展的后端服务。无论你是初学者还是有经验的开发者,都能在这篇文章中找到提升你的Node.js技能的灵感和知识。
|
11月前
|
Web App开发 JavaScript 中间件
构建高效后端服务:Node.js与Express框架的深度整合
【8月更文挑战第27天】 在现代Web开发中,后端服务的高效性至关重要。本文深入探讨了如何利用Node.js的非阻塞I/O特性和Express框架的简洁性来打造高性能的后端服务。我们将通过具体案例,展示如何在不牺牲代码可读性和可维护性的前提下,实现高效的请求处理和服务端逻辑。文章旨在为开发者提供一个清晰的指导,帮助他们在构建后端服务时做出更明智的技术选择。