我正在使用4.4.12-rt 19 RTLinux内核修补程序。
我有一个用C编写的实时应用程序,它在不同的核心上运行独立的进程,接收来自网络的数据,对数据进行计算,然后记录结果。我试图登录的顺序为每毫秒10 ms的数据滴答文件。
日志记录进程可以访问共享内存中的所有传入数据。现在,我正在使用sqlite3和sqlite3async将数据库缓冲到日志进程的一个线程中的内存中,然后将内存中的实例提交给每秒钟调用sqlite3async_run()的文件。
问题是,在执行sqlite3async_run()的部分过程中,写入内存中数据库缓冲区的sqlite3_step()命令挂起,违反了我的1ms定时保证。
我不确定这个错误是因为线程进程在实时环境中是如何工作的还是因为sqlite3async是如何工作的。据我所知,sqlite3async应该能够使用sqlite3虚拟文件系统在内存中缓冲数据库,然后使用后台线程(如详细的这里)处理实际的文件写入。我试图更改每个线程的调度优先级和友好关系,但都没有效果。
如有任何帮助或建议,将不胜感激!
发布于 2016-10-01 05:53:11
使用sqlite3async不会消除与编写相关的延迟;它只是推迟到以后,当您能够负担得起时。
考虑使用WAL模式。在那里,执行检查点时有相同的延迟,但是WAL存储在磁盘上,因此可以将检查点推迟任意长时间,而不会耗尽内存(代价是WAL变得任意大)。
如果在WAL模式下编写仍然太慢,您必须实现自己的FIFO,并让另一个线程不断地清空它。(如果线程在实际写入之前将数据从FIFO中移出,则FIFO在很长一段时间内都不会被锁定。)
https://stackoverflow.com/questions/39801730
复制相似问题