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进行规格选择与性能压测。
相关文章
|
1月前
|
Ubuntu Java 测试技术
【Linux】一站式教会:Ubuntu(无UI界面)使用apache-jmeter进行压测
【Linux】一站式教会:Ubuntu(无UI界面)使用apache-jmeter进行压测
|
2月前
|
Ubuntu
百度搜索:蓝易云【Ubuntu开机自启服务systemd.service配置教程】
现在,你的服务将在Ubuntu开机时自动启动,并在之后的启动中持续运行。记得根据你的实际需求修改 `your_service_name.service`文件中的相关信息。
54 2
|
2月前
|
监控 Ubuntu 安全
Ubuntu开启FTP服务教程
在Ubuntu服务器上配置FTP服务是一个常见的需求,无论是用于文件分享、网站管理还是数据备份。FTP(文件传输协议)是一种用于在网络上传输文件的协议,它可以让用户通过身份验证下载或上传文件。本文将指导您如何在Ubuntu系统上安装和配置FTP服务器,以及如何管理用户权限来保证服务器的安全性。
119 0
|
4月前
|
Kubernetes Ubuntu 安全
Linux|科普扫盲帖|配置网络软件源---阿里云镜像仓库服务使用(centos,Ubuntu)
Linux|科普扫盲帖|配置网络软件源---阿里云镜像仓库服务使用(centos,Ubuntu)
493 0
|
1月前
|
Windows
node搭建本地https和wss服务
node搭建本地https和wss服务
22 0
|
2月前
|
弹性计算 Ubuntu
Ubuntu 20.04安装FTP服务
以阿里云ECS为服务器,搭建FTP服务并在本机使用FileZilla连接服务。
309 2
|
3月前
|
Ubuntu 安全 数据安全/隐私保护
百度搜索:蓝易云【Ubuntu配置Samba服务教程】
现在,你已经成功在Ubuntu上配置了Samba服务。其他计算机可以通过网络访问你共享的文件夹。在访问时,需要输入Samba用户的用户名和密码。注意,为了安全起见,建议配置Samba的访问权限和加密选项。
55 1
|
4月前
|
Ubuntu
百度搜索:蓝易云【Ubuntu 22.04上安装NFS服务教程。】
通过以上步骤,你可以在Ubuntu 22.04上安装和配置NFS服务,实现文件共享。确保在进行任何系统配置更改之前备份重要的数据,并在操作过程中小心谨慎,以免造成不必要的问题。
35 0
|
2月前
|
JSON JavaScript 前端开发
JS服务端技术—Node.js知识点
本篇文章是我开始系统学习Node.js的一些笔记。如果文中阐述不全或不对的,多多交流。
62 0
JS服务端技术—Node.js知识点