使用我自己的查询加载测试mongodb

时间:2016-01-26 00:10:44

标签: mongodb load-testing

我写了一个聚合组和计数查询,我打算模拟一个真实的场景,我有成千上万的用户每秒调用我的系统(每个调用将导致一个聚合查询)来获得一个他们的活动数量。

所以我将1000万条记录(代表用户活动)插入到我的数据库中,并使用JMeter来模拟聚合调用,但我遇到了以下问题:

  • 我无法更改每个请求的脚本(我想为每个唯一的调用提供一个用户ID)。
  • I discovered JMeter MongoDB Sampler非常慢(它使用db.eval()方法,默认采用全局锁)

由于上述原因我无法使用JMeter进行负载测试,如何回答以下问题:

  

我的服务器可以处理多少负载?在我的用例中有多少1台服务器   可以在1秒内处理聚合查询(由用户活动请求产生)?

保持其他因素不变(例如应用代码,网络,分片等)。

2 个答案:

答案 0 :(得分:1)

我会首先关注记录生成。如果您需要模拟会话并将特定请求与特定用户ID相关联,那么最简单的方法是使用字符串操作(例如,在字符串中放置一个{USERID}标记,在python / java / bash / etc中加载每一行并替换USERID使用您为特定会话长度生成的ID)。基本上,我会考虑将数据集处理为脱机任务,我可以对其进行流式处理和操作以模拟USERID或其他任何会话。流式传输结果并操纵它们可能需要数小时,或者您可能会使用快速的cut / sed / awk脚本集,或者您可以将所有记录加载到单独的集合中并运行map reduce(例如,基于jsessionid聚合。)

此时,您将拥有一个包含代表您数据集的JSON的文本文件。创建一个新集合并导入数据集,慢慢等待。

现在编写一个脚本(mongo采用普通的旧javascript),以特定的速率执行一系列查询(在nodejs或普通的旧javascript,settimeout和v8中使用async)。编写一个脚本,增加并发用户数或减少请求之间的时间。运行该脚本并监控延迟和服务器,当延迟变得不可接受时,您就有了容量。

另一种排列是针对1M,2M,5M,10M行运行类似的加速测试,绘图(数据集大小,每秒请求数,延迟百分位数)。这为您的努力提供了漂亮的3D图表。

答案 1 :(得分:0)

使用JSR223 Samplergroovy语言执行查询。

退房: