如何在实时 Linux 应用程序中记录数据?

How to Log Data in a Realtime Linux Application?

我正在使用 4.4.12-rt19 RTLinux 内核补丁。

我有一个用 C 语言编写的实时应用程序,它在单独的内核上有单独的进程 运行 从网络接收数据,计算该数据,然后记录结果。我正在尝试以每毫秒数据滴答 10KB 的顺序登录到文件。

记录进程可以访问共享内存中的所有传入数据。现在,我正在使用 sqlite3 和 sqlite3async 在日志记录过程的一个线程中将数据库缓冲到内存中,然后通过调用 sqlite3async_run().[=12= 每秒将内存中的实例提交到文件中]

问题是在执行 sqlite3async_run() 的部分过程中,写入内存数据库缓冲区的 sqlite3_step() 命令挂起并违反了我的 1ms 时序保证。

我不确定错误的发生是因为线程进程在实时环境中的工作方式还是因为 sqlite3async 的工作方式。据我所知,sqlite3async 应该能够使用 sqlite3 虚拟文件系统在内存中缓冲数据库,然后使用后台线程处理实际文件写入(详见 here)。我曾尝试更改每个线程的调度优先级和优点,但无济于事。

如有任何帮助或建议,我们将不胜感激!

使用sqlite3async不会消除与写入相关的延迟;它只是推迟到以后,当你负担得起的时候。

考虑使用 WAL 模式。在那里,执行 checkpoint 时会有相同的延迟,但 WAL 存储在磁盘上,因此您可以将检查点延迟任意长时间而不会 运行 内存不足(以 WAL 为代价变得任意大)。

如果用WAL方式写还是太慢,就得自己实现FIFO,让另一个线程不断清空。 (如果该线程在实际写入之前将数据移出 FIFO,则 FIFO 绝不会长时间锁定。)