question

sopelkin.sam_192825 avatar image
sopelkin.sam_192825 asked sopelkin.sam_192825 published

How can we optimize sequential reads of rows in a partition?

Добрый день.
Пытаюсь оптимизировать последовательное чтение данных из кластера.

Имеем вот такой ddl:

CREATE KEYSPACE storage WITH REPLICATION = {'class': 'org.apache.cassandra.locator.NetworkTopologyStrategy', 'hetzner': '3'}
CREATE TABLE orderbook ( 
  exchange text, 
  instrument text, 
  operatedate date, 
  instant time, 
  complete boolean, 
  sizepricemap map<decimal, decimal>, 
PRIMARY KEY ((exchange, instrument, operatedate), instant) )

партишены получаются от 2 до 900 Мб. С записью всё шикарно 5 нод в дц отрабатывают отлично на запись с consistency_level: TWO.

А вот при последовательном чтении утыкаюсь в проблемы.

Пытаюсь через project-reactor + reactive JPA читать данные последовательно за несколько месяцев опираясь на operatedate и instant.

Запросы получаются примерно такие:

SELECT * FROM orderbook WHERE exchange=? AND instrument=? AND operatedate=? AND instant>=82800000000000 AND instant<=83700000000000;

Читаем с ConsistencyLevel.LOCAL_ONE.
Приложение крутиться на соседней ноде в том же дц.

При этом SlowQuery log регулярно сообщает вот такое:

QueryLogger.SLOW : [cluster1] [/10.0.0.4:9042] Query too slow, took 6846 ms: SELECT * FROM orderbookevent WHERE exchange=? AND instrument=? AND operatedate=? AND instant>=82800000000000 AND instant<=83700000000000; ['bitmex', 'XBTUSD', '2020-05-31']

Подскажите как такие ситуации можно оптимизировать?
Может быть есть возможность посмотреть некоторый ExecutionPlan?
который даст инсайты о том почему мы так долго выбираем эти данные.

cassandraperformanceread path
15 comments
10 |1000

Up to 8 attachments (including images) can be used with a maximum of 1.0 MiB each and 10.0 MiB total.

alex.ott avatar image alex.ott commented ·

Какая версия Cassandra, что за железо используется, сколько памяти вообще и сколько для heap, какой GC? вообще-то можно включить трейсинг для statement, и посмотреть как оно отрабатывается... также надо посмотреть на nodetool proxyhistograms, nodetool tablehistograms keyspace table...

0 Likes 0 ·
sopelkin.sam_192825 avatar image sopelkin.sam_192825 alex.ott commented ·

1. CASSANDRA_VERSION=3.11.4

2. VPS with 8Gb Memory and 2 vCPU (Intel Xeon Processor (Skylake, IBRS) cpu MHz : 2100.000)

3. 8 Gb Total and -Xms4G -Xmx4G

4. ParallelGC

0 Likes 0 ·
sopelkin.sam_192825 avatar image sopelkin.sam_192825 sopelkin.sam_192825 commented ·

Range Latency, CAS Read Latency, CAS Write Latency, View Write Latency - по нулям. И если мне не изменяет память эту ноду вчера вывели и сейчас вводят обратно.

root@cassandra-node-1:/# nodetool proxyhistograms
proxy histograms
Percentile       Read Latency      Write Latency
                     (micros)           (micros)
50%                   1358.10            1131.75
75%                   3379.39            1358.10
95%                  12108.97            3379.39
98%                  52066.35            4055.27
99%                  52066.35            7007.51
Min                    152.32             454.83
Max                 223875.79           25109.16 
0 Likes 0 ·
Show more comments
sopelkin.sam_192825 avatar image sopelkin.sam_192825 alex.ott commented ·
root@cassandra-node-1:/# nodetool tablehistograms storage orderbook
storage/orderbook histograms
Percentile SSTables  Write Latency   Read Latency Partition Size   Cell Count
                          (micros)       (micros)        (bytes)               
50%            2.00          61.21        8409.01       17436917      1131752
75%            2.00          88.15       36157.19      129557750      7007506
95%            3.00         126.93      268650.95      668489532     36157190
98%            3.00         152.32      268650.95      962624926     52066354
99%            3.00         219.34      268650.95     1386179893     74975550
Min            0.00           4.77         545.79             36            0
Max            3.00        8409.01      268650.95     2874382626    155469300
0 Likes 0 ·
sopelkin.sam_192825 avatar image sopelkin.sam_192825 sopelkin.sam_192825 commented ·
root@cassandra-node-2:/# nodetool tablehistograms storage orderbook
storage/orderbook histograms
Percentile SSTables     Write        Read       PartSize  Cell Count
                     (micros)    (micros)        (bytes)                  
50%            2.00     51.01    43388.63       17436917     1131752
75%            2.00     61.21   155469.30      107964792     5839588
95%            4.00     88.15  3449259.15      668489532    36157190
98%            5.00    105.78  4139110.98      962624926    52066354
99%            5.00    126.93  4966933.18     1386179893    62479625
Min            2.00      3.31      454.83             36           0
Max            5.00  62479.63  4966933.18     2874382626   155469300
0 Likes 0 ·
Show more comments
sopelkin.sam_192825 avatar image sopelkin.sam_192825 alex.ott commented ·

>> вообще-то можно включить трейсинг для statement, и посмотреть как оно отрабатывается...

А можно тут чуть подробнее? ))

0 Likes 0 ·
alex.ott avatar image alex.ott sopelkin.sam_192825 commented ·

можно запустить cqlsh там сделать tracing on;, и выполнить запрос. Из кода, это можно сделать через statement.enableTracing();: https://docs.datastax.com/en/drivers/java/3.8/

0 Likes 0 ·

1 Answer

alex.ott avatar image
alex.ott answered

Честно говоря, инстанс просто очень слабый - не хватает процессора, и памяти, особенно при разделах до 900Мб - для GC нужны треды, для чтения и записи нужны треды, и т.д. Запись происходит быстро поскольку оно пишет в память. Хотя информации по дискам нет, я подозреваю что для VPS используются либо жесткие диски, или если это в облаке, volume с недостаточным IOPS.

Вот тут можно посмотреть рекомендации по железу для production, и вот рекомендации по AWS EC2 - они более менее применимы для всех облачных провайдеров

Также надо посмотреть на настройку линукса - по нашей документации (5.1 ~= 3.11).

Share
10 |1000

Up to 8 attachments (including images) can be used with a maximum of 1.0 MiB each and 10.0 MiB total.