mirror of https://github.com/apache/cassandra
add 95th and 99th percentile latency reporting to Stress
patch by jbellis; reviewed by brandonwilliams for CASSANDRA-5005
This commit is contained in:
parent
ae9faf080d
commit
b475602be8
|
|
@ -25,6 +25,8 @@ import java.util.*;
|
|||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import com.yammer.metrics.Metrics;
|
||||
import com.yammer.metrics.core.Histogram;
|
||||
import org.apache.cassandra.cli.transport.FramedTransportFactory;
|
||||
import org.apache.cassandra.config.CFMetaData;
|
||||
import org.apache.cassandra.config.EncryptionOptions;
|
||||
|
|
@ -56,9 +58,9 @@ public class Session implements Serializable
|
|||
|
||||
private static InetAddress localInetAddress;
|
||||
|
||||
public final AtomicInteger operations;
|
||||
public final AtomicInteger keys;
|
||||
public final AtomicLong latency;
|
||||
public final AtomicInteger operations = new AtomicInteger();
|
||||
public final AtomicInteger keys = new AtomicInteger();
|
||||
public final com.yammer.metrics.core.Timer latency = Metrics.newTimer(Session.class, "latency");
|
||||
|
||||
private static final String SSL_TRUSTSTORE = "truststore";
|
||||
private static final String SSL_TRUSTSTORE_PW = "truststore-password";
|
||||
|
|
@ -436,10 +438,6 @@ public class Session implements Serializable
|
|||
|
||||
mean = numDifferentKeys / 2;
|
||||
sigma = numDifferentKeys * STDev;
|
||||
|
||||
operations = new AtomicInteger();
|
||||
keys = new AtomicInteger();
|
||||
latency = new AtomicLong();
|
||||
}
|
||||
|
||||
private TTransportFactory validateAndSetTransportFactory(String transportFactory)
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import java.io.PrintStream;
|
|||
import java.util.concurrent.BlockingQueue;
|
||||
import java.util.concurrent.SynchronousQueue;
|
||||
|
||||
import com.yammer.metrics.stats.Snapshot;
|
||||
import org.apache.cassandra.stress.operations.*;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
import org.apache.cassandra.stress.util.Operation;
|
||||
|
|
@ -50,7 +51,8 @@ public class StressAction extends Thread
|
|||
|
||||
public void run()
|
||||
{
|
||||
long latency, oldLatency;
|
||||
Snapshot latency;
|
||||
long oldLatency;
|
||||
int epoch, total, oldTotal, keyCount, oldKeyCount;
|
||||
|
||||
// creating keyspace and column families
|
||||
|
|
@ -60,7 +62,7 @@ public class StressAction extends Thread
|
|||
int threadCount = client.getThreads();
|
||||
Consumer[] consumers = new Consumer[threadCount];
|
||||
|
||||
output.println("total,interval_op_rate,interval_key_rate,avg_latency,elapsed_time");
|
||||
output.println("total,interval_op_rate,interval_key_rate,latency/95th/99th,elapsed_time");
|
||||
|
||||
int itemsPerThread = client.getKeysPerThread();
|
||||
int modulo = client.getNumKeys() % threadCount;
|
||||
|
|
@ -82,7 +84,6 @@ public class StressAction extends Thread
|
|||
|
||||
// initialization of the values
|
||||
boolean terminate = false;
|
||||
latency = 0;
|
||||
epoch = total = keyCount = 0;
|
||||
|
||||
int interval = client.getProgressInterval();
|
||||
|
|
@ -124,21 +125,23 @@ public class StressAction extends Thread
|
|||
epoch = 0;
|
||||
|
||||
oldTotal = total;
|
||||
oldLatency = latency;
|
||||
oldKeyCount = keyCount;
|
||||
|
||||
total = client.operations.get();
|
||||
keyCount = client.keys.get();
|
||||
latency = client.latency.get();
|
||||
latency = client.latency.getSnapshot();
|
||||
|
||||
int opDelta = total - oldTotal;
|
||||
int keyDelta = keyCount - oldKeyCount;
|
||||
double latencyDelta = latency - oldLatency;
|
||||
|
||||
long currentTimeInSeconds = (System.currentTimeMillis() - testStartTime) / 1000;
|
||||
String formattedDelta = (opDelta > 0) ? Double.toString(latencyDelta / (opDelta * 1000)) : "NaN";
|
||||
|
||||
output.println(String.format("%d,%d,%d,%s,%d", total, opDelta / interval, keyDelta / interval, formattedDelta, currentTimeInSeconds));
|
||||
output.println(String.format("%d,%d,%d,%.1f,%.1f,%.1f,%d",
|
||||
total,
|
||||
opDelta / interval,
|
||||
keyDelta / interval,
|
||||
latency.getMedian(), latency.get95thPercentile(), latency.get999thPercentile(),
|
||||
currentTimeInSeconds));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
package org.apache.cassandra.stress.operations;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
import org.apache.cassandra.stress.util.Operation;
|
||||
|
|
@ -70,7 +71,7 @@ public class CounterAdder extends Operation
|
|||
? getSuperColumnsMutationMap(superColumns)
|
||||
: getColumnsMutationMap(columns));
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -103,7 +104,7 @@ public class CounterAdder extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
|
||||
private Map<String, List<Mutation>> getSuperColumnsMutationMap(List<CounterSuperColumn> superColumns)
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
package org.apache.cassandra.stress.operations;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
import org.apache.cassandra.stress.util.Operation;
|
||||
|
|
@ -67,7 +68,7 @@ public class CounterGetter extends Operation
|
|||
String superColumn = 'S' + Integer.toString(j);
|
||||
ColumnParent parent = new ColumnParent("SuperCounter1").setSuper_column(superColumn.getBytes());
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -101,7 +102,7 @@ public class CounterGetter extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -112,7 +113,7 @@ public class CounterGetter extends Operation
|
|||
byte[] key = generateKey();
|
||||
ByteBuffer keyBuffer = ByteBuffer.wrap(key);
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -146,7 +147,6 @@ public class CounterGetter extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import java.io.IOException;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.Collections;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.db.ColumnFamilyType;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
|
|
@ -71,7 +72,7 @@ public class CqlCounterAdder extends Operation
|
|||
String key = String.format("%0" + session.getTotalKeysLength() + "d", index);
|
||||
String formattedQuery = null;
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -121,6 +122,6 @@ public class CqlCounterAdder extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import java.io.IOException;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.Collections;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.db.ColumnFamilyType;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
|
|
@ -70,7 +71,7 @@ public class CqlCounterGetter extends Operation
|
|||
byte[] key = generateKey();
|
||||
String formattedQuery = null;
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -125,7 +126,6 @@ public class CqlCounterGetter extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ import java.nio.ByteBuffer;
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.db.ColumnFamilyType;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
|
|
@ -74,7 +75,7 @@ public class CqlIndexedRangeSlicer extends Operation
|
|||
|
||||
while (received < expectedPerValue)
|
||||
{
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -132,7 +133,7 @@ public class CqlIndexedRangeSlicer extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndAdd(results.rows.size());
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ import java.nio.ByteBuffer;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.db.ColumnFamilyType;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
|
|
@ -96,7 +97,7 @@ public class CqlInserter extends Operation
|
|||
|
||||
String formattedQuery = null;
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -147,6 +148,6 @@ public class CqlInserter extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import java.io.IOException;
|
|||
import java.nio.ByteBuffer;
|
||||
import java.util.Collections;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.utils.ByteBufferUtil;
|
||||
|
||||
import org.apache.cassandra.db.ColumnFamilyType;
|
||||
|
|
@ -62,7 +63,7 @@ public class CqlRangeSlicer extends Operation
|
|||
String key = String.format("%0" + session.getTotalKeysLength() + "d", index);
|
||||
String formattedQuery = null;
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -117,6 +118,6 @@ public class CqlRangeSlicer extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndAdd(rowCount);
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - startTime);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ import java.nio.ByteBuffer;
|
|||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.db.ColumnFamilyType;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
|
|
@ -86,7 +87,7 @@ public class CqlReader extends Operation
|
|||
|
||||
String formattedQuery = null;
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -140,6 +141,6 @@ public class CqlReader extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
package org.apache.cassandra.stress.operations;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
import org.apache.cassandra.stress.util.Operation;
|
||||
|
|
@ -66,7 +67,7 @@ public class IndexedRangeSlicer extends Operation
|
|||
session.getKeysPerCall());
|
||||
|
||||
List<KeySlice> results = null;
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -104,7 +105,7 @@ public class IndexedRangeSlicer extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndAdd(results.size());
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
package org.apache.cassandra.stress.operations;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
import org.apache.cassandra.stress.util.Operation;
|
||||
|
|
@ -73,7 +74,7 @@ public class Inserter extends Operation
|
|||
: getColumnsMutationMap(columns);
|
||||
Map<ByteBuffer, Map<String, List<Mutation>>> record = Collections.singletonMap(ByteBufferUtil.bytes(rawKey), row);
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -105,7 +106,7 @@ public class Inserter extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
|
||||
private Map<String, List<Mutation>> getSuperColumnsMutationMap(List<SuperColumn> superColumns)
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
package org.apache.cassandra.stress.operations;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
import org.apache.cassandra.stress.util.Operation;
|
||||
|
|
@ -55,7 +56,7 @@ public class MultiGetter extends Operation
|
|||
{
|
||||
ColumnParent parent = new ColumnParent("Super1").setSuper_column(ByteBufferUtil.bytes("S" + j));
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -87,7 +88,7 @@ public class MultiGetter extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndAdd(keys.size());
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
|
||||
offset += session.getKeysPerCall();
|
||||
}
|
||||
|
|
@ -98,7 +99,7 @@ public class MultiGetter extends Operation
|
|||
|
||||
List<ByteBuffer> keys = generateKeys(offset, offset + session.getKeysPerCall());
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -131,7 +132,7 @@ public class MultiGetter extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndAdd(keys.size());
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
|
||||
offset += session.getKeysPerCall();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
package org.apache.cassandra.stress.operations;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
import org.apache.cassandra.stress.util.Operation;
|
||||
|
|
@ -61,7 +62,7 @@ public class RangeSlicer extends Operation
|
|||
String superColumnName = "S" + Integer.toString(i);
|
||||
ColumnParent parent = new ColumnParent("Super1").setSuper_column(ByteBufferUtil.bytes(superColumnName));
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -90,7 +91,7 @@ public class RangeSlicer extends Operation
|
|||
}
|
||||
|
||||
session.operations.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - startTime);
|
||||
context.stop();
|
||||
}
|
||||
|
||||
session.keys.getAndAdd(slices.size());
|
||||
|
|
@ -104,7 +105,7 @@ public class RangeSlicer extends Operation
|
|||
List<KeySlice> slices = new ArrayList<KeySlice>();
|
||||
KeyRange range = new KeyRange(count).setStart_key(start).setEnd_key(ByteBufferUtil.EMPTY_BYTE_BUFFER);
|
||||
|
||||
long startTime = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -137,7 +138,7 @@ public class RangeSlicer extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndAdd(slices.size());
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - startTime);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
package org.apache.cassandra.stress.operations;
|
||||
|
||||
import com.yammer.metrics.core.TimerContext;
|
||||
import org.apache.cassandra.stress.Session;
|
||||
import org.apache.cassandra.stress.util.CassandraClient;
|
||||
import org.apache.cassandra.stress.util.Operation;
|
||||
|
|
@ -66,7 +67,7 @@ public class Reader extends Operation
|
|||
String superColumn = 'S' + Integer.toString(j);
|
||||
ColumnParent parent = new ColumnParent("Super1").setSuper_column(superColumn.getBytes(UTF_8));
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -100,7 +101,7 @@ public class Reader extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -111,7 +112,7 @@ public class Reader extends Operation
|
|||
byte[] key = generateKey();
|
||||
ByteBuffer keyBuffer = ByteBuffer.wrap(key);
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
TimerContext context = session.latency.time();
|
||||
|
||||
boolean success = false;
|
||||
String exceptionMessage = null;
|
||||
|
|
@ -145,7 +146,7 @@ public class Reader extends Operation
|
|||
|
||||
session.operations.getAndIncrement();
|
||||
session.keys.getAndIncrement();
|
||||
session.latency.getAndAdd(System.currentTimeMillis() - start);
|
||||
context.stop();
|
||||
}
|
||||
|
||||
private SliceRange getSliceRange()
|
||||
|
|
|
|||
Loading…
Reference in New Issue