也说性能测试,顺便说python的多进程+多线程、协程
最近需要一个web系统进行接口性能测试,这里顺便说一下性能测试的步骤吧,大概如下
一、分析接口频率
根据系统的复杂程度,接口的数量有多有少,应该优先对那些频率高,数据库操作频繁的接口进行性能测试,所以先和开发根据业务情况,找到频率最高的几个接口。完成这些后再逐步完成剩余接口的测试。
二、找到合适的测试工具
性能测试工具简直数不胜数,最著名莫过于loadrunner,因为它支持windows,呵呵呵,这也是我刚毕业时用的工具(当然是盗版了。。。),简单易用,功能强大,不过收费版是真贵。我现在用得最多是jmeter,用起来也很简单。
三、根据实际调整测试频率
有的性能测试纯粹为了对比新旧版本的性能提升的,那就不用管三七二十一,全力去压既可。有的性能测试只是为了找到正常情况下,系统能支撑的最大并发之类,那么就要根据实际情况调整测试频率了,比如业务不繁忙时应该按多大频率,业务繁忙时应该按多大频率,业务正常时应该按多大频率。
四、分析测试结果
测试结果用于分析被测系统的性能瓶颈,它并不单单指测试工具的测试结果,还包括被测系统的日志,例如数据库访问日志,打印慢查询之类,作为一个性能测试人员,应该需要具备分析日志和测试工具结果的能力。
下面说我在本次测试中遇到的难题,因为被测系统会对接口请求内容进行分析,如果格式不对就直接返回失败,所以用jmeter模拟请求时我都是根据实际请求内容来模拟的,其中有一个接口怎么模拟都返回失败,通过wireshark抓包后发现,正常的包接口请求body中有的换行符是"0a"有的是"0d0a"而且不能乱否则达不到想要的效果(同时多条数据查询),用jmeter模拟的请求参数却只能全是"0a"(用parameters的detail模拟)或者全是"0d0a"(用body data模拟),折腾许久仍然不行,最终只能郁闷地用python写代码来对这个接口做性能测试,其实真心不建议这样做,如果可以的话宁可让开发修改接口来临时绕过也好,因为术业有专攻,python毕竟不是专门用来做性能测试的,用它做性能测试是下策。windows下用python做性能测试大概有几种方案:
1、多线程
2、多进程
3、协程
本来打算用eventlet(基于协程),却发现用eventlet需要用它的“绿色标准库”,我这个接口请求内容如果用它的“绿色urllib2”来模拟的话又比较麻烦,用pycurl则简单许多,为了利用多核CPU的优势,我决定先用多进程+多线程的方式来实现一个比较挫的“接口性能测试”了。代码大概如下:
import string, threading, time
import random
import multiprocessing def perf():
a=0
while a<int(packets):#请求包总数,如果用时间长短来限制是更好的
for i in xrange(int(vusers)):#并发数,即并发线程数
t = threading.Thread(target=cloudquery,args=(random.randint(1, 1000000000)))#cloudquery是指每个线程干的活,就是实际的被测试接口,随机数用来尽量保证每次请求不同的内容,可以用其他方法来实现,不过要挑选性能比较好的方法,以免浪费资源在这上面
t.start()#启动线程
a+=1 if __name__ == '__main__':
jobs = []
for i in range(int(process)):#并发进程
p = multiprocessing.Process(target=perf)#启动多个进程,每个进程启动同样的线程
jobs.append(p)
p.start()
for aa in jobs:
aa.join()
有时间再用绿色urllib2来实现一次,看看是不是更好一些。
后记:已经用多进程+协程实现了,不过不知道是否我用法错误,从抓包看两者并发没有比多进程+多线程快啊。2进程*100线程的并发 > 2进程*协程的并发。。。
也说性能测试,顺便说python的多进程+多线程、协程的更多相关文章
- python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!
首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运行一个程序. 从操作系统的角度: 进程和线程,都 ...
- python 多进程/多线程/协程 同步异步
这篇主要是对概念的理解: 1.异步和多线程区别:二者不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段.异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事 ...
- Python 多进程 多线程 协程 I/O多路复用
引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...
- 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)
Python的socket高级应用(多进程,协程与异步)
- Python多线程、多进程和协程的实例讲解
线程.进程和协程是什么 线程.进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实际使用这三种东西 参考: 进程.线程.协程之概念理解 进程(Process)是计算机中 ...
- python爬虫——多线程+协程(threading+gevent)
上一篇博客中我介绍了如何将爬虫改造为多进程爬虫,但是这种方法对爬虫效率的提升不是非常明显,而且占用电脑cpu较高,不是非常适用于爬虫.这篇博客中,我将介绍在爬虫中广泛运用的多线程+协程的解决方案,亲测 ...
- python进阶——进程/线程/协程
1 python线程 python中Threading模块用于提供线程相关的操作,线程是应用程序中执行的最小单元. #!/usr/bin/env python # -*- coding:utf-8 - ...
- 多线程、多进程、协程、IO多路复用请求百度
最近学习了多线程.多进程.协程以及IO多路复用,那么对于爬取数据来说,这几个方式哪个最快呢,今天就来稍微测试一下 普通方式请求百度5次 import socket import time import ...
- windows下多进程加协程并发模式
好久没更新博客了.正好最近要整理一下最近这段时间做过的项目以及学习python的一些心得.如标题所示,今天就来说说windows下多进程加协程并发模式.其实网上还是蛮多在linux下的多进程加协程并发 ...
随机推荐
- eclipse启动时 failed to create the java virtual machine 解决办法
解决步骤: 1.打开eclipse解压目录下的配置文件eclipse.ini: 2.找到 --launcher.XXMaxPermSize 256M 并改为 --launcher.XXMaxPermS ...
- Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求
Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,java 判断请求是不是ajax请求 Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java ...
- DBeaver连接MySQL 8.0显示"Unable to load authentication plugin 'caching_sha2_password'."错误的问题
下载MySQL绿色版本mysql-8.0.12-winx64,手动安装完成后.使用DBeaver连接提示"Unable to load authentication plugin 'cach ...
- R - Dividing 多重背包
来源poj1059 Marsha and Bill own a collection of marbles. They want to split the collection among thems ...
- ConfuserEx壳
前言: 这几天用Rolan的时候出现了点问题,然后发现了这个非常好用的工具居然只有几百k,打算逆向一下,然后发现了ConfuserEx壳 探索: Rolan是用C#写的,刚开始用EXEinfoPE打开 ...
- Dagger2 导入项目
导入分为两步: 第一步: 在Project build.gradle 文件中加入: dependencies { // Dagger2 第一步classpath 'com.neenbedankt.gr ...
- unicode 与 utf-8 编码概念及区别
unicode 是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案.每个字符都对应一个编号,编号的范围是0-0x10FFFF来.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为 ...
- react中改变echart图表的形状
首先说明一点constructor中的只会渲染一次. 父组建是两个点击按钮,点击一个传过来bar,和一个line,子组件也就是当前组建通过this.props.type接收. 渲染是通过::::::t ...
- php(数组方法
什么是数组? 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可以无需指定数组长度 ...
- 用ASPOSE.Cells将HTML表格存为Excel
前端生成的html表格经常需要导出到excel中,利用JS和Office控件可以做到,但仅限于IE,还要启用安全设置. 想找一个简单的办法将HTML内容直接转换成Excel文件,如果直接修改网页头信息 ...