The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск компактной встраиваемой СУБД libmdbx 0.9.1, opennews (ok), 30-Сен-20, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


14. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от x3who (?), 01-Окт-20, 00:25 
Были случаи использования этого в микроконтроллерах? Ну там дейталоггеры какие-нибудь? В таких применениях производительность критична даже не потому, что это время, а потому, что это микроватты-милли-ватты, от которых зависит самый дорогой на Земле ресурс - батарейка, или самый дорргой в космосе - охлаждение.
Ответить | Правка | Наверх | Cообщить модератору

15. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от erthink (ok), 01-Окт-20, 00:40 
Половина (связанных с производительностью) бонусов libmdbx происходит от отображения файла БД в память и последующего совместного использования несколькими процессами. Такие сценарии достаточно далеки от среднего микроконтроллера, у большинства из которых нет MMU.

Тем не менее, если взять некий "микроконтроллер" где работает buildroot, то (скорее всего) libmdbx будет там работать. Но мне о таких запусках ничего не известно, и в целом "СУБД" и "микроконтроллер" не выглядят рациональной парой.

Ответить | Правка | Наверх | Cообщить модератору

16. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от x3who (?), 01-Окт-20, 00:50 
Это для чтения, писатель, как я понимаю, там предполагается один. Или в варианте с ограниченной RAM выигрыш в производятельно
сти пропадает?
Ответить | Правка | Наверх | Cообщить модератору

17. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от erthink (ok), 01-Окт-20, 01:01 
> Это для чтения, писатель, как я понимаю, там предполагается один. Или в
> варианте с ограниченной RAM выигрыш в производятельно
> сти пропадает?

Если ОЗУ мало, то БД просто некуда mmap-ить.
Т.е. если ОЗУ недостаточно, то будут постоянные page faults.
И это при условии что есть MMU для управления виртуальной памятью.

Если же ОЗУ достаточно, то будет работать и без MMU (собственно зависит от ОС, включая наличие/отсутствие unified page cache).

Но в половине микроконтроллеров вообще нет "дисков" и полноценной файловой системы, только некий минимум для загрузки и обновления прошивки на флешке.

Ответить | Правка | Наверх | Cообщить модератору

42. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от x3who (?), 03-Окт-20, 01:13 
>> Это для чтения, писатель, как я понимаю, там предполагается один. Или в
>> варианте с ограниченной RAM выигрыш в производятельно
>> сти пропадает?
> Если ОЗУ мало, то БД просто некуда mmap-ить.
> Т.е. если ОЗУ недостаточно, то будут постоянные page faults.
> И это при условии что есть MMU для управления виртуальной памятью.
> Если же ОЗУ достаточно, то будет работать и без MMU (собственно зависит
> от ОС, включая наличие/отсутствие unified page cache).
> Но в половине микроконтроллеров вообще нет "дисков" и полноценной файловой системы, только
> некий минимум для загрузки и обновления прошивки на флешке.

Диск - это абстракция более высокого уровня. Сам микроконтроллер ничего про диски не знает, как и персональный компъютер или мобилка или сервер какой. Но у людей регулярно встречаются задачи записывать куда-то какую-то структурированную информацию. Поэтому логично возникает вопрос - а нельзя ли присобачить эту БД к логгингу, и если можно - то какие требования к железу.

Ответить | Правка | Наверх | Cообщить модератору

44. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +1 +/
Сообщение от erthink (ok), 03-Окт-20, 15:19 
> Диск - это абстракция более высокого уровня. Сам микроконтроллер ничего про диски
> не знает, как и персональный компъютер или мобилка или сервер какой.
> Но у людей регулярно встречаются задачи записывать куда-то какую-то структурированную
> информацию. Поэтому логично возникает вопрос - а нельзя ли присобачить эту
> БД к логгингу, и если можно - то какие требования к
> железу.

Чтобы использовать libmdbx как есть, без каких-либо доработок, то от системы требуется поддержка mmap() и PTHREAD_MUTEX_ROBUST. Проще говоря, если на микроконтроллере есть MMU и можно запустить linux (buildroot и т.п.).

