也说性能测试,顺便说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下的多进程加协程并发 ...
随机推荐
- linux内存和swap
https://www.cnblogs.com/Zfc-Cjk/archive/2018/02/13/8447270.html
- C# 服务端篇之实现RestFul Service开发(简单实用)
一.RestFul简介 REST(Representational State Transfer 通常被翻译为“表述性状态传输”或者“表述性状态转移”)是RoyFielding提出的一个描述互联系统架 ...
- css 使元素居中
css使元素水平居中 1.对于行内元素的水平居中 给父元素设置text-align:center <div style="text-align:center;">居中显 ...
- git最佳实践之feature和hotfix分支
先来复习一波,git的最佳分支管理流程: 再简单复习各个分支: master: 主分支,主要用来版本发布. develop:日常开发分支,该分支正常保存了开发的最新代码. feature:具体的功能开 ...
- swust oj 1015
堆排序算法 1000(ms) 10000(kb) 2631 / 5595 编写程序堆排序算法.按照从小到大的顺序进行排序,测试数据为整数. 输入 第一行是待排序数据元素的个数: 第二行是待排序的数据元 ...
- 爬虫IP代理中的http与https
之前使用代理IP,构造的proxies一直都是http模式 proxies={"http": "http://{}".format(ip)} 但是今天遇到的网站 ...
- javascript 关键字高亮显示实现代码
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- java Int 和 String 之间的转换
String 转换成 int Integer.parseInt(formParams.get("id")) int 转换成 string Integer.toString(id);
- socket 编程中。 服务端用到多线程
客户端连接服务端之后, 服务端会生成与客户端交换信息的socket. 在服务端实现多线程: 为每个连接创建一个线程进行信息交换. import threading from socket import ...
- CORS jsonp
现在碰到了请求跨域的问题,结合前面讲的一些概念,我们大致可以猜到解决跨域请求的两种方式: 在服务端启用CORS.让无服务端拥有处理JSONP的能力.这两种跨域解决方案的区别是什么呢? JSONP只支持 ...