2015-01-09 69 views
2

我使用卡桑德拉JMeter的插件https://github.com/slowenthal/jmeter-cassandra#cassandra-jmeter-plugin-for-cassandra我已经集成在Apache的JMeter2.9负载测试CassandraDB用JMeter

我有一个包含2数据中心和每个数据中心2个节点的群集卡桑德拉。

JMeter的:

卡桑德拉连接:

contact points : 192.168.1.50,192.168.1.51,192.168.1.52 
keyspace : test_db 

卡桑德拉采样

CQL Query : select * from test_db.feed_yogesh limit 1000; 
Consistency Level : QUORUM 

测试场景

1.Fetch 1000只记录1个用户

User/Thread : 1 
Ramp-Up-Period : 0 
Generate Summary Results =  1 in 2.2s = 0.5/s Avg: 2180 Min: 2180 Max: 2180 Err:  0 (0.00%) 

2.Fetch 1000个记录1000的用户

我想测试为多个用户同时因此我加斜坡上升期间为0,这根据JMeter将立即启动所有用户。

User/Thread : 1000 
RampUp Period : 0 
Summary Results = 1000 in 18s = 56.1/s Avg: 6857 Min: 5000 Max: 17044 Err: 987 (98.70%) 

它并开始了我的所有用户,但只有4-5用户返回成功,其余全部给我错误,如

All host(s) tried for query failed (tried: /192.168.1.50:9042 (com.datastax.driver.core.BusyConnectionException)) 

但是当我测试相同的1000用户给予的加速期300返回所有成功。

User/Thread : 1000 
RampUp Period : 300 
Generate Summary Results = 1000 in 301s = 3.3/s Avg: 519 Min: 255 Max: 1811 Err:  0 (0.00%) 

Cassndra Sampler.jmx