При необходимости, конечно, можно портировать libmdbx на более слабые платформы, в том числе на "голое железо". Требуется не так уж много (32-битный процессор, мегабайт ОЗУ и блочный обмен с "диском"). Грубо говоря, достаточно реализовать соответствующие функции libc.

Ответить | Правка | Наверх | Cообщить модератору

46. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от x3who (?), 04-Окт-20, 01:49 
> При необходимости, конечно, можно портировать libmdbx на более слабые платформы, в том
> числе на "голое железо". Требуется не так уж много (32-битный процессор,
> мегабайт ОЗУ и блочный обмен с "диском"). Грубо говоря, достаточно реализовать
> соответствующие функции libc.

Не, мегабайт жирновато для _микро_-контроллера :)

Но вообще код интересный, нашел в src/osal.c код, который ммапит файл. Даже не знал, что в венде это есть - теперь знаю где посмотреть пример.

Ответить | Правка | Наверх | Cообщить модератору

48. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от n80 (?), 04-Окт-20, 03:19 
offtop/2: если что, в sqlite3 есть PRAGMA mmap_size=x. Насколько помню, по умолчанию там 0, т.е. mmap не используется. Как-то раз удавалось за счёт включения этой настройки немного ускорить существующую базу. В репозитории ioarena не нашёл упоминания mmap_size, т.е. возможно что этот момент был упущен.
Ответить | Правка | К родителю #15 | Наверх | Cообщить модератору

50. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от erthink (ok), 06-Окт-20, 15:09 
> offtop/2: если что, в sqlite3 есть PRAGMA mmap_size=x. Насколько помню, по умолчанию
> там 0, т.е. mmap не используется. Как-то раз удавалось за счёт
> включения этой настройки немного ускорить существующую базу. В репозитории ioarena не
> нашёл упоминания mmap_size, т.е. возможно что этот момент был упущен.

mmap в sqlite будет немного ускорять чтение, за счет потенциального "расширения" page cache на весь объем данных. Но libmdbx тут (в сценариях интенсивного чтения) всё равно _всегда_ в разы быстрее, ибо примерно совсем не выполняет лишних операций (минимум накладных расходов). В Сети можно найти достаточно результатов бенчмарков (sqlite vs LMDB) подтверждающих это. Навскидку вот один из них https://hsto.org/webt/uw/du/4z/uwdu4zfgewvmqwkzuzaszja_qeq.png (фон прозначный, в зависимости от браузера может получится черное на черном).

В сценариях с интенсивной записью/обновлением (в том числе в показанных ранее CRUD) mmap существенного влияния не окажет. На всякий добавил прагму в драйвер ioarena и повторил один из тестов.

Патч:
```
diff --git a/src/drivers/ia_sqlite3.c b/src/drivers/ia_sqlite3.c
index 96a3e45..cad1c30 100644
--- a/src/drivers/ia_sqlite3.c
+++ b/src/drivers/ia_sqlite3.c
@@ -77,7 +77,7 @@ static int ia_sqlite3_open(const char *datadir) {
     snprintf(cmd_buf, CMD_SIZE, "PRAGMA journal_mode=%s;", "WAL");
     break;
   case IA_WAL_OFF:
-    snprintf(cmd_buf, CMD_SIZE, "PRAGMA journal_mode=%s;", "OFF");
+    snprintf(cmd_buf, CMD_SIZE, "PRAGMA journal_mode=%s; PRAGMA mmap_size=%u;", "OFF", 1024*1024*512);
     break;
   default:
     ia_log("error: %s(): unsupported walmode %s", __func__,

```

Результат:
```
$ NN=25000000 BENCH_CRUD_MODE=nosync make bench-triplet
[...]
LD_LIBRARY_PATH="./:${LD_LIBRARY_PATH}" ../ioarena/@BUILD/src/ioarena -D sqlite3 -B crud -m nosync -n 25000000 | tee bench-sqlite3_25000000.txt | grep throughput && LD_LIBRARY_PATH="./:${LD_LIBRARY_PATH}" ../ioarena/@BUILD/src/ioarena -D sqlite3 -B get,iterate -m nosync -r 4 -n 25000000 | tee -a bench-sqlite3_25000000.txt | grep throughput || mv -f bench-sqlite3_25000000.txt bench-sqlite3_25000000.txt.error
throughput:   7.794Kops/s

```

