Сколько миллисекунд без читателей нужно SQLite, чтобы файл -wal перестал расти

opium 58 минут назад Краткое содержание статьи Сколько миллисекунд без читателей нужно SQLite, чтобы файл -wal перестал расти 6 мин 2.5K SQLite * SQL * Серверное администрирование * Аналитика В режиме WAL база SQLite...
Will Anthropic have the best AI model at the end of October 2026?
В сфере искусственного интеллекта произошло заметное событие. opium 58 минут назад Краткое содержание статьи Сколько миллисекунд без читателей нужно SQLite, чтобы файл -wal перестал расти 6 мин 2. 5K SQLite * SQL * Серверное администрирование * Аналитика В режиме WAL база SQLite пишет изменения сначала в файл -wal, а потом переносит их в основной файл и начинает -wal с начала. Документация предупреждает: если читатели перекрываются и хотя бы один активен всегда, -wal растёт без предела, и нужны промежутки без читателей.
Какой длины, там не сказано. В обсуждениях это лечат sleep() на 16 мс и больше. Я замерил в контейнере на SQLite 3.
Технические детали
На моём стенде хватало общей паузы в единицы миллисекунд: 2 мс при 50 коммитах/с, 5 мс при 200 и 1000. Неожиданно для меня при быстрой записи паузы понадобилось больше, чем при медленной. Без неё три читателя по 50 мс, сменяющие друг друга, раздули -wal так же, как один на 20 секунд: 19,7 МиБ, и ни разу SQLite не начал файл заново.
Случайные запросы по 5 мс почти не мешали, пока хотя бы 13% времени не было ни одного читателя. Ниже замеры, догадка о том, откуда берутся эти миллисекунды, и признак, по которому проблему видно раньше, чем кончится диск. Что уже известноДокументация SQLite описывает механизм в разделе про слишком большие WAL-файлы.
Если читателей много, их транзакции перекрываются и хотя бы один читатель активен всегда, checkpoint не завершится и WAL «будет расти без предела». Лечение там названо так: нужны «reader gaps», промежутки без читателей, или ручной checkpoint в режиме RESTART/TRUNCATE. Сколько должен длиться промежуток, там не сказано.
Отраслевые последствия
Почти тот же эксперимент этой осенью опубликовал автор поста «Why your SQLite WAL file never shrinks» на dev. На macOS с писателем 2000 коммитов/с три читателя по секунде со сдвигом дали рост 11,9 МиБ/с. TRUNCATE раз в 5 с в двух прогонах из трёх удержал файл до 60 МиБ ценой остановки писателя до 1,8 с.
Его вывод для практики: держать чтения короткими и следить за разницей log − checkpointed. Промежуток без читателей он сравнивал в двух положениях: «около 20% времени» и «никогда». Его самые короткие чтения длились 0,4 с.
На форуме SQLite (2020) WAL в 2 ГБ при базе в 6 МБ перестал расти после «occasional sleep» в потоках, на Hacker News (2024) спасались sleep() от 16 мс на всех запросах. Нужную паузу там не измеряли. СтендВсе проверки идут в одноразовом контейнере python:3.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





