【发布时间】:2017-01-16 16:52:10
【问题描述】:
我有一个 C 程序,它在一个循环中执行“填充”,其中每次迭代都被计时到一些赫兹。这个循环过去能够以大约 80k hz 运行。
然后我在循环中添加了一些文件 I/O(读取/写入 linux 文件描述符),现在看来我无法打破 ~6k 循环/秒。操作本身非常便宜,所以我怀疑是某种内核上下文切换导致了一堆延迟。所以,两个问题:
- 如何检查是否是这种情况?
- 除了对我的内核进行 RT 修补外,我能做些什么吗?
【问题讨论】:
-
你能给我们一个最简单的程序来演示这个问题吗? (包括你是如何计时的)
-
你不能依赖不定时循环的时间。您需要在其中加入某种计时硬件。当然,I/O 会减慢任何流量。没有“便宜”的文件 IO。
-
每秒尝试 80k 小文件 IO 可能不是最好的方法。仅当缓冲区足够大时,您不能将其全部打印到缓冲区并刷新到磁盘吗?或者,您可以使用 RAM 磁盘。
-
“某种内核上下文切换”?写入文件是system call。每秒 6k 系统调用听起来不太寒碜……
-
磁盘 IO 是慢。这就是发明缓冲和内存文件系统的原因。这两种经典方法之一是否与您的用例相关?