Известные причины, по которым sqlite3_open_v2 может занять более 60 секунд на окнах?
Я начну с версии TL; DR, поскольку этого может быть достаточно для некоторых из вас:
- Мы пытаемся исследовать проблему, которую мы видим в диагностических данных нашего продукта C++.
- Проблема была указана на то, что она вызвана таймаутом на
sqlite3_open_v2
который, предположительно, займет 60 секунд для завершения (мы даем только 60 секунд). - Мы попробовали несколько различных конфигураций, но никогда не смогли воспроизвести даже 5 секундную задержку при этом вызове.
Поэтому возникает вопрос, могут ли быть некоторые известные сценарии, в которых sqlite3_open_v2
может занять это долго (на окнах)?
Теперь к деталям:
- Мы используем версию
3.10.2
SQLite. Мы дошли до изменений в этой версии до сих пор, и ничего, что мы обнаружили в разделе исправлений, похоже, говорит о том, что была проблема, которая была рассмотрена в последовательных выпусках sqlite и, возможно, вызвала нашу проблему. - Проблема, которую мы видим, затрагивает около 0,1% уникального пользователя во всех поддерживаемых версиях Windows (Win 7, Win 8, Win 10). Нет никаких жалоб/сообщений о пользователях вручную. Это может означать, что проблема возникает в контексте, когда что-то достаточно серьезное происходит с пользовательской машиной/системой, что он не ожидает, что что-то будет работать. Таким образом, что-то, что указывает на отказ системы в целом, является допустимой возможностью, если это может случиться для 0,1% пользователей случайных окон.
- Нет данных, указывающих, что одна и та же проблема когда-либо возникала на Mac, которая также поддерживает платформу с достаточно большим количеством данных диагностики.
- Мы используем Poco (https://github.com/pocoproject/poco, версия: 1.7.2) в качестве инструмента для доступа к нашей базе данных SQLite, но мы проанализировали код Poco, и кажется, что сбой на этом уровне кода может только (возможно) объяснить ~ 1% всех собранных образцов. Вот как мы определили, что проблема заключается в
sqlite3_open_v2
длительного времени. - Это происходит как в режиме журнала
DELETE
так и вWAL
. - Похоже, что после того, как эта проблема впервые случится для конкретного пользователя, каждый последовательный вызов
sqlite3_open_v2
длится до тех пор, пока пользователь не перезапустит все приложение (возможно, машину, не указывая по нашим данным). - Мы используем следующие настройки флагов для
sqlite3_open_v2
(как в Poco):
sqlite3_open_v2(...,..., SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_URI, NULL);
- Обычно это не происходит при запуске приложения, поэтому оно вряд ли может быть вызвано тем, что происходит, пока наше приложение не работает. Это включает отключения питания, приводящие к разрушению данных (которые, как правило, возвращают SQLITE_CORRUPT, как указано в: https://www.sqlite.org/howtocorrupt.html).
-
Мы не смогли воспроизвести эту проблему на местном уровне, хотя мы пробовали разные вещи:
- Несколько потоков записи и чтения из БД с синхронизацией, требуемой конкретной системой ведения журнала.
- Постоянное подключение sqlite длительное время и работа на db обычно в средние сроки.
- Попытка жесткого диска жесткого диска с другими данными (dumping/dev/rand (WSL) для нескольких файлов из разных процессов при обычном доступе к БД).
- Попытка заставить антивирусное программное обеспечение сканировать db на каждый доступ к файлам (протестирован с Avast, причем в основном все включено, включая "сканирование при открытии" и "сканирование при записи").
- Нарушение нашей внутренней синхронизации, требуемой конкретными системами ведения журналов.
- Вызов WinAPI CreateFile со всеми возможными комбинациями параметров совместного доступа к файлам в db файле - это вызвало проблемы, но
sqlite3_open_v2
всегда возвращался быстро - просто с ошибкой. - Вызов WinAPI LockFile в случайных частях файла DB, который является btw. хороший способ воспроизведения
SQLITE_IOERR
, но не удача в воспроизведении обсуждаемой проблемы. - Некоторые дополнительные попытки на самом деле растянуть слой Poco и дважды проверить правильность нашего статического анализа кодов.
-
Мы попытались найти похожие проблемы в Интернете, но что-то, что мы нашли, было здесь http://sqlite.1065341.n5.nabble.com/sqlite3-open-v2-performance-degrades-as-number-of-of- opens-increase-td37482.html. Это, по-видимому, не объясняет наш случай, поскольку количество параллельных подключений выходит за рамки того, что у нас есть, а также то, что может иметь обычный пользователь Windows (если только не используется несколько популярных приложений, использующих sqlite, о которых мы не знаем),
- Очень маловероятно, что эта проблема вызвана доступом к db через сетевой ресурс, поскольку мы помещаем db файл внутри
%appdata%
, если только не существует довольно стандартной конфигурации окон, которая устанавливает%appdata%
для удаленного доступа.
У вас есть идеи, что может вызвать эту проблему?
Может быть, некоторые намеки на то, что еще мы должны проверить или какие дополнительные диагностические данные, которые мы можем собрать от пользователей, были бы полезны, чтобы точно определить, почему это происходит?
заранее спасибо