Posso limitar a intensidade dos fsync's do webappstore (localstorage) sqlite db?

4

Navegadores modernos têm armazenamento local, que é armazenado em webappstore.sqlite (para firefox) e localstorage.sqlite (para chrome).

Existe um script de terceiros, (messenger online), que usa armazenamento local e altera algum valor a cada segundo (chrome) ou ainda mais frequentemente (firefox, 2-3 vezes por segundo).

Chave de armazenamento local que é alterada com tanta frequência:

_STRG_fm_current

O script é webagent-04052011092843.js

Eu acho que esse mecanismo sqlite no broswer faz um fsync toda vez (ou a cada segundo) quando os valores no armazenamento local são alterados. Usando o Filemon, também detectei o trabalho com arquivos .sqlite-journal, mas eles são excluídos quando tento encontrá-los na pasta com armazenamento local.

É possível limitar com que frequência o sqlite fará fsyncs de bancos de dados locais de armazenamento no firefox e chrome?

osgx
fonte

Respostas:

2

Se você tiver um aplicativo Web que esteja usando tanto o armazenamento local que cause problemas de desempenho, entre em contato com o autor do aplicativo Web e avise-o, para que talvez eles possam corrigi-lo.

No entanto, SQLite faz ter um modo desde a versão 3.7.0 chamado registro de write-ahead , que utiliza menos operações fsync. Como as versões mais recentes do Chrome e Firefox usam pelo menos a versão 3.7.0 do SQLite, você pode definir o modo WAL no banco de dados de armazenamento local e deve persistir quando o Chrome e o Firefox começarem a usá-lo.

Você precisará do executável sqlite3 . Feche o Chrome primeiro e execute os seguintes comandos:

sqlite3 path/to/localstorage.sqlite

sqlite> PRAGMA journal_mode=WAL;
sqlite> .quit

(Ao executar o PRAGMAcomando, você deve recuperar o resultado " wal".)

Os mesmos comandos seria usado para definir o modo WAL para o banco de dados Firefox, substituindo webappstore.sqlitepara localstorage.sqlite.

Para desfazer essa configuração, execute os mesmos comandos, exceto o uso PRAGMA journal_mode=DELETE;.

Observe que eu mesmo não tentei; meu palpite é que funcionará bem, mas peço que faça backup do arquivo do banco de dados antes de tentar.


Como um aparte, os *.sqlite-journalarquivos que você está vendo no Filemon fazem parte de como o SQLite executa uma confirmação atômica . Por padrão, o arquivo de diário existe apenas por um período muito curto. Ao confirmar uma alteração em um banco de dados SQLite, ocorrem as seguintes ações:

  1. Os dados atuais são gravados no arquivo do diário.
  2. Os novos dados são gravados no arquivo de banco de dados.
  3. O arquivo do diário é excluído.

Se o computador travar no meio da gravação do arquivo do banco de dados, o arquivo de diário será usado para recuperar o banco de dados antes do início da alteração.

Stephen Jennings
fonte
Posso desativar o diário (sem executar o fsync) e desativar as confirmações atômicas? A perda de energia é um evento muito raro (de 2 a 3 por ano, mesmo sem UPS), e não preciso de ACID para o histórico do meu navegador. Mas embaralhar dados entre vários arquivos leva a um nível muito alto de fragmentação de arquivos. Qual o tamanho do sqlite-journal?
Osgx 27/05
11
@osgx: Você precisaria executar o Chrome / Firefox PRAGMA journal_mode=OFF(ao contrário do WAL, executá-lo no programa sqlite3 não o configurará para outros programas). Isso provavelmente exigiria que você recompile esses navegadores da fonte. O tamanho do diário depende do tamanho das alterações que estão sendo feitas; para esta aplicação, os periódicos devem ser bem pequenos.
Stephen Jennings