gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:26:06 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

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

关于linux - 如何在实时 Linux 应用程序中记录数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39801730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com