目录:
- 1、如何查看Linux下进程的IO活动状况 00 Hey,Linux
- 2、如何编写linux下执行测试软件命令按时间间隔的脚本
- 3、软件测试面试题:WEB+网络|接口测试|性能测试|自动化测试
- 4、Ubuntu服务器性能测试脚本serverreview-benchmark
- 5、【fio】CentOS.x上磁盘性能测试工具fio的安装和使用
如何查看Linux下进程的IO活动状况 00 Hey,Linux
前段时间,几台测试服务器的Web应用响应速度非常慢,系统负载也比较高, 10, 但CPU和内存却很闲,于是怀疑是磁盘的性能瓶颈,通过vmstat和iostat看到IO的读写量非常大,尤其是用iostat -x 1命令可以很直观的看到IO的使用率一直在100%。
但究竟是啥进程导致的高IO呢,由于每台服务器上都有JBoss和MySQL的存在,JBoss会不停的产生很多小的数据文件和生成文本数据库的数据,而MySQL则会不停的从Master同步新的数据。因此我们怀疑是这两个进程导致的高IO,通过停止了JBoss和MySQL之后,IO立刻降为0%. 但我们还是不能确定谁是主因,于是寻找可以查看特定进程IO的方法。
最后,找到了两个方法可以查看进程IO的活动状况。
1. 第一个方法是通过一个python脚本来实现。
方法是将以下内容另存为一个叫io.py的脚本中,然后直接以root身份执行脚本,就可以看到如下图所示的信息(由于我们已经通过升级到SSD硬盘解决了MySQL的IO问题,所以不能提供关于MySQL的截图了),其中出现次数最多,数据最大的进程,就是导致高IO的主因。不过比较遗憾的是这个脚本并不能显示进程在每一秒的准确的IO读写。
# vim io.py
# chmod +x io.py
# ./io.py
#!/usr/bin/python
# Monitoring per-process disk I/O activity
# written by
import sys, os, time, signal, re
class DiskIO:
def __init__(self, pname=None, pid=None, reads=0, writes=0):
self.pname = pname
self.pid = pid
self.reads = 0
self.writes = 0
def main():
argc = len(sys.argv)
if argc != 1:
print "usage: ./iotop"
sys.exit(0)
if os.getuid() != 0:
print "must be run as root"
sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)
os.system('echo 1 /proc/sys/vm/block_dump')
print "TASK PID READ WRITE"
while True:
os.system('dmesg -c /tmp/diskio.log')
l = []
f = open('/tmp/diskio.log', 'r')
line = f.readline()
while line:
m = re.match(
'^(S+)((d+)): (READ|WRITE) block (d+) on (S+)', line)
if m != None:
if not l:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
continue
found = False
for item in l:
if item.pid == m.group(2):
found = True
if m.group(3) == "READ":
item.reads = item.reads + 1
elif m.group(3) == "WRITE":
item.writes = item.writes + 1
if not found:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
time.sleep(1)
for item in l:
print "%-10s %10s %10d %10d" %
(item.pname, item.pid, item.reads, item.writes)
def signal_handler(signal, frame):
os.system('echo 0 /proc/sys/vm/block_dump')
sys.exit(0)
if __name__=="__main__":
main()
2. 另一个方法是将Linux的内核升级到 =2.6.20,然后安装一个iotop软件来实现。
不过这种改动并不适用于生产环境,因为在RHEL5.6和5.7上,内核都在 2.6.20以下。但是它所显示的结果是非常准确的,所以对于新上线的机器以及测试环境,非常值得一试,具体方法如下:
下载和升级新内核(=2.6.20),编译时打开 TASK_DELAY_ACCT 和 TASK_IO_ACCOUNTING 选项。
解压内核后进入配置界面:
# wget
# tar jxvf linux-2.6.39.tar.gz
# mv linux-2.6.39 /usr/src/
# cd /usr/src/linux-2.6.39
# make oldconfig //使用make oldconfig可以继承老的kernel的配置,为自己的配置省去很多麻烦。
# make menuconfig
把General setup - Enable per-task storage I/O accounting这个选项选上。
# vim .config
将#CONFIG_SYSFS_DEPRECATED_V2 is not set的注释去掉的,将其改为y,即修改为CONFIG_SYSFS_DEPRECATED_V2=y。
保存内核后编译内核:
# make
# make modules
# make modules_install
# make install
修改默认以新的内核启动:
# vi /boot/grub/grub.conf
default=0
将新的内核配置文件复制到/boot目录:
# cp /usr/src/linux-2.6.39/.config /boot/config-2.6.39
重启服务器:
# reboot
# uname –r
2.6.39
重启完成后确认内核版本是否正确。
源码安装iotop所需的Python 2.7.2(= 2.5):
# wget
# tar xzvf Python-2.7.2.tgz
# cd Python-2.7.2
# ./configure
# make; make install
下载并安装iotop:
# wget
# tar -xjvf iotop-0.4.4.tar.bz2
# cd iotop-0.4.4
# python setup.py build
# python setup.py install
然后就可以使用iotop看到如下图所示的信息:
如何编写linux下执行测试软件命令按时间间隔的脚本
编写脚本fio.sh,内容:
#/bin/sh
fio -filename=/dev/sdl -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=8k -size=200G -numjobs=30 -runtime=60 -group_reporting -name=mytest
sleep 60
fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=32k -size=200G -numjobs=30 -runtime=60 -group_reporting -name=mytest
sleep 60
fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=32k -size=200G -numjobs=1 -runtime=60 -group_reporting -name=mytest
sleep 60
fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=32k -size=200G -numjobs=1 -runtime=60 -group_reporting -name=mytest
执行脚本:
bash ./fio.sh fio.log 21
软件测试面试题:WEB+网络|接口测试|性能测试|自动化测试
1. http代码表,常考题目
404:找不到资源
500:服务器内部错误,无法完成请求。
501:服务器不支持请求的功能,无法完成请求。
502:充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。
301:永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI,今后任何新的请求都应使用新的URI代替。
302:临时移动。与301类似。但资源只是临时被移动,客户端应继续使用原有URI。
200:成功。
2. TCP/IP四层网络模型
链路层、网络层、传输层、应用层。
3. TCP/UDP区别?
TCP: 可靠传输协议,需要三次握手连接,有确认重传机制,特点是可靠、准确、有拥塞控制,缺点就是比较慢,传输量比较小,适用于升级、下载;一句话:TCP是可靠的传输。
UDP: 不可靠传输协议,面向非连接的协议,优点是传输量大、速度快,缺点是已丢失、没有拥塞控制,适用于直播、视频等。一句话:UDP是不可靠的传输。
4. html css js运行的先后顺序是啥?
界面加载的时候先加载html在加载css最后加载js
5. session和cookie的区别是啥
1. session存放在服务器端用来校验客户端的身份
2. cookie存放在客户端,每次从客户端往服务器发请求时,将cookie带到服务器端,用来校验客户端的身份
1. 如何用JMeter测试接口?
如果使用JMeter进行接口测试:
1) 测试前了解需求,根据接口规格说明书梳理业务;
2) 接下来设计用例,分析接口的入参和出参,分清楚有哪些有效输入和无效输入,设计用例(原则:用最少的用例覆盖所有有效输入,针对每一个无效的输入设计一个测试用例,如果有错误码没有覆盖到,还要对每个未覆盖的错误码分别设计一个用例);
3) 准备测试数据,比如:测试所需的账号、密码、key 等信息;
4) 打开JMeter,创建一个线程组,根据接口类型,填写好对应的接口地址和请求方式等;
5) 参数化配置,添加配置元件CSV Data Set Config,定义变量,并准备CSV格式的数据,变量的引用用${变量名}的格式;
6) 添加断言来判断测试结果的正确性,用得最多的是响应断言;
7) 添加监听器,比如查看结果树,对测试结果进行监听;
8) 运行测试用例;
9) 查看监听器结果,来判断用例的执行是成功还是失败,针对失败的用例,分析其失败原因;
10) 针对测试中发现的问题,给开发提单,直到问题最终解决。
11) 最后输出测试报告。
2. 如何用Postman测试接口?
如果使用Postman测试接口:
其中1,2,3点相同,工具使用方面则比JMeter跟简单,工具的主要的步骤是添加对应的请求、填写服务器URL及入参、添加测试套、运行测试套、分析结果出报告。
3. 在JMeter上如何把上一个请求的结果作为下一个请求的参数?
使用正则表达式提取器提取上一个请求的响应中的信息,保存一个引用名称比如abc,在下一个请求的参数中,用${abc}的格式来引用提取的结果。
常用的正则表达式格式:(.+?),其中.表示匹配任意字符串,+表示只匹配一次,?表示匹配到就停下来。
一般是我们功能测试完成最后两三天时间测试性能。
1、先是分析需求计算出并发数,TPS,响应时间和 CPU,内存,硬盘和网络IO这些指标。
2、制定测试方案,主要包括环境,计划和具体测试那些场景(如可靠性,并发,负载,压力测试等)
3、根据场景用Badboy录制脚本,导出为JMeter工具支持的脚本。
4、用JMeter工具打开脚本,进行脚本调试,加一些断言,监听器,参数化等。
5、接下来执行性能测试,然后主要收集监听器和收集服务器CPU,内存,硬盘和网络IO等分析是否满足需求,如果满足就输出性能测试报告。
6、如果指标不能满足,反馈给开发进行调优。调优后继续测试,一直到满足需求后最终输出测试报告。
1. Python如何定义一个函数?
你可以定义一个由自己想要功能的函数,以下是简单的规则:
1) 函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
2) 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3) 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4) 函数内容以冒号起始,并且缩进
5) return[表达式]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None
2 Python切片
3. Python上用过什么库/模块?
webdriver:定位和操作元素
time:设置等待时间
ActionChains:动作链,完成鼠标的相关操作
Keys:键盘的相关操作
WebDriverWait:设置显式等待
Expect_Conditions:针对单个元素,设置显式等待的场景
PIL:截图
Select:下拉选择框的操作
unittest python:自带的单元测试框架
HTMLTestRunner:运行脚本,生成报告
ddt:实现数据驱动测试,行为和数据分离
4. 你做过自动化测试吗?
我在上一份工作中,公司去年下半年也开始规划做Web 自动化,采用Python作为开发语言,通过Selenium WebDriver定位和操作页面元素,自动化框架用的是unittest。我主要负责写测试脚本。
假设一个测试团队有5个人:1资深(测试经理)+2~3个中级(自动化+手动)+1 个初级(手动)
5. 使用什么工具进行的自动化测试
使用的工具是Selenium(Web自动化工具)
6. 用的什么编程语言
用的Python
7. Selenium 用的是哪个版本的的?Python用的是哪个版本的?
用的是selenium 3.11.0和Python2.7.10
8. Selenium的工作原理?
1)对html元素定位
2)模拟对第一步定位到的元素进行点击、输入、选择等操作一句话:定位元素,操作元素。
9. 元素定位方法有哪些?
要点:8种定位方法
1) 根据元素的属性值定位,比如 id、name、class、标签名、链接文字和部分链接文字;
2) 根据CSS选择器定位;
3) 根据 XPath 定位;
10. 子页面里的元素如何定位?
先切换到框架里,然后再定位,用switch_to_frame函数根据子页面id或name,切换到子页面;定位完了如果要再定位主页面的元素,要用switch_to_default_content 函数先返回主页面。
11. 如何定位alert弹窗?或者这样问:如何处理JS原生窗口?
要点:主要涉及点击弹窗确认按钮、强行关闭弹窗、获取弹窗中的文字等操作。
1) 点击弹窗的确定按钮,用如下函数:
driver.switch_to_alert().accept()
2) 强行关闭,点击右上角的叉叉,用如下函数:
driver.switch_to_alert().dismiss()
3) 获取弹窗里的文字,用如下函数:
driver.switch_to_alert().text
12. 如何运行自动化用例并生成测试报告?
以unittest为例,我通常的做法是把用例加载到测试套中,做成一个脚本,在命令窗口下运行脚本,报告的生成用第三方模块HTML TestRunner来生成。
13. 如何定位/操作图片中的验证码?
用tesseract OCR引擎处理图片中的验证码,步骤:
(1)对整个屏幕截屏,保存成png格式的图片;
(2)在截取的图片中定位验证码图片的位置坐标;
(3)根据坐标对验证码截图;
(4)在图片中提取验证码,输入到输入框。
Ubuntu服务器性能测试脚本serverreview-benchmark
这个脚本是经常用来测试服务器性能尤其是Ubunut16.04的,在购买vps之后可以用来测试一下性能
对服务器信息、CDN加速节点的Speedtest测速、各大洲节点的Speedtest测速、IO测试进行全面测试.
只对服务器信息、CDN加速节点的Speedtest测速、IO测试进行测试.
【fio】CentOS.x上磁盘性能测试工具fio的安装和使用
Summary : Multithreaded IO generation tool
Description : fio is an I/O tool that will spawn a number of threads or processes doing a particular type of io action as specified by the user. fio takes a number of global parameters, each inherited by the thread unless otherwise parameters given to them overriding that setting is given.
The typical use of fio is to write a job file matching the io load one wants to simulate.
多线程IO生成工具
fio是一个I / O工具,它将产生许多线程或正在执行的进程 ,由用户指定的特定类型的io操作。
fio需要一个 全局参数的数量,每个参数都由线程继承,否则给他们的参数将覆盖该设置。
fio的典型用法是编写与io负载匹配的需要模拟的作业文件 。
官网地址:
# yum -y install libaio gtk2 libaio-devel gtk2-devel
# yum -y install fio
# yum info fio
# rpm -ql fio | grep "bin"
应用使用IO通常有二种方式:同步和异步。
同步的IO一次只能发出一个IO请求,等待内核完成才返回,这样对于单个线程iodepth总是小于1,但是可以透过多个线程并发执行来解决,通常我们会用16-32根线程同时工作把iodepth塞满。
异步的话就是用类似libaio这样的Linux native aio一次提交一批,然后等待一批的完成,减少交互的次数,会更有效率。
注意 : 性能测试建议直接通过写裸盘的方式进行测试,会得到较为真实的数据,但直接测试裸盘会破坏文件系统结构,导致数据丢失,请在测试前确认磁盘中数据已备份。
# fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=10G -numjobs=1 -name=./fio.test
"-direct=1",代表采用非 buffered I/O 文件读写的方式,避免文件读写过程中内存缓冲对性能的影响
"-iodepth=64"和"-ioengine=libaio"这两个参数,这里指文件读写采用异步 I/O(Async I/O)的方式,也就是进程可以发起多个 I/O 请求,并且不用阻塞地等待 I/O 的完成。稍后等 I/O 完成之后,进程会收到通知。这种异步 I/O 很重要,因为它可以极大地提高文件读写的性能。在这里我们设置了同时发出 64 个 I/O 请求
"-rw=read,-bs=4k,-size=10G",这几个参数指这个测试是个读文件测试,每次读 4KB 大小数块,总共读 10GB 的数据。最后一个参数是"-numjobs=1",指只有一个进程 / 线程在运行。所以,这条 fio 命令表示我们通过异步方式读取了 10GB 的磁盘文件,用来计算文件的读取性能。
我们看到在 上图中测试中, I/O 性能是 15.9MB/s 的带宽,IOPS(I/O per second)是 4076 左右。
fio压测工具和io队列深度理解和误区
fio – IO压力测试工具
fio安装使用方法
fio模拟MySQL服务器IO压力脚本
fio使用详解
Fio Output Explained