sqlite3_open_v2在Windows上占用超过60秒的已知原因?

Yes*_*ter 18 sqlite poco

我将从TL开始; DR版本,因为这可能足够你们中的一些人:

  • 我们正在尝试调查我们在C++产品的诊断数据中看到的问题.
  • 该问题被确定为由超时引起的sqlite3_open_v2,据说超时完成需要60多秒(我们只给它60s).
  • 我们尝试了多种不同的配置,但从来没有能够在这次通话中重现5秒的延迟.

所以问题是,是否有一些已知的场景sqlite3_open_v2可以花费那么长时间(在Windows上)?

现在详细说明:

  • 我们正在使用3.10.2SQLite 版本.我们通过从这个版本更新日志现在去钱柜,没有什么我们已经发现的错误修正节似乎表明,有一些问题,这是在连续的sqlite的版本解决,并可能导致我们的问题.
  • 我们看到的问题影响了所有支持的Windows版本(Win 7,Win 8,Win 10)中约0.1%的唯一用户.没有手动用户抱怨/报告 - 这可能表明问题发生在用户机器/系统发生严重问题的情况下,他不希望任何工作.因此,只要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).
  • 即使我们尝试了不同的事情,我们也无法在本地重现此问题:

    • 多个线程从DB写入和读取,具有特定日记系统所需的同步.
    • 保持sqlite连接长时间打开并正常工作db.
    • 试图与其他数据(来自不同的进程倾倒的/ dev /兰特(WSL)将多个文件,同时访问DB正常)硬击HDD.
    • 试图强制防病毒软件在每次访问文件时扫描数据库(使用Avast进行测试,基本上所有功能都已启用,包括"扫描打开"和"扫描写入").
    • 打破特定日记系统所需的内部同步.
    • 使用db文件上的所有可能的文件共享选项组合调用WinAPI CreateFile - 这会导致问题但sqlite3_open_v2总是快速返回 - 只是出错.
    • 在btw的DB文件的随机部分上调用WinAPI LockFile.很好的再现方式SQLITE_IOERR,但没有运气再现讨论的问题.
    • 一些额外的尝试实际拉伸Poco层并仔细检查我们的代码静态分析是否正确.
  • 我们试图在网上寻找类似的问题,但我们发现的任何相关内容都在http://sqlite.1065341.n5.nabble.com/sqlite3-open-v2-performance-degrades-as-number-of- opens-increase-td37482.html.这似乎并不能解释我们的情况,因为并行连接的数量超出了我们的范围以及典型的Windows用户所拥有的数量(除非有一些有点流行的应用程序正在利用我们不知道的sqlite) .

  • 这个问题不太可能是由于数据库是通过网络共享访问的,因为我们将db文件放在里面%appdata%,除非有一些非常标准的Windows配置设置%appdata%为远程共享.

你有什么想法会导致这个问题吗?

也许有些暗示我们应该检查什么或者我们可以从用户那里收集哪些额外的诊断数据对于找出发生这种情况的真正原因是有用的?

提前致谢