You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@cassandra.apache.org by Sean Bowman <sb...@epochlabs.com> on 2016/01/18 22:30:29 UTC

performance/benchmarking

Hello,

We are evaluating Cassandra performance and would like to know if the
numbers we've gotten can be improved upon.  Right now we're just testing a
simple key/value store using the cassandra-stress tool.  A quick summary of
our setup:

* Using the datastax 2.2 distribution, Oracle HotSpot Java 1.8 default
config
  except as noted below
* 3 node cluster, each node with a 3.3GHz Xeon, 4 cores w/ 2 hyperthreads
  each, 32G memory and large SSDs
* stress.yaml files run with cassandra-stress on other machine(s) as
described
  below

First, vanilla cassandra-stress run like so

    cassandra-stress write duration=10m cl=QUORUM -mode native cql3 \
        -schema "replication(factor=3)" -node 10.40.252.5 -rate threads=700
-errors ignore

gives 98k ops/s, latency median 5.1, max 887, and

    cassandra-stress read duration=10m cl=QUORUM -mode native cql3 \
        -schema "replication(factor=3)" -node 10.40.252.5 -rate threads=700
-errors ignore

gives 105k ops/s, latency median 6.3, max 184.3.

Next, we run with our "user" profile.  The results are as follows, where
"small" denotes 5B keys/2B values and "medium" denotes 128B keys/512B
values.

one test machine:
small:  consistency QUORUM insert, 900 threads, 120k ops/s
small:  consistency QUORUM read,   800 threads, 132k ops/s

small:  consistency ONE insert,    600 threads, 185k ops/s
small:  consistency ONE read,      900 threads, 194k ops/s

medium: consistency QUORUM insert, 550 threads, 89k ops/s
medium: consistency QUORUM read,   880 threads, 55k ops/s

two test machines, total number threads listed:
medium: consistency ONE insert,    800 threads, 108k ops/s
medium: consistency ONE read,     1200 threads, 136k ops/s

Do these numbers seem reasonable?  Is there any low hanging fruit that would
change them dramatically?  Thanks!


More details: the stress.yaml user configuration is below.  The numbers in
the
"columnspec" key change with the above key/value sizes, but that's the only
change.

---
keyspace: smstress

keyspace_definition: |
    CREATE KEYSPACE smstress WITH replication = {'class': 'SimpleStrategy',
'replication_factor': 3};
table: kvtestsmkey

table_definition: |
    CREATE TABLE kvtestsmkey (
        key blob PRIMARY KEY,
        value blob
    ) WITH COMPACT STORAGE;
columnspec:
    - name: key
      size: fixed(5)
    - name: value
      size: fixed(2)

insert:
    partitions: fixed(1)
    select: fixed(1)/1
    batchtype: UNLOGGED

queries:
    read:
        cql: select * from kvtestsmkey where key = ? LIMIT 1
        fields: samerow
---

The default config is used except for the following changes:

* concurrent_reads and _writes is set to 64,
* memtable_allocation_type is set to offheap_objects,
* memtable_flush_writers is set to 8,
* request timeouts have been increased somewhat

cassandra-stress is run like this, mutatis mutandis, for user profiles:

    cassandra-stress user duration=10m cl=ONE profile=stress.yaml
ops\(insert=1\) \
        -mode native cql3 -node (ip address) -rate threads=(number) -errors
ignore

I have system data that seem to indicate that net and disk IO are not
bottlenecks.

Thanks very much for your help!

--
Sean Bowman
Software Developer, Epoch Labs