压测环境

6C 16G 测试服务器

服务器本机部署 ArangoDB3.6

手动编写压测程序,Jar包形式本机启动

场景用例

插入/更新

CASE 1(批量更新):

  • 使用ArangoDB自带的 WEB Interface
  • 相对复杂的CI模型结构
  • Update语句,更新单一属性
  • 20W条更新,首次执行59秒,
  • TPS ≈ 3300
FOR c IN col_CIUPDATE c WITH { numericVal: 5 } IN col_CI

CASE 2(单条循环插入):

  • JAVA程序
  • 单线程
  • 10000条数据
  • 单文档插入形式,模拟CI模型场景(单个Document容量相对较大)
  • 执行时间:2.9s
  • TPS ≈ 3000
start time:1594706936441; end time:1594706939380; Run Time:2939(ms)
//将模型提供的XML文档进行解析,拆出CI相关的内容,转换成JsonObj形式进行局部加工,单条插入
JSONObject jsonCi = JSONObject.parseObject(XmlConverUtil.xmltoJson(typeXml));for (int i=0;i<10000;i++) {BaseDocument document = new BaseDocument();document.setKey("key" + jsonCi.get("Unique_code")+"_"+i);document.addAttribute("Ref", jsonCi.get("Ref"));document.addAttribute("Name", jsonCi.get("Name")+"_"+i);document.addAttribute("Attributes", jsonCi.get("Attributes"));collection.insertDocument(document);}
//Json示例:
{"Attributes": {"Assets": [{"Description": "设备名称","MetriesCode": "Network.System.DevieName","ID": "DeviceCode","Code": "Network.Switch.DeviceCode","Source": "Manual,Metrics","Name": "设备名称"},{"Description": "显示名称","MetriesCode": "Network.System.DevieName","ID": "DisplayCode","Code": "Network.Switch.DisplayCode","Source": "Manual,Metrics","Name": "显示名称"},{"Description": "IP地址","ID": "IPAddress","Code": "Network.Switch.IPAddress","Source": "Manual,Metrics","Name": "IP地址"},{"Description": "MAC地址","MetriesCode": "Network.System.MACAddress","ID": "MAC","Code": "Network.Switch.MACAddress","Source": "Manual,Metrics","Name": "MAC地址"},{"Description": "OID","MetriesCode": "Network.System.SystemOID","ID": "SystemOID","Code": "Network.Switch.SystemOID","Source": "Manual,Metrics","Name": "OID"},{"Description": "设备序列号","MetriesCode": "Network.System.SerialNum","ID": "SerialNum","Code": "Network.Switch.SerialNum","Source": "Manual,Metrics","Name": "设备序列号"},{"Description": "厂商","MetriesCode": "","ID": "Manufactures","Code": "Network.Switch.Manufactures","Source": "Manual,Metrics","Name": "厂商"}],"Configs": {"Attribute": {"Description": "该配置项的名称 ","MetriesCode": "Network.System.SoftwareVersion","ID": "SoftwareVersion","Code": "Network.Switch.SoftwareVersion","Source": "Manual,Metrics","Name": "软件版本"}},"RuningStatus": {"Attribute": {"Description": "设备运行状态(正常、异常、未监控等)","MetriesCode": "Network.System.SNMPReachable","ID": "Snmpstatus","Code": "Network.Switch.Runstatus","Source": "Metrics","Name": "Snmp状态"}}},"Ref": "Base.CI","Name": "交换机_0"
}

