SlideShare a Scribd company logo
1 of 74
TECHNICAL DEEP DIVE:

QUERY PERFORMANCE
  CASSANDRA SF 2012
  Aaron Morton, Apache Cassandra Committer
               @aaronmorton
           www.thelastpickle.com




    Licensed under a Creative Commons Attribution-NonCommercial 3.0 New Zealand License
Today.

         Write Path
         Read Path
7 Microseconds of Terror.
Standard write path...

1. Append to Commit Log
2. Merge with Memtable
Blast through the thin Martian
         atmosphere!
    (Also time to synchronise around the commit log.)
Write path details...

Acquire read lock from server
wide read-write switchLock.
Memtable flush path acquires
   the write lock from
      switchLock.
Flush will block if
memtable_flush_queue_s
           ize
 Memtables are waiting to
          flush.
memtable_flush_queue_size test...

         m1.xlarge Cassandra node
            m1.xlarge client node
       1 CF with 6 Secondary Indexes
               1 Client Thread
    10,000 Inserts, 100 Columns per Row
           1100 bytes per Column
memtable_flush_queue_size test...
create column family WithIndex
    with comparator = AsciiType
    and default_validation_class = AsciiType
    and key_validation_class = AsciiType
    and max_compaction_threshold = 0
    and min_compaction_threshold = 0
    and compression_options = null
    and column_metadata [{
        column_name : 0000000000,
        validation_class : AsciiType,
        index_type : 0,
        index_name : 0000000000},
CF write latency and memtable_flush_queue_size...

                                  memtable_flush_queue_size=7   memtable_flush_queue_size=1
                       1,200



                        900
Latency Microseconds




                        600



                        300



                          0
                           85th                     95th            99th                    100th
Request latency and memtable_flush_queue_size...

                                     memtable_flush_queue_size=7   memtable_flush_queue_size=1
                      5,000,000



                      3,750,000
Latecy Microseconds




                      2,500,000



                      1,250,000



                             0
                              85th                     95th            99th                    100th
Deploy the Hypersonic
     parachute!
  (Also time to write to the CommitLog.)
Commit Log...

   Write to CommitLog if
       Keyspace wide
  durable_writes is enabled.
                (Enabled by default.)
durable_writes test...

                  10,000 Inserts,
               50 Columns per Row
               50 bytes per Column
Request latency and durable_writes (1 client)...

                                  enabled          disabled
                       7,000



                       5,250
Latency Microseconds




                       3,500



                       1,750



                          0
                           85th             95th              99th
Request latency and durable_writes (10 clients)...

                                   enabled          disabled
                       30,000



                       22,500
Latency Microseconds




                       15,000



                        7,500



                           0
                            85th             95th              99th
Request latency and durable_writes (20 clients)...

                                   enabled          disabled
                       90,000



                       67,500
Latency Microseconds




                       45,000



                       22,500



                           0
                            85th             95th              99th
CommitLog has either
periodic or batch file
      syncing.
   (Periodic with fsync every 10 seconds is default.)
periodic commit log adds mutation to queue
           then acknowledges.

   Commit Log is appended to by a single
      thread, sync is called every
   commitlog_sync_period_in_ms.
CommitLog tests...


           10,000 Inserts,
        50 Columns per Row
        50 bytes per Column
Request latency and commitlog_sync_period_in_ms...

                                 10,000 ms          10 ms
                       220



                       208
 Latecy Microseconds




                       195



                       183



                       170
                          85th               95th           99th
batch commit log adds mutation to queue
     and waits before acknowledging.

  Writer thread processes mutations for
commitlog_sync_batch_window_in_ms
    duration, then syncs, then signals.
Request latency and commitlog_sync_batch_window_in_ms...


                                 50 ms          0 ms
                       800



                       750
 Latecy Microseconds




                       700



                       650



                       600
                          85th           95th              99th
Request latency comparing periodic and batch sync...

                                 periodic          batch
                       800



                       600
 Latecy Microseconds




                       400



                       200



                         0
                          85th              95th           99th
Engage the rocket powered
        sky crane!
(Also time to merge the mutation with the current Memtable.)
Merge mutation...

  Row level Isolation provided
        via SnapTree.
                    (https://github.com/nbronson/snaptree)
00   REM Cassandra for C64
05   REM Clone row_cols into my_cols
10   GOSUB 1000
20   FOR col = write.first_col TO write.last_col
25   REM Add or Reconcile col with my_cols
30   GOSUB 2000
40   IF my_cols != row_cols THEN GOTO 05
50   NEXT col
55   REM Atomic swap row_cols with my_cols
60   GOSUB 3000
70   IF swapped_cols = FALSE THEN GOTO 05
Row concurrency tests...


     10,000 Columns per Row
       50 bytes per Column
      50 Columns per Insert
CF Write Latency and row concurrency (10 clients)...

                                 different rows          single row
                      2,000



                      1,500
Latecy Microseconds




                      1,000



                       500



                         0
                          85th                    95th                99th
Write path with KEYS secondary indexes...


1. Append to Commit Log
2. Read modified Index Columns
3. Merge with Memtable
4. Update Secondary Indexes
Secondary Indexes...


     synchronized access to
         indexed rows.
                       (Keyspace wide)
Index concurrency tests...

                  CF with 2 Indexes
                    10,000 Inserts
                 6 Columns per Row
                35 bytes per Column
              Alternating column values
Request latency and index concurrency (10 clients)...

                                 different rows          single row
                      4,000



                      3,000
Latecy Microseconds




                      2,000



                      1,000



                         0
                          85th                    95th                99th
Read modified indexed
columns or all for row
      deletion.
Insert or delete changes to
        index rows.
Index tests...


              10,000 Inserts
           50 Columns per Row
           50 bytes per Column
Request latency and secondary indexes...

                                 no indexes          six indexes
                      3,000



                      2,250
Latecy Microseconds




                      1,500



                       750



                         0
                          85th                95th                 99th
Today

        Write Path
        Read Path
Two read paths...

        SliceByNamesReadCommand

           SliceFromReadCommand
Locating row start per SSTable...

1. Check BloomFilter
2. Read KeyCache
3. Read Index Samples, seek
and partial scan -Index.db
          (Step 3 only used if KeyCache lookup missed.)
Column Family
bloom_filter_fp_chance
  controls BloomFilter
      effectiveness.
bloom_filter_fp_chance tests...
                1,000,000 Rows
              50 Columns per Row
              50 bytes per Column

       commitlog_total_space_in_mb: 1

           Read random 10% of rows.
CF read latency and bloom_filter_fp_chance...

                                 default 0.000744.          0.1
                      7,000



                      5,250
Latecy Microseconds




                      3,500



                      1,750



                         0
                          85th                       95th         99th
SSTables per read and bloom_filter_fp_chance (14 SStables)...


                                  default 0.000744.          0.1
                       1



                       1
   SSTables per Read




                       1



                       0



                       0
                           85th                       95th         99th
Bloom Filter False Ratio and bloom_filter_fp_chance...


                              default 0.000744.   0.1
                          1



                          1
   False Positive Ratio




                          0



                          0



                          0
key_cache_size_in_mb
controls the size of the key
           cache.
key_cache_size_in_mb tests...


            10,000 Rows
        50 Columns per Row
        50 bytes per Column
           Read all Rows
CF read latency and key_cache_size_in_mb...

                                  default (100MB) 100% Hit Rate          disabled
                        300



                        225
  Latecy Microseconds




                        150



                         75



                          0
                           85th                                   95th              99th
index_interval controls the
   size of the -Index.db
           sampling.
index_interval tests...
                   100,000 Rows
                50 Columns per Row
                50 bytes per Column

             key_cache_size_in_mb: 0

 Read 1 Column from random 10% of Rows
CF read latency and index_interval...

                                  index_interval=128 (default)          index_interval=512
                      20,000



                      15,000
Latecy Microseconds




                      10,000



                       5,000



                          0
                           85th                                  95th                        99th
Row Cache removes all disk
          IO.
row_cache_size_in_mb
 controls the size of Row
          Cache.
row_cache_size_in_mb tests...


           100,000 Rows
        50 Columns per Row
        50 bytes per Column
           Read all Rows
CF read latency and row_cache_size_in_mb...
                                 row_cache_size_in_mb=0 and key_cache_size_in_mb=100mb
                                 row_cache_size_in_mb=100mb and key_cache_size_in_mb=0
                       260



                       195
 Latecy Microseconds




                       130



                        65



                         0
                          85th                           95th                            99th
Slice by Name (excluding Counter Columns)...

1. Order SSTables by maxTimestamp.
2. Break if SSTable covered by previous Row
Tombstone.
3. Remove irrelevant Columns from query.
4. Eagerly read Columns from SSTable.
5. Hoist Columns into current Size Tier.
When reading by Column name...



 A query on a wide row must
read the entire Column Index.
Column Index tests...

    Read first Column by name from 1,200
                  Columns.

  Read first Column by name from 1,000,000
                 Columns.
CF read latency and Column Index...
                                 First Column from 1,200          First Column from 1,000,000

                      6,000



                      4,500
Latecy Microseconds




                      3,000



                      1,500



                         0
                          85th                             95th                                 99th
When reading by Column name...



   A narrow query on a wide
     row performs better.
Name Locality tests...
                  1,000,000 Columns
                 50 bytes per Column

   Read 100 Columns from middle of row.
 Read 100 Columns from spread across row.
CF read latency and name locality...
                                   Adjacent Columns          Spread Columns

                      200,000



                      150,000
Latecy Microseconds




                      100,000



                       50,000



                           0
                            85th                      95th                    99th
Slice...

1. Skip if SSTable covered by previous Row
Tombstone.
2. Read and merge Columns from SSTable.
             (May be eager or lazy reading)
When slicing...



A query using natural Column
order without a start has the
    highest performance.
Start position tests...
                    1,000,000 Columns
                   50 bytes per Column

      Read first 100 Columns without start.
       Read first 100 Columns with start.
CF read latency and start position...
                                  Without start position          With start position

                      40,000



                      30,000
Latecy Microseconds




                      20,000



                      10,000



                          0
                           85th                            95th                         99th
When slicing...


Any start column requires the
 Column index to be read.
Start offset tests...
                     1,000,000 Columns
                    50 bytes per Column

        Read first 100 Columns with start.
       Read middle 100 Columns with start.
CF read latency and start offset...
                                  First          MIddle

                      40,000



                      30,000
Latecy Microseconds




                      20,000



                      10,000



                          0
                           85th           95th            99th
When slicing...



 Reverse requires the Column
      index to be read.
Start offset tests...
                     1,000,000 Columns
                    50 bytes per Column

      Read first 100 Columns without start.
      Read last 100 Columns with reversed.
CF read latency and reversed...
                                  Forward          Reversed

                      40,000



                      30,000
Latecy Microseconds




                      20,000



                      10,000



                          0
                           85th             95th              99th
Aaron Morton
                     @aaronmorton
                   www.thelastpickle.com




Licensed under a Creative Commons Attribution-NonCommercial 3.0 New Zealand License

More Related Content

Similar to Cassandra SF 2012 - Technical Deep Dive: query performance

Honours Project Presentation
Honours Project PresentationHonours Project Presentation
Honours Project Presentationkarsithe
 
Pushing the limits of CAN - Scheduling frames with offsets provides a major p...
Pushing the limits of CAN - Scheduling frames with offsets provides a major p...Pushing the limits of CAN - Scheduling frames with offsets provides a major p...
Pushing the limits of CAN - Scheduling frames with offsets provides a major p...Nicolas Navet
 
Usenix LISA 2012 - Choosing a Proxy
Usenix LISA 2012 - Choosing a ProxyUsenix LISA 2012 - Choosing a Proxy
Usenix LISA 2012 - Choosing a ProxyLeif Hedstrom
 
Java Core | Understanding the Disruptor: a Beginner's Guide to Hardcore Concu...
Java Core | Understanding the Disruptor: a Beginner's Guide to Hardcore Concu...Java Core | Understanding the Disruptor: a Beginner's Guide to Hardcore Concu...
Java Core | Understanding the Disruptor: a Beginner's Guide to Hardcore Concu...JAX London
 
FlexSC: Exception-Less System Calls - presented @ OSDI 2010
FlexSC: Exception-Less System Calls - presented @ OSDI 2010FlexSC: Exception-Less System Calls - presented @ OSDI 2010
FlexSC: Exception-Less System Calls - presented @ OSDI 2010Livio Soares
 
Transactions and Concurrency Control Patterns
Transactions and Concurrency Control PatternsTransactions and Concurrency Control Patterns
Transactions and Concurrency Control PatternsJ On The Beach
 
Open Source Versions of Amazon's SNS and SQS.pptx
Open Source Versions of Amazon's SNS and SQS.pptxOpen Source Versions of Amazon's SNS and SQS.pptx
Open Source Versions of Amazon's SNS and SQS.pptxOpenStack Foundation
 
Webinar: Does it Still Make Sense to do Big Data with Small Nodes?
Webinar: Does it Still Make Sense to do Big Data with Small Nodes?Webinar: Does it Still Make Sense to do Big Data with Small Nodes?
Webinar: Does it Still Make Sense to do Big Data with Small Nodes?Julia Angell
 
Does it still make sense to do Big Data with Small Nodes?
Does it still make sense to do Big Data with Small Nodes? Does it still make sense to do Big Data with Small Nodes?
Does it still make sense to do Big Data with Small Nodes? ScyllaDB
 
A preliminary study of node js
A preliminary study of node jsA preliminary study of node js
A preliminary study of node jsfangdeng
 
Basic vbscript for qtp
Basic vbscript for qtpBasic vbscript for qtp
Basic vbscript for qtpCuong Tran Van
 
Text cnn on acme ugc moderation
Text cnn on acme ugc moderationText cnn on acme ugc moderation
Text cnn on acme ugc moderationMarsan Ma
 
When it Absolutely, Positively, Has to be There: Reliability Guarantees in Ka...
When it Absolutely, Positively, Has to be There: Reliability Guarantees in Ka...When it Absolutely, Positively, Has to be There: Reliability Guarantees in Ka...
When it Absolutely, Positively, Has to be There: Reliability Guarantees in Ka...confluent
 
Cassandra Compression and Performance Evaluation
Cassandra Compression and Performance EvaluationCassandra Compression and Performance Evaluation
Cassandra Compression and Performance EvaluationSchubert Zhang
 
Netflix at-disney-09-26-2014
Netflix at-disney-09-26-2014Netflix at-disney-09-26-2014
Netflix at-disney-09-26-2014Monal Daxini
 
SpeedIT : GPU-based acceleration of sparse linear algebra
SpeedIT : GPU-based acceleration of sparse linear algebraSpeedIT : GPU-based acceleration of sparse linear algebra
SpeedIT : GPU-based acceleration of sparse linear algebraUniversity of Zurich
 

Similar to Cassandra SF 2012 - Technical Deep Dive: query performance (20)

Honours Project Presentation
Honours Project PresentationHonours Project Presentation
Honours Project Presentation
 
Pushing the limits of CAN - Scheduling frames with offsets provides a major p...
Pushing the limits of CAN - Scheduling frames with offsets provides a major p...Pushing the limits of CAN - Scheduling frames with offsets provides a major p...
Pushing the limits of CAN - Scheduling frames with offsets provides a major p...
 
Usenix LISA 2012 - Choosing a Proxy
Usenix LISA 2012 - Choosing a ProxyUsenix LISA 2012 - Choosing a Proxy
Usenix LISA 2012 - Choosing a Proxy
 
Subnet (1)
Subnet (1)Subnet (1)
Subnet (1)
 
Java Core | Understanding the Disruptor: a Beginner's Guide to Hardcore Concu...
Java Core | Understanding the Disruptor: a Beginner's Guide to Hardcore Concu...Java Core | Understanding the Disruptor: a Beginner's Guide to Hardcore Concu...
Java Core | Understanding the Disruptor: a Beginner's Guide to Hardcore Concu...
 
FlexSC: Exception-Less System Calls - presented @ OSDI 2010
FlexSC: Exception-Less System Calls - presented @ OSDI 2010FlexSC: Exception-Less System Calls - presented @ OSDI 2010
FlexSC: Exception-Less System Calls - presented @ OSDI 2010
 
Transactions and Concurrency Control Patterns
Transactions and Concurrency Control PatternsTransactions and Concurrency Control Patterns
Transactions and Concurrency Control Patterns
 
Mcbelcb
McbelcbMcbelcb
Mcbelcb
 
Open Source Versions of Amazon's SNS and SQS.pptx
Open Source Versions of Amazon's SNS and SQS.pptxOpen Source Versions of Amazon's SNS and SQS.pptx
Open Source Versions of Amazon's SNS and SQS.pptx
 
C# Thread synchronization
C# Thread synchronizationC# Thread synchronization
C# Thread synchronization
 
Webinar: Does it Still Make Sense to do Big Data with Small Nodes?
Webinar: Does it Still Make Sense to do Big Data with Small Nodes?Webinar: Does it Still Make Sense to do Big Data with Small Nodes?
Webinar: Does it Still Make Sense to do Big Data with Small Nodes?
 
Does it still make sense to do Big Data with Small Nodes?
Does it still make sense to do Big Data with Small Nodes? Does it still make sense to do Big Data with Small Nodes?
Does it still make sense to do Big Data with Small Nodes?
 
Confaccesslists
ConfaccesslistsConfaccesslists
Confaccesslists
 
A preliminary study of node js
A preliminary study of node jsA preliminary study of node js
A preliminary study of node js
 
Basic vbscript for qtp
Basic vbscript for qtpBasic vbscript for qtp
Basic vbscript for qtp
 
Text cnn on acme ugc moderation
Text cnn on acme ugc moderationText cnn on acme ugc moderation
Text cnn on acme ugc moderation
 
When it Absolutely, Positively, Has to be There: Reliability Guarantees in Ka...
When it Absolutely, Positively, Has to be There: Reliability Guarantees in Ka...When it Absolutely, Positively, Has to be There: Reliability Guarantees in Ka...
When it Absolutely, Positively, Has to be There: Reliability Guarantees in Ka...
 
Cassandra Compression and Performance Evaluation
Cassandra Compression and Performance EvaluationCassandra Compression and Performance Evaluation
Cassandra Compression and Performance Evaluation
 
Netflix at-disney-09-26-2014
Netflix at-disney-09-26-2014Netflix at-disney-09-26-2014
Netflix at-disney-09-26-2014
 
SpeedIT : GPU-based acceleration of sparse linear algebra
SpeedIT : GPU-based acceleration of sparse linear algebraSpeedIT : GPU-based acceleration of sparse linear algebra
SpeedIT : GPU-based acceleration of sparse linear algebra
 

More from aaronmorton

Cassandra South Bay Meetup - Backup And Restore For Apache Cassandra
Cassandra South Bay Meetup - Backup And Restore For Apache CassandraCassandra South Bay Meetup - Backup And Restore For Apache Cassandra
Cassandra South Bay Meetup - Backup And Restore For Apache Cassandraaaronmorton
 
Cassandra SF Meetup - CQL Performance With Apache Cassandra 3.X
Cassandra SF Meetup - CQL Performance With Apache Cassandra 3.XCassandra SF Meetup - CQL Performance With Apache Cassandra 3.X
Cassandra SF Meetup - CQL Performance With Apache Cassandra 3.Xaaronmorton
 
Cassandra Day Atlanta 2016 - Monitoring Cassandra
Cassandra Day Atlanta 2016  - Monitoring CassandraCassandra Day Atlanta 2016  - Monitoring Cassandra
Cassandra Day Atlanta 2016 - Monitoring Cassandraaaronmorton
 
Cassandra London March 2016 - Lightening talk - introduction to incremental ...
Cassandra London March 2016  - Lightening talk - introduction to incremental ...Cassandra London March 2016  - Lightening talk - introduction to incremental ...
Cassandra London March 2016 - Lightening talk - introduction to incremental ...aaronmorton
 
Cassandra SF 2015 - Repeatable, Scalable, Reliable, Observable Cassandra
Cassandra SF 2015 - Repeatable, Scalable, Reliable, Observable CassandraCassandra SF 2015 - Repeatable, Scalable, Reliable, Observable Cassandra
Cassandra SF 2015 - Repeatable, Scalable, Reliable, Observable Cassandraaaronmorton
 
Cassandra sf 2015 - Steady State Data Size With Compaction, Tombstones, and TTL
Cassandra sf 2015 - Steady State Data Size With Compaction, Tombstones, and TTL Cassandra sf 2015 - Steady State Data Size With Compaction, Tombstones, and TTL
Cassandra sf 2015 - Steady State Data Size With Compaction, Tombstones, and TTL aaronmorton
 
Cassandra TK 2014 - Large Nodes
Cassandra TK 2014 - Large NodesCassandra TK 2014 - Large Nodes
Cassandra TK 2014 - Large Nodesaaronmorton
 
Cassandra Community Webinar August 29th 2013 - In Case Of Emergency, Break Glass
Cassandra Community Webinar August 29th 2013 - In Case Of Emergency, Break GlassCassandra Community Webinar August 29th 2013 - In Case Of Emergency, Break Glass
Cassandra Community Webinar August 29th 2013 - In Case Of Emergency, Break Glassaaronmorton
 
Cassandra Community Webinar - August 22 2013 - Cassandra Internals
Cassandra Community Webinar - August 22 2013 - Cassandra InternalsCassandra Community Webinar - August 22 2013 - Cassandra Internals
Cassandra Community Webinar - August 22 2013 - Cassandra Internalsaaronmorton
 
Cassandra SF 2013 - In Case Of Emergency Break Glass
Cassandra SF 2013 - In Case Of Emergency Break GlassCassandra SF 2013 - In Case Of Emergency Break Glass
Cassandra SF 2013 - In Case Of Emergency Break Glassaaronmorton
 
Cassandra SF 2013 - Cassandra Internals
Cassandra SF 2013 - Cassandra InternalsCassandra SF 2013 - Cassandra Internals
Cassandra SF 2013 - Cassandra Internalsaaronmorton
 
Cassandra Community Webinar - Introduction To Apache Cassandra 1.2
Cassandra Community Webinar  - Introduction To Apache Cassandra 1.2Cassandra Community Webinar  - Introduction To Apache Cassandra 1.2
Cassandra Community Webinar - Introduction To Apache Cassandra 1.2aaronmorton
 
Apache Cassandra in Bangalore - Cassandra Internals and Performance
Apache Cassandra in Bangalore - Cassandra Internals and PerformanceApache Cassandra in Bangalore - Cassandra Internals and Performance
Apache Cassandra in Bangalore - Cassandra Internals and Performanceaaronmorton
 
Apache Con NA 2013 - Cassandra Internals
Apache Con NA 2013 - Cassandra InternalsApache Con NA 2013 - Cassandra Internals
Apache Con NA 2013 - Cassandra Internalsaaronmorton
 
Hello @world #cassandra
Hello @world #cassandraHello @world #cassandra
Hello @world #cassandraaaronmorton
 
Cassandra does what ? Code Mania 2012
Cassandra does what ? Code Mania 2012Cassandra does what ? Code Mania 2012
Cassandra does what ? Code Mania 2012aaronmorton
 
Nzpug welly-cassandra-02-12-2010
Nzpug welly-cassandra-02-12-2010Nzpug welly-cassandra-02-12-2010
Nzpug welly-cassandra-02-12-2010aaronmorton
 
Introduction to Cassandra
Introduction to CassandraIntroduction to Cassandra
Introduction to Cassandraaaronmorton
 
Building a distributed Key-Value store with Cassandra
Building a distributed Key-Value store with CassandraBuilding a distributed Key-Value store with Cassandra
Building a distributed Key-Value store with Cassandraaaronmorton
 
Cassandra - Wellington No Sql
Cassandra - Wellington No SqlCassandra - Wellington No Sql
Cassandra - Wellington No Sqlaaronmorton
 

More from aaronmorton (20)

Cassandra South Bay Meetup - Backup And Restore For Apache Cassandra
Cassandra South Bay Meetup - Backup And Restore For Apache CassandraCassandra South Bay Meetup - Backup And Restore For Apache Cassandra
Cassandra South Bay Meetup - Backup And Restore For Apache Cassandra
 
Cassandra SF Meetup - CQL Performance With Apache Cassandra 3.X
Cassandra SF Meetup - CQL Performance With Apache Cassandra 3.XCassandra SF Meetup - CQL Performance With Apache Cassandra 3.X
Cassandra SF Meetup - CQL Performance With Apache Cassandra 3.X
 
Cassandra Day Atlanta 2016 - Monitoring Cassandra
Cassandra Day Atlanta 2016  - Monitoring CassandraCassandra Day Atlanta 2016  - Monitoring Cassandra
Cassandra Day Atlanta 2016 - Monitoring Cassandra
 
Cassandra London March 2016 - Lightening talk - introduction to incremental ...
Cassandra London March 2016  - Lightening talk - introduction to incremental ...Cassandra London March 2016  - Lightening talk - introduction to incremental ...
Cassandra London March 2016 - Lightening talk - introduction to incremental ...
 
Cassandra SF 2015 - Repeatable, Scalable, Reliable, Observable Cassandra
Cassandra SF 2015 - Repeatable, Scalable, Reliable, Observable CassandraCassandra SF 2015 - Repeatable, Scalable, Reliable, Observable Cassandra
Cassandra SF 2015 - Repeatable, Scalable, Reliable, Observable Cassandra
 
Cassandra sf 2015 - Steady State Data Size With Compaction, Tombstones, and TTL
Cassandra sf 2015 - Steady State Data Size With Compaction, Tombstones, and TTL Cassandra sf 2015 - Steady State Data Size With Compaction, Tombstones, and TTL
Cassandra sf 2015 - Steady State Data Size With Compaction, Tombstones, and TTL
 
Cassandra TK 2014 - Large Nodes
Cassandra TK 2014 - Large NodesCassandra TK 2014 - Large Nodes
Cassandra TK 2014 - Large Nodes
 
Cassandra Community Webinar August 29th 2013 - In Case Of Emergency, Break Glass
Cassandra Community Webinar August 29th 2013 - In Case Of Emergency, Break GlassCassandra Community Webinar August 29th 2013 - In Case Of Emergency, Break Glass
Cassandra Community Webinar August 29th 2013 - In Case Of Emergency, Break Glass
 
Cassandra Community Webinar - August 22 2013 - Cassandra Internals
Cassandra Community Webinar - August 22 2013 - Cassandra InternalsCassandra Community Webinar - August 22 2013 - Cassandra Internals
Cassandra Community Webinar - August 22 2013 - Cassandra Internals
 
Cassandra SF 2013 - In Case Of Emergency Break Glass
Cassandra SF 2013 - In Case Of Emergency Break GlassCassandra SF 2013 - In Case Of Emergency Break Glass
Cassandra SF 2013 - In Case Of Emergency Break Glass
 
Cassandra SF 2013 - Cassandra Internals
Cassandra SF 2013 - Cassandra InternalsCassandra SF 2013 - Cassandra Internals
Cassandra SF 2013 - Cassandra Internals
 
Cassandra Community Webinar - Introduction To Apache Cassandra 1.2
Cassandra Community Webinar  - Introduction To Apache Cassandra 1.2Cassandra Community Webinar  - Introduction To Apache Cassandra 1.2
Cassandra Community Webinar - Introduction To Apache Cassandra 1.2
 
Apache Cassandra in Bangalore - Cassandra Internals and Performance
Apache Cassandra in Bangalore - Cassandra Internals and PerformanceApache Cassandra in Bangalore - Cassandra Internals and Performance
Apache Cassandra in Bangalore - Cassandra Internals and Performance
 
Apache Con NA 2013 - Cassandra Internals
Apache Con NA 2013 - Cassandra InternalsApache Con NA 2013 - Cassandra Internals
Apache Con NA 2013 - Cassandra Internals
 
Hello @world #cassandra
Hello @world #cassandraHello @world #cassandra
Hello @world #cassandra
 
Cassandra does what ? Code Mania 2012
Cassandra does what ? Code Mania 2012Cassandra does what ? Code Mania 2012
Cassandra does what ? Code Mania 2012
 
Nzpug welly-cassandra-02-12-2010
Nzpug welly-cassandra-02-12-2010Nzpug welly-cassandra-02-12-2010
Nzpug welly-cassandra-02-12-2010
 
Introduction to Cassandra
Introduction to CassandraIntroduction to Cassandra
Introduction to Cassandra
 
Building a distributed Key-Value store with Cassandra
Building a distributed Key-Value store with CassandraBuilding a distributed Key-Value store with Cassandra
Building a distributed Key-Value store with Cassandra
 
Cassandra - Wellington No Sql
Cassandra - Wellington No SqlCassandra - Wellington No Sql
Cassandra - Wellington No Sql
 

Recently uploaded

Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 

Recently uploaded (20)

Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 

Cassandra SF 2012 - Technical Deep Dive: query performance

  • 1. TECHNICAL DEEP DIVE: QUERY PERFORMANCE CASSANDRA SF 2012 Aaron Morton, Apache Cassandra Committer @aaronmorton www.thelastpickle.com Licensed under a Creative Commons Attribution-NonCommercial 3.0 New Zealand License
  • 2. Today. Write Path Read Path
  • 4. Standard write path... 1. Append to Commit Log 2. Merge with Memtable
  • 5. Blast through the thin Martian atmosphere! (Also time to synchronise around the commit log.)
  • 6. Write path details... Acquire read lock from server wide read-write switchLock.
  • 7. Memtable flush path acquires the write lock from switchLock.
  • 8. Flush will block if memtable_flush_queue_s ize Memtables are waiting to flush.
  • 9. memtable_flush_queue_size test... m1.xlarge Cassandra node m1.xlarge client node 1 CF with 6 Secondary Indexes 1 Client Thread 10,000 Inserts, 100 Columns per Row 1100 bytes per Column
  • 10. memtable_flush_queue_size test... create column family WithIndex with comparator = AsciiType and default_validation_class = AsciiType and key_validation_class = AsciiType and max_compaction_threshold = 0 and min_compaction_threshold = 0 and compression_options = null and column_metadata [{ column_name : 0000000000, validation_class : AsciiType, index_type : 0, index_name : 0000000000},
  • 11. CF write latency and memtable_flush_queue_size... memtable_flush_queue_size=7 memtable_flush_queue_size=1 1,200 900 Latency Microseconds 600 300 0 85th 95th 99th 100th
  • 12. Request latency and memtable_flush_queue_size... memtable_flush_queue_size=7 memtable_flush_queue_size=1 5,000,000 3,750,000 Latecy Microseconds 2,500,000 1,250,000 0 85th 95th 99th 100th
  • 13. Deploy the Hypersonic parachute! (Also time to write to the CommitLog.)
  • 14. Commit Log... Write to CommitLog if Keyspace wide durable_writes is enabled. (Enabled by default.)
  • 15. durable_writes test... 10,000 Inserts, 50 Columns per Row 50 bytes per Column
  • 16. Request latency and durable_writes (1 client)... enabled disabled 7,000 5,250 Latency Microseconds 3,500 1,750 0 85th 95th 99th
  • 17. Request latency and durable_writes (10 clients)... enabled disabled 30,000 22,500 Latency Microseconds 15,000 7,500 0 85th 95th 99th
  • 18. Request latency and durable_writes (20 clients)... enabled disabled 90,000 67,500 Latency Microseconds 45,000 22,500 0 85th 95th 99th
  • 19. CommitLog has either periodic or batch file syncing. (Periodic with fsync every 10 seconds is default.)
  • 20. periodic commit log adds mutation to queue then acknowledges. Commit Log is appended to by a single thread, sync is called every commitlog_sync_period_in_ms.
  • 21. CommitLog tests... 10,000 Inserts, 50 Columns per Row 50 bytes per Column
  • 22. Request latency and commitlog_sync_period_in_ms... 10,000 ms 10 ms 220 208 Latecy Microseconds 195 183 170 85th 95th 99th
  • 23. batch commit log adds mutation to queue and waits before acknowledging. Writer thread processes mutations for commitlog_sync_batch_window_in_ms duration, then syncs, then signals.
  • 24. Request latency and commitlog_sync_batch_window_in_ms... 50 ms 0 ms 800 750 Latecy Microseconds 700 650 600 85th 95th 99th
  • 25. Request latency comparing periodic and batch sync... periodic batch 800 600 Latecy Microseconds 400 200 0 85th 95th 99th
  • 26. Engage the rocket powered sky crane! (Also time to merge the mutation with the current Memtable.)
  • 27. Merge mutation... Row level Isolation provided via SnapTree. (https://github.com/nbronson/snaptree)
  • 28. 00 REM Cassandra for C64 05 REM Clone row_cols into my_cols 10 GOSUB 1000 20 FOR col = write.first_col TO write.last_col 25 REM Add or Reconcile col with my_cols 30 GOSUB 2000 40 IF my_cols != row_cols THEN GOTO 05 50 NEXT col 55 REM Atomic swap row_cols with my_cols 60 GOSUB 3000 70 IF swapped_cols = FALSE THEN GOTO 05
  • 29. Row concurrency tests... 10,000 Columns per Row 50 bytes per Column 50 Columns per Insert
  • 30. CF Write Latency and row concurrency (10 clients)... different rows single row 2,000 1,500 Latecy Microseconds 1,000 500 0 85th 95th 99th
  • 31. Write path with KEYS secondary indexes... 1. Append to Commit Log 2. Read modified Index Columns 3. Merge with Memtable 4. Update Secondary Indexes
  • 32. Secondary Indexes... synchronized access to indexed rows. (Keyspace wide)
  • 33. Index concurrency tests... CF with 2 Indexes 10,000 Inserts 6 Columns per Row 35 bytes per Column Alternating column values
  • 34. Request latency and index concurrency (10 clients)... different rows single row 4,000 3,000 Latecy Microseconds 2,000 1,000 0 85th 95th 99th
  • 35. Read modified indexed columns or all for row deletion.
  • 36. Insert or delete changes to index rows.
  • 37. Index tests... 10,000 Inserts 50 Columns per Row 50 bytes per Column
  • 38. Request latency and secondary indexes... no indexes six indexes 3,000 2,250 Latecy Microseconds 1,500 750 0 85th 95th 99th
  • 39. Today Write Path Read Path
  • 40. Two read paths... SliceByNamesReadCommand SliceFromReadCommand
  • 41. Locating row start per SSTable... 1. Check BloomFilter 2. Read KeyCache 3. Read Index Samples, seek and partial scan -Index.db (Step 3 only used if KeyCache lookup missed.)
  • 42. Column Family bloom_filter_fp_chance controls BloomFilter effectiveness.
  • 43. bloom_filter_fp_chance tests... 1,000,000 Rows 50 Columns per Row 50 bytes per Column commitlog_total_space_in_mb: 1 Read random 10% of rows.
  • 44. CF read latency and bloom_filter_fp_chance... default 0.000744. 0.1 7,000 5,250 Latecy Microseconds 3,500 1,750 0 85th 95th 99th
  • 45. SSTables per read and bloom_filter_fp_chance (14 SStables)... default 0.000744. 0.1 1 1 SSTables per Read 1 0 0 85th 95th 99th
  • 46. Bloom Filter False Ratio and bloom_filter_fp_chance... default 0.000744. 0.1 1 1 False Positive Ratio 0 0 0
  • 48. key_cache_size_in_mb tests... 10,000 Rows 50 Columns per Row 50 bytes per Column Read all Rows
  • 49. CF read latency and key_cache_size_in_mb... default (100MB) 100% Hit Rate disabled 300 225 Latecy Microseconds 150 75 0 85th 95th 99th
  • 50. index_interval controls the size of the -Index.db sampling.
  • 51. index_interval tests... 100,000 Rows 50 Columns per Row 50 bytes per Column key_cache_size_in_mb: 0 Read 1 Column from random 10% of Rows
  • 52. CF read latency and index_interval... index_interval=128 (default) index_interval=512 20,000 15,000 Latecy Microseconds 10,000 5,000 0 85th 95th 99th
  • 53. Row Cache removes all disk IO.
  • 54. row_cache_size_in_mb controls the size of Row Cache.
  • 55. row_cache_size_in_mb tests... 100,000 Rows 50 Columns per Row 50 bytes per Column Read all Rows
  • 56. CF read latency and row_cache_size_in_mb... row_cache_size_in_mb=0 and key_cache_size_in_mb=100mb row_cache_size_in_mb=100mb and key_cache_size_in_mb=0 260 195 Latecy Microseconds 130 65 0 85th 95th 99th
  • 57. Slice by Name (excluding Counter Columns)... 1. Order SSTables by maxTimestamp. 2. Break if SSTable covered by previous Row Tombstone. 3. Remove irrelevant Columns from query. 4. Eagerly read Columns from SSTable. 5. Hoist Columns into current Size Tier.
  • 58. When reading by Column name... A query on a wide row must read the entire Column Index.
  • 59. Column Index tests... Read first Column by name from 1,200 Columns. Read first Column by name from 1,000,000 Columns.
  • 60. CF read latency and Column Index... First Column from 1,200 First Column from 1,000,000 6,000 4,500 Latecy Microseconds 3,000 1,500 0 85th 95th 99th
  • 61. When reading by Column name... A narrow query on a wide row performs better.
  • 62. Name Locality tests... 1,000,000 Columns 50 bytes per Column Read 100 Columns from middle of row. Read 100 Columns from spread across row.
  • 63. CF read latency and name locality... Adjacent Columns Spread Columns 200,000 150,000 Latecy Microseconds 100,000 50,000 0 85th 95th 99th
  • 64. Slice... 1. Skip if SSTable covered by previous Row Tombstone. 2. Read and merge Columns from SSTable. (May be eager or lazy reading)
  • 65. When slicing... A query using natural Column order without a start has the highest performance.
  • 66. Start position tests... 1,000,000 Columns 50 bytes per Column Read first 100 Columns without start. Read first 100 Columns with start.
  • 67. CF read latency and start position... Without start position With start position 40,000 30,000 Latecy Microseconds 20,000 10,000 0 85th 95th 99th
  • 68. When slicing... Any start column requires the Column index to be read.
  • 69. Start offset tests... 1,000,000 Columns 50 bytes per Column Read first 100 Columns with start. Read middle 100 Columns with start.
  • 70. CF read latency and start offset... First MIddle 40,000 30,000 Latecy Microseconds 20,000 10,000 0 85th 95th 99th
  • 71. When slicing... Reverse requires the Column index to be read.
  • 72. Start offset tests... 1,000,000 Columns 50 bytes per Column Read first 100 Columns without start. Read last 100 Columns with reversed.
  • 73. CF read latency and reversed... Forward Reversed 40,000 30,000 Latecy Microseconds 20,000 10,000 0 85th 95th 99th
  • 74. Aaron Morton @aaronmorton www.thelastpickle.com Licensed under a Creative Commons Attribution-NonCommercial 3.0 New Zealand License

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n