我正在使用4.4.12-rt19 RTLinux内核补丁。
我有一个用C编写的实时应用程序,它在单独的核心上运行单独的进程,从网络接收数据,计算数据,然后记录结果。我正在尝试以每ms 10 KB的顺序登录数据到文件。
日志记录进程可以访问共享内存中的所有传入数据。现在,我正在使用sqlite3和sqlite3async将数据库缓冲到日志记录进程的一个线程中的内存,然后通过调用sqlite3async_run()将内存实例提交到每秒文件。
问题是在部分sqlite3async_run()执行期间,写入内存数据库缓冲区的sqlite3_step()命令会挂起并违反我的1ms时序保证。
由于线程进程在实时环境中的工作方式或者sqlite3async的工作原理,我不确定是否发生了错误。据我所知,sqlite3async应该能够使用sqlite3虚拟文件系统在内存中缓冲数据库,然后使用后台线程处理实际文件写入(详细here)。我试过改变每个线程的调度优先级和好处无济于事。
非常感谢任何帮助或建议!
答案 0 :(得分:1)
使用sqlite3async
不会消除与写作相关的延迟;它只是将它们推迟到以后,当你能负担得起时。
考虑使用WAL模式。在那里,你在执行checkpoint时有相同的延迟,但是WAL存储在磁盘上,因此你可以将检查点延迟任意长时间而不会耗尽内存(代价是WAL变得任意大)
如果以WAL模式写入仍然太慢,则必须实现自己的FIFO,并让另一个线程连续清空它。 (如果该线程在实际写入之前将数据移出FIFO,则FIFO永远不会被锁定。)