Русский
Производительность
Насколько быстра синхронизация хранилища и до какого размера оно может вырасти, прежде чем вы это почувствуете? Мы измерили мутацию pushNotes — именно её вызывает плагин Obsidian и CLI при каждой синхронизации — на хранилищах от 10 до 10 000 заметок.
Графики ниже — живые блоки datachart, которые читают CSV с сырыми результатами прямо из этого хранилища. Та же функция доступна и вам для ваших данных.
Методика
- Каждый прогон — свежий сервер с пустой базой SQLite, ограниченный 1 или 4 ядрами CPU (
taskset+GOMAXPROCS). - Синтетические заметки ~500 байт: frontmatter, заголовки, wikilink, список, блок кода.
- Первая загрузка — все N заметок одним вызовом
pushNotes(одна транзакция записи). - 1 заметка — типичная синхронизация: одна изменённая заметка в хранилище из N заметок (медиана из 3).
- 10% хранилища — пакетная синхронизация: N/10 изменённых заметок одним вызовом (медиана из 3).
- Память — RSS процесса сервера после прогона; пик — из
/proc. - Скрипт бенчмарка:
scripts/bench-pushnotes.shв репозитории.
Важный контекст: пока сервер обрабатывает push, он держит блокировку записи базы — остальные писатели (фоновые задачи, другие push'и) ждут в очереди. Поэтому «время push» здесь — это ещё и «сколько база заблокирована».
Первая загрузка: всё хранилище одним вызовом
{
"data": { "source": "frontmatter", "ref": "chart_bench" },
"config": {
"title": { "text": "Первая загрузка, мс (меньше — лучше)" },
"tooltip": { "trigger": "axis" },
"legend": {},
"xAxis": { "type": "category", "name": "заметок" },
"yAxis": { "type": "log", "name": "мс" },
"series": [
{ "type": "bar", "name": "1 ядро", "encode": { "x": "notes", "y": "initial_1c" } },
{ "type": "bar", "name": "4 ядра", "encode": { "x": "notes", "y": "initial_4c" } }
]
}
}
Рост почти линейный: ~1,2 с на 1 000 заметок на одном ядре, ~14 с на 10 000. Четыре ядра сокращают время примерно вдвое — рендеринг заметок параллелится, запись в базу — нет.
Инкрементальная синхронизация: повседневный случай
{
"data": { "source": "frontmatter", "ref": "chart_bench" },
"config": {
"title": { "text": "Инкрементальный push, мс (меньше — лучше)" },
"tooltip": { "trigger": "axis" },
"legend": {},
"xAxis": { "type": "category", "name": "размер хранилища, заметок" },
"yAxis": { "type": "log", "name": "мс" },
"series": [
{ "type": "line", "name": "1 заметка, 1 ядро", "encode": { "x": "notes", "y": "incr1_1c" } },
{ "type": "line", "name": "1 заметка, 4 ядра", "encode": { "x": "notes", "y": "incr1_4c" } },
{ "type": "line", "name": "10% хранилища, 1 ядро", "encode": { "x": "notes", "y": "incr10p_1c" } },
{ "type": "line", "name": "10% хранилища, 4 ядра", "encode": { "x": "notes", "y": "incr10p_4c" } }
]
}
}
Это то, что вы чувствуете каждый день: отредактировали заметку — плагин её отправил. Даже при 10 000 заметок push одной заметки занимает ~0,4 с на одном ядре и ~0,2 с на четырёх. Рендерер кеширует неизменённые заметки, поэтому стоимость растёт с размером хранилища (переиндексация), а не с объёмом изменений: push 1 000 изменённых заметок (10% хранилища в 10 000) занимает ~2,3 с на одном ядре — далеко не 1 000 × стоимость одной заметки.
Память
{
"data": { "source": "frontmatter", "ref": "chart_bench" },
"config": {
"title": { "text": "RSS сервера после синхронизации, МБ" },
"tooltip": { "trigger": "axis" },
"legend": {},
"xAxis": { "type": "category", "name": "заметок" },
"yAxis": { "type": "value", "name": "МБ" },
"series": [
{ "type": "bar", "name": "RSS, 1 ядро", "encode": { "x": "notes", "y": "rss_1c" } },
{ "type": "bar", "name": "RSS, 4 ядра", "encode": { "x": "notes", "y": "rss_4c" } },
{ "type": "line", "name": "пик, 1 ядро", "encode": { "x": "notes", "y": "peak_1c" } },
{ "type": "line", "name": "пик, 4 ядра", "encode": { "x": "notes", "y": "peak_4c" } }
]
}
}
Сервер держит отрендеренные заметки в памяти: ~80 МБ на сотню заметок, ~180 МБ на тысячу, ~1 ГБ на десять тысяч. Учитывайте это при выборе хостинга — VPS с 1 ГБ памяти спокойно обслуживает хранилища до нескольких тысяч заметок.
Сырые цифры
| Хранилище | Первая загрузка 1я / 4я | 1 заметка 1я / 4я | 10% пакетом 1я / 4я | Пик RSS 1я / 4я |
|---|---|---|---|---|
| 10 | 40 / 8 мс | 4 / 2 мс | 4 / 2 мс | 68 / 69 МБ |
| 100 | 113 / 81 мс | 6 / 8 мс | 13 / 10 мс | 83 / 80 МБ |
| 1 000 | 1,2 / 0,5 с | 39 / 22 мс | 96 / 62 мс | 182 / 149 МБ |
| 10 000 | 13,8 / 6,8 с | 382 / 224 мс | 2,3 / 0,7 с | 1186 / 902 МБ |
Замеры 2026-06-11 на 12-ядерной dev-машине ARM64 с ограничением через taskset, SQLite в режиме WAL, один процесс сервера. Ваши абсолютные цифры будут другими; форма кривых — нет.
Что это значит для вас
- Хранилища до ~1 000 заметок: всё мгновенно — синхронизация занимает десятки миллисекунд.
- ~10 000 заметок на маленьком сервере: повседневные синхронизации по-прежнему меньше секунды, но первая загрузка всего хранилища занимает ~14 с на одном ядре. На это время база заблокирована для других писателей — большие хранилища лучше импортировать в тихие часы.
- Ядра ускоряют рендеринг, а не блокировку: 4-ядерный сервер вдвое сокращает большие загрузки. Но блокировка держится весь push в любом случае, поэтому много одновременных писателей выигрывают меньше, чем обещают сырые цифры.