我知道SQLite在具有多个客户端的共享文件系统上并不理想。但是,文档表明,多位读者应该可以。
我的SQLite数据库驻留在Luster卷上,并且对数据库进行了“分区”-尽管是fit
,而不是显式表,但使用ID上的模运算符来定义分区-这样,多个读者是互斥的。可以,但是(大约)在40%的时间中,读取数据库时(使用Python 3.7.4和SQLite 3.30.0,使用Python stdlib sqlite3)时出现“磁盘I / O错误”。 >
可以安全地假设标准Unix VFS的假设不适用于Lustre文件系统(因为它们不适用于其他联网的文件系统)吗?如果是这样,为什么对读者如此重要?
假设我只需要使用Lustre上的SQLite,我可以做些什么来减轻这种情况?例如,将数据物理上拆分为多个SQLite分片(仅将有一个客户端),并且可能VIEW
将它们分到一个中央源?
答案 0 :(得分:1)
您没有提到要使用的Lustre版本,这很重要。假设您的服务器版本至少为2.5或更高版本,我建议对客户端使用Luster 2.12.3(或更高版本),因为这可以解决许多性能和功能问题。特别是,它默认启用flock
,这通常是在用户空间中的应用程序之间共享文件的要求(否则,请使用-o flock
挂载选项挂载客户端)。通常需要使用flock
功能来确保同一文件的多次读取/写入是一致的。
Lustre本身在客户端之间具有完全高速缓存一致性,并且几乎完全与POSIX兼容(与本地ext4文件系统相同,但有一些例外,如atime更新),这是它广泛用于并行应用程序的原因之一。与NFS不同,对于同一文件上的多个作者/读者,它没有一致性问题。
对于IO错误,首先要问的是应用程序正在执行哪种IO(缓冲或O_DIRECT
)?对于O_DIRECT
读/写,它们需要在PAGE_SIZE
边界上调整大小/对齐(对于x86系统为4KB),因此不能执行512字节大小的O_DIRECT
。使用Lustre在同一文件上进行并发写入和读取操作绝对是可能的,但是如果客户端在同一块上竞争,这将导致更高的延迟。
第二,当SQLite报告错误时,您是否在客户端或服务器的控制台上收到任何错误?在您运行应用程序时,检查dmesg
行的/var/log/messages
或LustreError:
输出。