在实习的时候有个任务是需要对两个dns服务器进行压测和性能对比,现成的稳定的可选压测工具有dnsperf和queryperf,我用前者在具体压测时在某种情况下输出的结果很诡异,在那种情况下无法用于对比,而后者使用在使用时,用脚本调用来连续压测的情况下也会出现奇怪的现象,总之,这两个工具都用得不顺手。再者,这两个工具只复杂输出每次压测的数据,要使得几次数据的变化可视化,需要写个工具或人工提取数据项,再用如excel来进行绘图,过程很繁琐。还有,为了进行性能分析,如分析CPU和内存在服务器运行时的使用情况,需要写个脚本不断调用top,而后同样需要再写个工具提取数据项再进行绘图,十分十分的繁琐。
-
此前了解过coredns和caddy的源码,很喜欢它们实现的时候用自定义配置文件配合插件的思路来进行个性化的配置,使其具有不同的功能,而其它开发者只需要开发他们需要的插件,即可拓展功能,我觉得这样的设计很有趣很美,所以一直有个想试试这种方式来设计个程序。
-
由于前述原因,也让我一直有想自己写个压测工具,自动化完成前述所有工作,从压测到多项(如CPU,内存,QPS等)可视化数据的输出一条龙服务。
-
但又不想只局限于DNS压测,所以设计了这个带有插件式思想,通过解析用我所定义语法写的脚本文件来调用这些插件,达到可定制可扩展的效果。同时,为了能方便生成各种随机数据,同样设计了类似的语法来编写模板文件,同样实现相应的生成随机值的插件,可再使用模板文件时调用响应的插件来即时生成所约定好的随机文本。
-
为了能更方便一些自定义协议的压测,我的设计是把传输层与应用层分离,应用层为随机文本生成的数据,传输层为固定的脚本插件,应用层数据填充至传输层插件中来完成数据包的发送。
- 控制台
- divsperf/command
- 读取并解析编写好的模板文件,以模板名为key存于map中,供运行压测脚本时调用来生成随机文本,用于填充作为应用层数据
- 读取并接卸编写好的脚本文件,以脚本名为key存与map中,供而后运行脚本使用
- 运行脚本
- (TCP/IP五层模型的应用层)随机文本
- divsperf/randval
- parse用于解析模板文件
- create下均为模板文件中会被用于生成随机值的“生成器插件”,在这里添加自定义的插件后即可在模板文本中调用
- tools为方便编写插件所共用的一些工具类函数
- crvfs用于保存模板文件,后缀为.crvf
- (TCP/IP五层模型的传输层)压测脚本
- divsperf/script
- parse用于解析脚本文件
- conner下为传输层的插件,如udp,配置好目的ip和端口,填充数据段(即应用层),调用插件的相应指令完成数据包发送
- analyzer下为收发数据包时,同时进行相关的数据统计,如dns,则统计收发包的时间,发送包的总数,响应包的总数,每个响应数据的特定数据项的统计等。analyzer与对应的conner关联密切,需要针对性的开发。
- reporter下为将对应analyzer的统计数据按自己想要的方式输出,如纯文本或绘制统计图等。
- addon下为其它功能的插件,比如use用于调用“模板文件”来获得随机文本,parallel用于并发
- scris用于保存脚本文件,后缀为.scri
- tools为方便编写插件所共用的一些工具类函数
目前的进度是基本实现了整个架构,对各个部分进行了少量测试,基本保证功能的正确性。但目前完成的插件的开发仅针对dns压测。
- 控制台终止读取解析或终止脚本运行的后果未知
- 随机数与时间相关,同时用到随机数的话往往会得到相同的随机值
- 如何移除不再使用的“模板文本”或“脚本文件”
- “模板文本”和“脚本文件”编写的语法有点不太友好,需要用户紧遵语法格式
- divsperf/randval/create
- json:使用json关键字后,其后的内容可用成熟的json解析器来解析,以此来提供更为人所熟悉的json语法来定义一些key-value
- http:在json关键字用于方便的表达key-value,再通过http关键字来进一步转化为http应用层的plain文本格式
- var:使得多个同名的var处可获得相同的随机值,即第一次随机获取而后存储,其它地方再出现则直接取该值,以此满足某些情况下要求多个数据项相同
- placeholder:允许该“模板文本”被“脚本文件”调用时,传入参数。估计需要修改现有的use,使其能向后传递参数
- divsperf/script/addon
- sleep:等待一段时间
- cpu:在被压测的服务器主机上运行一个小应用,可接收cpu关键字传递的信号进行cpu数据采集,而后接收cpu关键字结束指令的信号回传收集到的数据
- mem:与cpu同理,实现对主机内存情况的监控
- divsperf/script/analyzer
- divsperf/script/conner
- tcp:完成能够满足使用tcp的设计
- tls:完成能够满足使用tls的设计
- divsperf/script/reporter