Могу ли я ограничить интенсивность fsync для webappstore (localstorage) sqlite db?

857
osgx

Современные браузеры имеют локальное хранилище, которое хранится в webappstore.sqlite (для firefox) и localstorage.sqlite (для chrome).

Существует сторонний скрипт (онлайн-мессенджер), который использует локальное хранилище и меняет некоторое значение каждую секунду (chrome) или даже чаще (firefox, 2-3 раза в секунду).

Ключ локального хранилища, который меняется так часто:

_STRG_fm_current

скрипт webagent-04052011092843.js

Я думаю, что движок sqlite в broswer выполняет fsync каждый раз (или каждую секунду) при изменении значений в локальном хранилище. Используя Filemon, я также обнаружил работу с файлами .sqlite-journal, но они удаляются, когда я пытаюсь найти их в папке с localalstorage.

Можно ли ограничить частоту, с которой sqlite будет выполнять fsyncs для локальных хранилищ в Firefox и Chrome?

4

1 ответ на вопрос

2
Stephen Jennings

Если у вас есть веб-приложение, которое использует локальное хранилище настолько сильно, что оно вызывает проблемы с производительностью, я бы связался с автором веб-приложения и уведомил их, чтобы, возможно, они могли это исправить.

Тем не менее, SQLite имеет режим, начиная с версии 3.7.0, называемый журналом записи с опережением, который использует меньше операций fsync. Поскольку более новые версии Chrome и Firefox используют как минимум версию 3.7.0 SQLite, вы можете установить режим WAL в своей локальной базе данных хранения, и он должен сохраняться, когда Chrome и Firefox начнут его использовать.

Вам понадобится исполняемый файл sqlite3 . Сначала закройте Chrome, затем выполните следующие команды:

sqlite3 path/to/localstorage.sqlite  sqlite> PRAGMA journal_mode=WAL; sqlite> .quit 

(Когда вы запускаете PRAGMAкоманду, вы должны получить результат " wal".)

Эти же команды будут использоваться для установки режима WAL для базы данных Firefox, подставляя webappstore.sqliteдля localstorage.sqlite.

Чтобы отменить этот параметр, запустите те же команды, кроме использования PRAGMA journal_mode=DELETE;.

Обратите внимание, что я не пробовал это сам; Я предполагаю, что это будет работать нормально, но я призываю вас сделать резервную копию файла базы данных, прежде чем пытаться это сделать.


Кроме того, *.sqlite-journalфайлы, которые вы видите в Filemon, являются частью того, как SQLite выполняет атомарный коммит . По умолчанию файл журнала существует только в течение очень короткого времени. При внесении изменений в базу данных SQLite выполняются следующие действия:

  1. Текущие данные записываются в файл журнала.
  2. Новые данные записываются в файл базы данных.
  3. Файл журнала удален.

Если во время записи файла базы данных происходит сбой компьютера, файл журнала используется для восстановления базы данных до того, как изменения начались.

Могу ли я отключить журнал (вообще не делая fsync) и отключить атомарные коммиты? Потеря питания - очень редкое событие (2-3 раза в год, даже без ИБП), и мне не нужна ACID для истории браузера. Но перемешивание данных между несколькими файлами приводит к очень высокому уровню фрагментации файлов. Насколько большим должен быть sqlite-journal? osgx 12 лет назад 0
@osgx: вам нужно, чтобы Chrome / Firefox запускал `PRAGMA journal_mode = OFF` (в отличие от WAL, запуск его из программы sqlite3 не установит его для других программ). Это, вероятно, потребует от вас перекомпиляции этих браузеров из исходного кода. Размер журнала зависит от размера вносимых изменений; для этого приложения журналы должны быть довольно маленькими. Stephen Jennings 12 лет назад 1

Похожие вопросы