Т.е. стало хуже, без "PRAGMA mmap_size=#" было 9.599Kops/s.

Ответить | Правка | Наверх | Cообщить модератору

51. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от n80 (?), 06-Окт-20, 15:16 
О как. У меня было по большей части чтение, поэтому и получилось некоторое ускорение.

Понятно, что специализированное хранилище в разы быстрее, но было интересно понять, насколько удалось выжать всё из sqlite3 (и не только понять, какие опции используются, но и почему). Опять же, момент с замедлением записи при включении mmap оказался неожиданностью.

Премного благодарю за информацию!

Ответить | Правка | Наверх | Cообщить модератору

52. "Выпуск компактной встраиваемой СУБД libmdbx 0.9.1"  +/
Сообщение от erthink (ok), 06-Окт-20, 17:59 
На всякий, для информации.

1)
Заметил что при 25M итераций размер БД в sqlite получается порядка 2.5Gb.
Соответственно, заданная pragma не покрывает все данные.
Поэтому перепроверил задав mmap_size в 3Gb, но результат не изменился (медленнее чем без mmap).

2)
Вспомнил что как-то был разговор о том, что неплохо-хо бы также сравнить размер БД (sqlite vs libmdbx), при одинаковом тестовом сценарии.

Итого, в этом конкретном случае, получилось 2.5Gb в sqlite против 2Gb в libmdbx.

Кроме этого, посредством mdbx_chk можно узнать больше подробностей (заполненность страниц и т.п.)

$ ./mdbx_chk -vv .
mdbx_chk v0.9.1-11-g9d1bfa5b2 (2020-10-06T01:34:14+03:00, T-8f7227d37aed94d650826896bb3e69b34efd254c)
Running for . in 'read-only' mode...
   open-MADV_DONTNEED 522315..524288
   readahead OFF 0..522315
- monopolistic mode
- current boot-id b7e779bb77d4d4d6-f890ee824260423e
- pagesize 4096 (4096 system), max keysize 1300..1344, max readers 120
- mapsize 137438953472 (128.00 Gb)
- dynamic datafile: 1048576 (1.00 Mb) .. 137438953472 (128.00 Gb), +67108864 (64.00 Mb), -67108864 (64.00 Mb)
- current datafile: 2147483648 (2.00 Gb), 524288 pages
- transactions: recent 25000003, latter reader 25000003, lag 0
- meta-0: steady txn#25000003, head
- meta-1: weak-intact (same boot-id) txn#25000001, tail
- meta-2: weak-intact (same boot-id) txn#25000002, stay
- performs check for meta-pages clashes
- performs full check recent-txn-id with meta-pages
Traversal b-tree by txn#25000003...
- pages: walked 522299, left/unused 16
     @GC: subtotal 1, leaf 1
     @MAIN: subtotal 522295, branch 4503, leaf 517792
     @META: subtotal 3
- usage: total 2139336704 bytes, payload 1473954308 (68.9%), unused 665382396 (31.1%)
- summary: average fill 68.9%, 0 problems
Processing '@MAIN'...
- key-value kind: usual-key => single-value, flags: none
- page size 4096, entries 25000000
- b-tree depth 4, pages: branch 4503, leaf 517792, overflow 0
- summary: 25000000 records, 0 dups, 400000000 key's bytes, 800000000 data's bytes, 0 problems
Processing '@GC'...
- key-value kind: ordinal-key => single-value, flags: integerkey
- page size 4096, entries 2
- b-tree depth 1, pages: branch 0, leaf 1, overflow 0
- fixed key-size 8
- summary: 2 records, 0 dups, 16 key's bytes, 72 data's bytes, 0 problems
- space: 33554432 total pages, backed 524288 (1.6%), allocated 522315 (1.6%), remained 33032117 (98.4%), used 522299 (1.6%), gc 16 (0.0%), detained 8 (0.0%), reclaimable 8 (0.0%), available 33032125 (98.4%)
No error is detected, elapsed 10.331 seconds

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру