ngcc 2016 - support large partitions

17
Storage format and key cache changes to support large partitions ROBERT STUPP, DATASTAX SOLUTION ARCHITECT, COMMITTER

Upload: robert-stupp

Post on 14-Feb-2017

188 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: NGCC 2016 - Support large partitions

Storageformatandkeycachechanges tosupport largepartitions

ROBERTSTUPP,DATASTAX

SOLUTIONARCHITECT,COMMITTER

Page 2: NGCC 2016 - Support large partitions

ReadPathrecap

1. Bloomfilter

2. IndexSummary

3. PrimaryIndex

4. DataFile

RowIndexEntry◦ points topartition indatafile◦ Onlyforpartitions<64kB

IndexedEntry extendsRowIndexEntry◦ points topartition indatafile◦ Onlyforpartitions>64kB◦ ContainsoneIndexInfo objectper64kB

Page 3: NGCC 2016 - Support large partitions

IndexedEntry

IndexedEntry extendsRowIndexEntryDeletionTimeArrayList

IndexInfoß per64kBDeletionTimeBufferClustering

KindByteBuffer[]

ByteBufferbyte[]

…BufferClustering

KindByteBuffer[]

ByteBuffer…

Approximationon16byteclustering-value:

•1MB:3kB/>200objects

•4MB:11kB/>800objects

•64MB:180kB/>13kobjects

•512MB:1.4MB/>106kobjects

Page 4: NGCC 2016 - Support large partitions

IssueswithIndexedEntry

Page 5: NGCC 2016 - Support large partitions

IssueswithIndexedEntry

•IndexedEntry objecttreebuiltduringflush/compaction

•IndexedEntry objecttreeconstructedforeveryread

•Hugenumberofobjectsà GC,GC,GC,…Nestedobjectstructure– harderforgarbagecollection

•Evicts“legit”entriesfromthekeycacheonreadsàmorediskI/O

Page 6: NGCC 2016 - Support large partitions

Initialapproach

•IndexInfo neverkeptonheap

•Readfromdiskwhenneeded

•Causesnon-negligibleperformancedegrationw/trades-workload

Page 7: NGCC 2016 - Support large partitions

Currentapproach

•IndexInfo keptonheap,ifserializedsizeofIndexedEntry<column_index_cache_size_in_kb

•Otherwisealwaysreadfromdiskwhenneeded

•WritePath (flush,compaction)similar:• IndexInfo keptonheap(forkeycache)if<column_index_cache_size_in_kb

• Otherwiseserializedtoabuffer(notkeptasanobject)

Page 8: NGCC 2016 - Support large partitions

Readpatterns•Binarysearch

•IndexInfo objectsrevisistedbythesame”consumer”

•Sequentialreads(notusingindex)

Page 9: NGCC 2016 - Support large partitions

Whatdoesitbuy?•Lessheappressureduringreads

•Lessheappressureduringflushes/compactions

•Testedfunctionality(write,read,fullcompaction)with8GBpartitionsinautest (w/tinyheap)

•Localnodeloadtestw/280MBpartitions

•GCE(5noden1-standard-8)clusterloadtestw/770MBpartitions• Clusterconstrainted bydiskI/O+netI/O

Page 10: NGCC 2016 - Support large partitions

Largepartitionsconsiderations•Dependingonworkload• Increasecommitlog_segment_size_in_mb +commitlog_total_space_in_mb

• Increaseconcurrent_compactors (defaultof2mightbeabottleneck)and/orcompaction_throughput

•Keycachecanhold“tons”ofpartitioninformation

•Repairsstilltaketime(don’tseemtobenegativelyinfluencedbythepatch)

•Compactions&flushescauselessheappressure

•RecommendationsonmaxamountofdatapernodestillappliesIMO

•LargepartitionsdoesnotmeanlargeCQLrows(nativeprotocolresp buffer)

Page 11: NGCC 2016 - Support large partitions

Findings,Suggesstions,Improvements……FORDISCUSSIONTOMORROW

Page 12: NGCC 2016 - Support large partitions

Biggestissueduringtests:EndlessCMS-GCloops

Page 13: NGCC 2016 - Support large partitions

Biggestissueduringtests:EndlessCMS-GCloopsReadinglargepartitionsresultsinlargeresponses(duh!)

Concurrentlargeresponsesleadtodirect-memory-OOMà Causes“endless”CMS-GCloopà Deadnode(thankyou,ByteBuffer!)

•Solutionpart#1:separateoff-heapmemorypoolinNetty (4.0.37+4.1.1)

•Solutionpart#2:separateoff-heapmemorypoolinC*

Anoverloaded2.2noderecoversfromthis.(Lessdirectmemoryusage– thatsimple?)

Page 14: NGCC 2016 - Support large partitions

Issuesduringlocaltests:ME!“HowthehelldoIsetupmonitoring?”

•Graphite+Whisperà pythondependencyhellà toocomplicated

•Prometheusà reallynice!à hadtowritea“native”exporter(https://github.com/snazy/prometheus-metrics-exporter)

•Grafanaà cool!

Page 15: NGCC 2016 - Support large partitions

Gatling•GatlingCql – initiallybyMikhailStepurahttps://github.com/gatling-cql/GatlingCql

Gatling2.2.1+C*-driver3.0.2

Gatlingitselfemitsmetricsduring

Contributionswelcome!

Page 16: NGCC 2016 - Support large partitions

Findings/defaultconfigs•Changedefaultofconcurrent_reads/writes/couter_writes/mv_writesfrom32to#ofCPUs

•Changedefaultofnative_transport_threads from128to2*CPUs

Page 17: NGCC 2016 - Support large partitions

Issuesduringlocaltests-Resourceconsumers?•No”lightweight”metricstomeasureCPUandheapconsumptionofthreadgroups

•Solutionoption#1:integrateinourpools(wouldmisssomethreads)

•Solutionoption#2:useprometheus-metrics-exporter(https://github.com/snazy/prometheus-metrics-exporter) +C*patch