<?xml version="1.0" encoding="UTF-8"?> 
<jmeterTestPlan version="1.2" properties="2.4" jmeter="2.9 r1437961"> 
    <hashTree> 
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"> 
     <stringProp name="TestPlan.comments"></stringProp> 
     <boolProp name="TestPlan.functional_mode">false</boolProp> 
     <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> 
     <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> 
     <collectionProp name="Arguments.arguments"/> 
     </elementProp> 
     <stringProp name="TestPlan.user_define_classpath"></stringProp> 
    </TestPlan> 
    <hashTree> 
     <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> 
     <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> 
     <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> 
      <boolProp name="LoopController.continue_forever">false</boolProp> 
      <stringProp name="LoopController.loops">1</stringProp> 
     </elementProp> 
     <stringProp name="ThreadGroup.num_threads">1000</stringProp> 
     <stringProp name="ThreadGroup.ramp_time">0</stringProp> 
     <longProp name="ThreadGroup.start_time">1420788860000</longProp> 
     <longProp name="ThreadGroup.end_time">1420788860000</longProp> 
     <boolProp name="ThreadGroup.scheduler">false</boolProp> 
     <stringProp name="ThreadGroup.duration"></stringProp> 
     <stringProp name="ThreadGroup.delay"></stringProp> 
     </ThreadGroup> 
     <hashTree> 
     <org.apache.cassandra.jmeter.config.CassandraConnection guiclass="TestBeanGUI" testclass="org.apache.cassandra.jmeter.config.CassandraConnection" testname="Cassandra Connection" enabled="true"> 
      <stringProp name="contactPoints">192.168.1.50,192.168.1.51,192.168.1.52</stringProp> 
      <stringProp name="keyspace">test_db</stringProp> 
      <stringProp name="loadBalancer">Default</stringProp> 
      <stringProp name="localDataCenter"></stringProp> 
      <stringProp name="password"></stringProp> 
      <stringProp name="sessionName">mydatabase</stringProp> 
      <stringProp name="username"></stringProp> 
     </org.apache.cassandra.jmeter.config.CassandraConnection> 
     <hashTree/> 
     <org.apache.cassandra.jmeter.sampler.CassandraSampler guiclass="TestBeanGUI" testclass="org.apache.cassandra.jmeter.sampler.CassandraSampler" testname="Cassandra Sampler" enabled="true"> 
      <stringProp name="batchSize"></stringProp> 
      <stringProp name="consistencyLevel">QUORUM</stringProp> 
      <stringProp name="query">select * from test_db.feed_yogesh limit 1000;</stringProp> 
      <stringProp name="queryArguments">Running</stringProp> 
      <stringProp name="queryType">Simple Statement</stringProp> 
      <stringProp name="resultVariable"></stringProp> 
      <stringProp name="sessionName">mydatabase</stringProp> 
      <stringProp name="variableNames">VARCHAR</stringProp> 
     </org.apache.cassandra.jmeter.sampler.CassandraSampler> 
     <hashTree/> 
     <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> 
      <boolProp name="ResultCollector.error_logging">false</boolProp> 
      <objProp> 
      <name>saveConfig</name> 
      <value class="SampleSaveConfiguration"> 
       <time>true</time> 
       <latency>true</latency> 
       <timestamp>true</timestamp> 
       <success>true</success> 
       <label>true</label> 
       <code>true</code> 
       <message>true</message> 
       <threadName>true</threadName> 
       <dataType>true</dataType> 
       <encoding>false</encoding> 
       <assertions>true</assertions> 
       <subresults>true</subresults> 
       <responseData>false</responseData> 
       <samplerData>false</samplerData> 
       <xml>false</xml> 
       <fieldNames>false</fieldNames> 
       <responseHeaders>false</responseHeaders> 
       <requestHeaders>false</requestHeaders> 
       <responseDataOnError>false</responseDataOnError> 
       <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> 
       <assertionsResultsToSave>0</assertionsResultsToSave> 
       <bytes>true</bytes> 
      </value> 
      </objProp> 
      <stringProp name="filename"></stringProp> 
     </ResultCollector> 
     <hashTree/> 
     <ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true"> 
      <boolProp name="ResultCollector.error_logging">false</boolProp> 
      <objProp> 
      <name>saveConfig</name> 
      <value class="SampleSaveConfiguration"> 
       <time>true</time> 
       <latency>true</latency> 
       <timestamp>true</timestamp> 
       <success>true</success> 
       <label>true</label> 
       <code>true</code> 
       <message>true</message> 
       <threadName>true</threadName> 
       <dataType>true</dataType> 
       <encoding>false</encoding> 
       <assertions>true</assertions> 
       <subresults>true</subresults> 
       <responseData>false</responseData> 
       <samplerData>false</samplerData> 
       <xml>false</xml> 
       <fieldNames>false</fieldNames> 
       <responseHeaders>false</responseHeaders> 
       <requestHeaders>false</requestHeaders> 
       <responseDataOnError>false</responseDataOnError> 
       <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> 
       <assertionsResultsToSave>0</assertionsResultsToSave> 
       <bytes>true</bytes> 
      </value> 
      </objProp> 
      <stringProp name="filename"></stringProp> 
     </ResultCollector> 
     <hashTree/> 
     </hashTree> 
    </hashTree> 
    </hashTree> 
</jmeterTestPlan> 

我很困惑,这是否意味着多个用户的cannnot读取数据的同时我们强制需要添加斜坡向上周期值。

回答

2

加速期限决定了用户应该上网的时间范围或者开始对目标施加负载。

您的结果显示,当您开始使用0 rampup时,所有1000个用户同时启动(1000个并发用户同时点击DB)。结果显示,只有少数用户1%通过并且其余的失败,如果没有进行适当的调整或DB服务器配置不足,则预计会失败。

上述行为的原因可能是您的数据库服务器无法一次承担那么多的负载。它试图尽可能多地发挥作用,但超出了某种限制就停止了工作。

但是,当您添加斜坡时,查询/用户击中分贝率是在数据库服务限制,因此它服务。

你可以检查什么是找出瓶颈或导致这些故障。有些原因可能是,

  1. 低连接池
  2. 降低交易超时
  3. 低配置
  4. 调整参数缺乏DB

可能有很多原因,但与调试尝试解决性能问题并以较低的加速时间再次重新测试(不建议1000秒用户至少保留5-10秒)。如果您希望1000个用户同时点击,则称为同步计时器组件,它可以帮助您。

+0

我认为这是一个低配置问题,因为当我尝试1000线程/用户加速0和100记录的限制一切工作完全正常,但是当我将限制增加到1000很多线程失败。 – Yasmeen