CASE 3(批量导入大数据集):

  • JAVA程序
  • 单线程
  • 5W条数据
  • 批量插入/导入的方法,模拟CI模型场景(单个Document容量较大
  • 执行时间:80S
  • TPS ≈ 620
start time:1594633266617; end time:1594633347172; Run Time:80555(ms)
//Json示例{"Attributes": {"Assets": [{"Description": "设备名称","MetriesCode": "Network.System.DevieName","ID": "DeviceCode","Code": "Network.Switch.DeviceCode","Source": "Manual,Metrics","Name": "设备名称"},{"Description": "显示名称","MetriesCode": "Network.System.DevieName","ID": "DisplayCode","Code": "Network.Switch.DisplayCode","Source": "Manual,Metrics","Name": "显示名称"},{"Description": "IP地址","ID": "IPAddress","Code": "Network.Switch.IPAddress","Source": "Manual,Metrics","Name": "IP地址"},{"Description": "MAC地址","MetriesCode": "Network.System.MACAddress","ID": "MAC","Code": "Network.Switch.MACAddress","Source": "Manual,Metrics","Name": "MAC地址"},{"Description": "OID","MetriesCode": "Network.System.SystemOID","ID": "SystemOID","Code": "Network.Switch.SystemOID","Source": "Manual,Metrics","Name": "OID"},{"Description": "设备序列号","MetriesCode": "Network.System.SerialNum","ID": "SerialNum","Code": "Network.Switch.SerialNum","Source": "Manual,Metrics","Name": "设备序列号"},{"Description": "厂商","MetriesCode": "","ID": "Manufactures","Code": "Network.Switch.Manufactures","Source": "Manual,Metrics","Name": "厂商"}],"Configs": {"Attribute": {"Description": "该配置项的名称 ","MetriesCode": "Network.System.SoftwareVersion","ID": "SoftwareVersion","Code": "Network.Switch.SoftwareVersion","Source": "Manual,Metrics","Name": "软件版本"}},"RuningStatus": {"Attribute": {"Description": "设备运行状态(正常、异常、未监控等)","MetriesCode": "Network.System.SNMPReachable","ID": "Snmpstatus","Code": "Network.Switch.Runstatus","Source": "Metrics","Name": "Snmp状态"}}},"Ref": "Base.CI","Name": "交换机_0"
}

CASE 4(批量导入小数据集):

  • JAVA程序
  • 单线程
  • 5W条数据
  • 批量插入/导入的方法,模拟CI模型场景(单个Document容量较小
  • 执行时间:150S
  • TPS ≈ 6600
start time:1594624916535; end time:1594625066607; Run Time:150072(ms)
//100W个简单document批量执行导入collection = db.collection(COLLECTION_CI);
List<BaseDocument> arr = new ArrayList<>();for (int i=0;i<1000000;i++) {BaseDocument document = new BaseDocument();document.setKey("key" + i);document.addAttribute("a", "aaaa");document.addAttribute("b", "bbbb");document.addAttribute("c", "cccc");arr.add(document);}collection.importDocuments( arr);

CASE 5(分批导入大数据集):

  • JAVA程序
  • 单线程
  • 5W条数据
  • 分50批插入/导入,每批次1000条,模拟CI模型场景(单个Document容量较大
  • 执行时间:7.3s
  • TPS ≈ 6800
start time:1594720911016; end time:1594720918366; Run Time:7350(ms)
//循环嵌套,实现分批导入,性能表现良好for (int i = 1; i <= 50; i++) {List<BaseDocument> arr = new ArrayList<>();for (int j =1 ;j <= 1000; j++){BaseDocument document = new BaseDocument();document.setKey("key" + jsonCi.get("Unique_code") + "_" + i*j);document.addAttribute("Ref", jsonCi.get("Ref"));document.addAttribute("Name", jsonCi.get("Name") + "_" + i*j);document.addAttribute("Attributes", jsonCi.get("Attributes"));arr.add(document);}String values = mapper.writeValueAsString(arr);collection.importDocuments(values);}

CASE 6(批量更新10W个CI的属性):

  • JAVA程序
  • 单线程
  • 10W条数据
  • 批量更新官方压测数据中的一个属性
  • 执行时间:7.2s
  • TPS ≈ 13000
start time:1594884931949; end time:1594884939175; Run Time:7226(ms)
 // 选择分组为『Music』的数据集,批量更新其属性 my_proppublic Collection<String> batchUpdateCiByAttribute() {String aql = "FOR p IN products " +" FILTER p.group == 'Music' " +" UPDATE p WITH { my_prop: 9 } IN products";arangoDB = new ArangoDB.Builder().build();final ArangoCursor<String> cursor = arangoDB.db().query(aql,null,null,String.class);Collection<String> result = cursor.asListRemaining();return result;}
2、查询

CASE 7(根据主键查询指定CI设备关系到的1到4层之间的所有设备):

  • JAVA程序

  • 10个线程

  • 10W条数据

  • 最长响应0.656s

  • 最短响应0.110s

  • 平均响应0.312s

  • 90%线程响应时间小于0.413s

  • 95%线程响应时间小于0.434s

  • 错误率 0

 // 查询 _key 为 "products/532035" 的CI,1到4层关系到的CI设备集合public Collection<String> getAllCiByKey() {String aql = "FOR v,e,p IN 1..4 OUTBOUND 'products/532035' GRAPH 'g_products'" +" OPTIONS {uniqueVertices:'none',uniqueEdges:'path'} " +"RETURN v";arangoDB = new ArangoDB.Builder().build();final ArangoCursor<String> cursor = arangoDB.db().query(aql,null,null,String.class);Collection<String> result = cursor.asListRemaining();return result;}

CASE 8(查询54W 全集数据):

  • JAVA程序
  • 单线程
  • 54W条数据
  • 直接遍历全集数据,不加任何条件
  • 执行时间:35s
  • QPS ≈ 15000
start time:1594871712833; end time:1594871747875; Run Time:35042(ms)
 // 过滤掉重复路过的节点public Collection<String> getAllCi() {String aql = "FOR p IN products " +" OPTIONS {uniqueVertices:'none',uniqueEdges:'path'} " +" RETURN p ";arangoDB = new ArangoDB.Builder().build();final ArangoCursor<String> cursor = arangoDB.db().query(aql,null,null,String.class);Collection<String> result = cursor.asListRemaining();return result;}

CASE 9(查询10W数据集,同时匹配两个属性):

  • JAVA程序
  • 单线程
  • 10W条数据
  • 同时匹配两个属性
  • 执行时间:3.7s
  • QPS ≈ 27000
start time:1594877416617; end time:1594877420311; Run Time:3694(ms)
 // 查询 products 集合中 group == "Book" 且 salesrank >300000 数据,限制返回10W条结果集public Collection<String> getCiByAttributes() {String aql = "FOR p IN products " +" OPTIONS {uniqueVertices:'none',uniqueEdges:'path'} " +" FILTER p.group == 'Book'  &&  p.salesrank > 300000" +" LIMIT 100000 " +" RETURN p";arangoDB = new ArangoDB.Builder().build();final ArangoCursor<String> cursor = arangoDB.db().query(aql,null,null,String.class);Collection<String> result = cursor.asListRemaining();return result;}

CASE 10(统计全集的数量):

  • JAVA程序
  • 单线程
  • 54W条数据
  • 字节统计记录数,输出结果
  • 执行时间:0.16s
start time:1594877254329; end time:1594877254496; Run Time:167(ms)
 public Collection<String> getAllCiAmount() {String aql = "FOR p IN products " +" OPTIONS {uniqueVertices:'none',uniqueEdges:'path'} " +" COLLECT WITH COUNT INTO counter " +" RETURN counter ";arangoDB = new ArangoDB.Builder().build();final ArangoCursor<String> cursor = arangoDB.db().query(aql,null,null,String.class);Collection<String> result = cursor.asListRemaining();return result;}

问题发现

  • 本地如果超过5W的CI量级导入(单体容量相对大),会出现 Java Heap OutOfMemory的异常。
  • 超过1W以上的量级导入,最好走批量接口,InsertLoop 方式超过1W会出现处理性能下降。
  • 整体测试场景是直接部署在机器上的,Docker环境中的没有测试

结论

  • 建议大于5W 的XML数据集直接走批量导入接口,InsertLoop方式适合小体量的数据集。

  • 插入、更新的TPS单机环境表现来看,应对普通的业务场景还可以。

  • 初步来看,批量导入的场景,性能表现会随着数据集的增大而下降,是由于DB底层Socket写序列化输出流到缓冲区的机制导致。解决方案初步思路是,遇到相对较大的数据集的时候,我们可以合理的将数据切分,分批导入即可。

ArangoDB压测小记相关推荐

  1. JMeter性能测试:JMeter多用户并发模拟及压测结果分析

    目录 JMeter设置 JMeter线程组 JMeter压测实例 View Results Tree Aggregate Report 命令行方式执行压测 jtl文件解析 JMeter多用户并发模拟 ...

  2. mysql为什么要压测_mysql集群压测的详细介绍

    本篇文章给大家带来的内容是关于mysql集群压测的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. mysql压测 mysql自带就有一个叫mysqlslap的压力测试工具,通 ...

  3. 在CentOS 6.3 64bit上为Apache Traffic Server 4.2.3挂载SSD并压测

    下面的安装假定是以root用户身份进行的,Linux服务器已经安装好系统,磁盘已经做好分区. 首先需要认识我们的Linux服务器的硬件配置和软件情况 硬件配置: DELL R720 2U服务器 CPU ...

  4. 使用jtest工具压测Apache Traffic Server

    置顶声明:下面的内容来自于赵永明的ATS博客, 本文是在他的指导和自身实践基础上整理而成.这里对豪哥的无私热心帮助表示无限感激! 一.概述 1.压力测试的定义 很多情况下,大家都希望在服务器上线前.业 ...

  5. 基于python的压测工具_Python Locust性能测试简介及框架实践

    Locust(俗称 蝗虫), 一个轻量级的开源压测工具,用Python编写.使用 Python 代码定义用户行为,也可以仿真百万个用户: Locust 非常简单易用,是分布式,用户负载测试工具.Loc ...

  6. 金蝶中间件部署报栈溢出_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒...

    618大促演练进行了全链路压测,在此之前刚好我的热key探测框架也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个key探测,每天大概几亿左右,因为量很小,所以框架表现稳定. 借着这次 ...

  7. 压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地

    项目背景 随着业务拓展,对于接口性能的要求也在上升,各部门也开始针对部分慢接口进行优化,从测试角度针对这些优化需求进行测试时不仅要保证对应接口的功能正常使用同时也要验证接口优化成果.在日常的开发工作中 ...

  8. 保障高并发:企业必须从传统性能测试转向云压测

    近几年,中国互联网实现了超高速的发展.阿里巴巴双十一每秒钟最高要处理28万个订单,国内很多直播平台的并发在线人数已经突破1000万,甚至很多在线教育平台的并发访问量都突破了百万的数量级.如果企业的IT ...

  9. 服务压测发现怪异现象,一顿排查,揪出“TIME_WAIT”这个内鬼

    点击关注公众号,Java干货及时送达 最近有同事在用 ab 进行服务压测,到 QPS 瓶颈后怀疑是起压机的问题,来跟我借测试机,于是我就趁机分析了一波起压机可能成为压测瓶颈的可能,除了网络 I/O.机 ...

最新文章

  1. 阿里云服务器ECS配置LNMP
  2. 战龙四驱java_《战龙四驱》中都有哪些经典角色
  3. java重置_JAVA復制數組和重置數組大小
  4. Java NIO 介绍和基本demo
  5. java删除通用方法_一个比较通用的java删除文件和文件夹的方法
  6. 阿里云异构计算产品是如何保障双11业务的
  7. git rebase --skip_可冒充git大神的git tips
  8. python代码混淆工具_有没有好的 python 混淆器 推荐一个
  9. Get与Post的区别?(面试官最想听到的答案)
  10. chrome自动发送邮件插件
  11. TTL、CMOS和RS232电平的区别和联系
  12. GitHub贡献统计
  13. 2021年湖北省区块链技术应用创新创业大赛已正式启动,欢迎报名参赛
  14. 计算机硬盘分区显示不全,windows7系统磁盘分区图标显示不正常的两种解决方法【图】...
  15. 树莓派ONVIF推流做网络摄像头
  16. 大觉山漂流,男人的欢笑女人的尖叫
  17. 生日快乐程序_时光匆匆,爱你不变——祝星广十七岁生日快乐
  18. #Python#错误之ModuleNotFoundError: No module named ‘yaml‘
  19. 开源项目搭建私有物联网智能家居接入天猫精灵控制
  20. ToolkitScriptManager与ScriptManager

热门文章

  1. java实现日记软件_建立日记类
  2. pta 7-29 螺旋矩阵
  3. PyQT从入门到出门-001
  4. Java 开发环境搭建
  5. 【Word】Word技巧汇总
  6. java监控cpu绘图,java gateway监控cpu使用率
  7. Webstorm使用解决ESlint问题合集
  8. 学机器人编程要学什么知识
  9. python决策树的应用_决策树应用(一)
  10. 常用格式如何互相转换(jpg转png)