Ubuntu 18 locust 压测 Node 服务

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 使用 locust 测试过程中,在压力机性能瓶颈范围内可以通过调整用户数和脚本 wait_time 参数来测试 RPS 值,超过压力机性能范围后 RPS 数值无法继续变大。TPS(Transactions Per Second)事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

locust 官网: 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进行规格选择与性能压测。
目录
相关文章
|
29天前
|
Web App开发 JavaScript 前端开发
构建高效后端服务:Node.js与Express框架的实战指南
【9月更文挑战第6天】在数字化时代的潮流中,后端开发作为支撑现代Web和移动应用的核心,其重要性不言而喻。本文将深入浅出地介绍如何使用Node.js及其流行的框架Express来搭建一个高效、可扩展的后端服务。通过具体的代码示例和实践技巧,我们将探索如何利用这两个强大的工具提升开发效率和应用性能。无论你是后端开发的新手还是希望提高现有项目质量的老手,这篇文章都将为你提供有价值的见解和指导。
|
27天前
|
测试技术 数据库 UED
Python 性能测试进阶之路:JMeter 与 Locust 的强强联合,解锁性能极限
【9月更文挑战第9天】在数字化时代,确保软件系统在高并发场景下的稳定性至关重要。Python 为此提供了丰富的性能测试工具,如 JMeter 和 Locust。JMeter 可模拟复杂请求场景,而 Locust 则能更灵活地模拟真实用户行为。结合两者优势,可全面评估系统性能并优化瓶颈。例如,在电商网站促销期间,通过 JMeter 模拟大量登录请求并用 Locust 模拟用户浏览和购物行为,可有效识别并解决性能问题,从而提升系统稳定性和用户体验。这种组合为性能测试开辟了新道路,助力应对复杂挑战。
51 2
|
2月前
|
存储 负载均衡 监控
检索服务elasticsearch节点(Node)
【8月更文挑战第23天】
47 5
|
2月前
|
JavaScript 前端开发 中间件
构建高效后端服务:Node.js与Express框架的完美搭档
【8月更文挑战第28天】在追求高性能、可扩展和易维护的后端开发领域,Node.js和Express框架的组合提供了一种轻量级且灵活的解决方案。本文将深入探讨如何利用这一组合打造高效的后端服务,并通过实际代码示例展示其实现过程。
|
2月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【8月更文挑战第5天】性能测试确保应用高负载下稳定运行。Apache JMeter与Locust是两大利器,助力识别解决性能瓶颈。本文介绍这两款工具的应用与优化技巧,并通过实战示例展示性能测试流程。首先,通过JMeter测试静态与动态资源;接着,利用Locust的Python脚本模拟HTTP请求。文中提供安装指南、命令行运行示例与性能优化建议,帮助读者掌握性能测试核心技能。
94 0
|
11天前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
25 0
Node服务连接Mysql数据库
|
26天前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
【9月更文挑战第10天】随着软件应用的不断扩展,性能测试成为确保系统稳定运行的关键环节。本文通过对比Apache JMeter和Locust,探讨了如何在Python环境中利用这两款工具挖掘更多性能测试潜力。JMeter是一款成熟且功能强大的开源工具,支持多种协议,适用于各种应用的测试;而Locust则基于Python,通过简单脚本模拟HTTP请求,更适合Web应用测试。
59 2
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【9月更文挑战第5天】性能测试是确保应用在高负载下稳定运行的关键。本文介绍Apache JMeter和Locust两款常用性能测试工具,帮助识别并解决性能瓶颈。JMeter适用于测试静态和动态资源,而Locust则通过Python脚本模拟HTTP请求。文章详细讲解了安装、配置及使用方法,并提供了实战案例,帮助你掌握性能测试技巧,提升应用性能。通过分析测试结果、模拟并发、检查资源使用情况及代码优化,确保应用在高并发环境下表现优异。
47 5
|
28天前
|
消息中间件 监控 测试技术
惊呆了!Python性能测试高手都用这些神器:JMeter+Locust,效率翻倍📈
【9月更文挑战第8天】在软件开发中,性能测试对确保应用稳定性和高效运行至关重要。对于Python开发者而言,选择合适的性能测试工具能显著提升测试效率并精准定位性能瓶颈。本文深入探讨了JMeter和Locust这两款工具的独特优势。JMeter作为跨平台的性能测试工具,支持多种协议,具备高度可定制性和扩展性;而Locust则专为Python应用设计,利用协程实现高并发,提供实时监控和分布式测试功能。两者结合使用,可在实际项目中实现1+1&gt;2的效果,帮助开发者构建全面高效的测试方案,保障应用稳定运行。
65 1
|
1月前
|
测试技术 Apache 数据库
从慢如蜗牛到飞一般的感觉!Python性能测试实战,JMeter&Locust助你加速🏃‍♂️
【9月更文挑战第6天】你的Python应用是否曾因响应缓慢而让用户望而却步?借助JMeter与Locust,这一切将迎刃而解。JMeter作为Apache基金会的明星项目,以其强大的跨平台和多协议支持能力,成为性能测试领域的魔法师;而Locust则以Python的简洁与高效,让性能测试更加灵活。通过实战演练,你可以利用这两款工具轻松识别并解决性能瓶颈,优化数据库查询、网络配置等,最终使应用变得敏捷高效,轻松应对高并发挑战。
15 1
下一篇
无影云桌面