из сборки в мастере, и либо я что-то не так делаю, либо одно из двух:
Код для inserter.go из теста: https://gist.github.com/YuriyNasretdinov/63dcc5bd129c1fdd4d35628c6a30cd1a
Вот цифры для kittenhouse -p 8124 -reverse -ch-addr=127.0.0.1:8123 -u= -g= на 16-ядерной виртуалке:
$ go run inserter.go -addr=127.0.0.1:8124 -requests=500 -concurrency=5000
2021/10/19 23:17:49 Sending 500 requests to "http://127.0.0.1:8124/?query=INSERT%20INTO%20InsertTest_buffer(id)%20VALUES" with concurrency 5000
2021/10/19 23:18:07 QPS: 133322.9 (for 18.751460918s)
$ clickhouse-client
ClickHouse client version 21.11.1.8486 (official build).
Connected to ClickHouse server version 21.11.1 revision 54450.
┌─count()─┐
│ 2500000 │
└─────────┘
Вот цифры для асинхронной вставки в самом ClickHouse (конкурентность пришлось уменьшить, потому что, кажется, больше 1000 всё равно не поддерживается пока что):
$ go run inserter.go -addr=127.0.0.1:8123 -clickhouse-async -requests=500 -concurrency=500
2021/10/19 23:21:54 Sending 500 requests to "http://127.0.0.1:8123/?wait_for_async_insert=0&async_insert=1&query=INSERT%20INTO%20InsertTest_buffer(id)%20VALUES" with concurrency 500
2021/10/19 23:22:26 QPS: 7832.4 (for 31.918566481s)
$ clickhouse-client
🙂 select count() from InsertTest_buffer;
...
┌─count()─┐
│ 0 │
└─────────┘
1 rows in set. Elapsed: 0.001 sec.
^ по факту, при вставке в ClickHouse с опциями wait_for_async_insert=0&async_insert=1 отдается ошибка Response: Code: 73. DB::Exception: Unknown input format . (UNKNOWN_FORMAT) (version 21.11.1.8486 (official build)), а когда вставляешь без этих аргументов, то всё нормально:
```
go run inserter.go -addr=127.0.0.1:8123 -requests=50000 -concurrency=10
2021/10/19 23:27:21 Sending 50000 requests to "http://127.0.0.1:8123/?query=INSERT%20INTO%20InsertTest_buffer(id)%20VALUES" with concurrency 10
2021/10/19 23:28:22 QPS: 8173.2 (for 1m1.175656278s)
nasretdinov@clickhouse-bench:~/kittenhouse-vs-bulk/inserter$ clickhouse-client
ClickHouse client version 21.11.1.8486 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 21.11.1 revision 54450.
clickhouse-bench.europe-west4-a.c.studious-stack-249419.internal :) select count() from InsertTest_buffer;
...
┌─count()─┐
│ 500000 │
└─────────┘
```
В любом случае, kittenhouse в режиме reverse proxy вставляет порядка 130к строк в секунду, когда бенчмарк запущен на локальной 16-ядерной машине, а clickhouse-benchmark выдавал около 11k QPS на той же машине:
$ clickhouse-benchmark --wait_for_async_insert=0 --async_insert=1 -c64 <<< 'insert into InsertTest format TSV 1'
localhost:9000, queries 36651, QPS: 11601.953, RPS: 0.000, MiB/s: 0.000, result RPS: 0.000, result MiB/s: 0.000.
Структура таблицы:
create table InsertTest (id Int) ENGINE=MergeTree ORDER BY id;
CREATE TABLE default.InsertTest_buffer(id Int32) ENGINE = Buffer('default', 'InsertTest', 2, 15, 15, 10000000, 10000000, 100000000, 100000000)
Unknown input format я уже тоже нашел и зарепортил
Сделал небольшое видео с бенчмарком режима асинхронной вставки в ClickHouse и сравнение с kittenhouse в режиме reverse proxy для случая, когда хочется вставлять по одной строке (что в целом обычно плохая идея для OLAP базы, даже такой быстрой, как ClickHouse :)): https://www.youtube.com/watch?v=1tYev6PEJXU Кажется, особого прироста от асинхронного режима нет по сравнению с буферной таблицей (кроме того, что вставка по умолчанию буферизует синхронно, тут за это большой респект, но бенчмаркать вставку по одной строке это мешает, потому что тогда конкурентность вставки должна быть очень высокой, а это ClickHouse как-то не особо любит). Возможно, я что-то не так сравнивал, хотя вроде бы в SHOW PROCESSLIST действительно показывались треды, которые осуществляют асинхронную вставку, так что всё же должно быть правильно. Интересно услышать ваши отзывы!
Да, там есть некоторые ограничение в производительности http сервера кх.
Обсуждают сегодня