低优先级进程延迟实时进程的串行通信(Linux)

5
我有一个实时进程,定期通过RS232向高速相机发送通信。我有几个其他实时进程占用了大量CPU时间,在使用CUDA对几个GPU板进行图像处理。通常情况下,串行通信非常快,每次消息和响应约需50毫秒。然而,当后台进程在进行图像处理时,串行通信会变得非常慢,经常需要多个秒钟(有时超过10秒)。
总之,在串行通信期间,如果进程B、C等非常忙碌,即使进程A具有最高优先级,进程A也会被延迟:
- 进程A(实时,最高优先级):偶尔的串行通信 - 进程B、C、D等(实时,较低优先级):大量CPU和GPU处理
当我将后台进程更改为SCHED_OTHER(非实时)进程时,串行通信就很快。然而,这对我来说不是一个解决方案,因为后台进程需要是实时进程(否则,GPU处理无法充分跟上高速相机)。
显然,串行通信依赖于系统中的一些非实时进程,这些进程正在被我的实时后台进程抢占。我认为,如果我知道哪个进程被用于串行通信,我可以提高其优先级并解决问题。有谁知道串行通信是否依赖于系统上运行的任何特定进程吗?
我正在运行RHEL 6.5,并使用标准内核(非PREEMPT_RT)。它具有双6核CPU。
根据Erki A的建议,我捕获了一个strace。显然,它是一个慢速的select()系统调用(“set roi2”是发送给相机的命令,“Ok!”是相机的响应)。
write(9, "set roi2"..., 26)             = 26 <0.001106>
ioctl(9, TCSBRK, 0x1)                   = 0 <0.000263>
select(10, [9], NULL, NULL, {2, 0})     = 1 (in [9], left {0, 0}) <2.252840>
read(9, "Ok!\r\n", 4096)                = 5 <0.000092>

慢的 select() 使得相机反应似乎也很慢。但是,我知道这不是真的,因为它的速度会受到更改后台进程优先级的影响。在这种情况下,select() 是否依赖于某个特定的其他进程运行?
如果我跳过 select() 直接执行 read(),那么 read() 系统调用就会变慢。
2个回答

4

根据您的串口设备/驱动程序,串行通信很可能依赖于内核工作线程(kworker),将传入的串行数据从中断服务例程缓冲区移动到行规则缓冲区。您可以增加内核工作线程的优先级,但是工作线程会处理共享工作队列。因此,增加工作线程的优先级将提高串行处理的优先级以及可能不需要优先级提升的大量其他内容。

您可以修改串行驱动程序,使用专用的高优先级工作队列而不是共享队列。另一个选项是使用tasklet,但这两个选项都需要驱动程序级别的修改。

我认为最直接的解决方案是将com端口设置为低延迟模式,可以通过setserial命令在命令行上进行设置:

setserial /dev/ttySxx low_latency

或者通过编程实现:

struct serial_struct serinfo;
fd = open ("/dev/ttySxx");
ioctl (fd, TIOCGSERIAL, &serinfo);
serinfo.flags |= ASYNC_LOW_LATENCY;
ioctl (fd, TIOCSSERIAL, &serinfo);
close (fd);

这将导致串口中断处理程序立即将传入的数据传输到行规则而不是将其添加到工作队列中延迟传输。在此模式下,当您从应用程序调用read()时,如果工作队列中有要刷新的内容,则可以避免read()调用进入休眠状态,否则会出现间歇性延迟问题。


感谢提供有用的信息。我确实尝试了low_latency,但它并没有解决问题。RS232端口位于自定义板上,因此修改驱动程序不难(仅供参考,我在实验中还尝试了其他RS232接口,例如ttyUSB0,使用low_latency)。我打算更仔细地查看驱动程序。欢迎来到stackoverflow。 - David Steinhauer
2
注意:low_latency标志选项仅适用于内核版本3.14及以下。在后续版本中,此选项似乎已被删除。@DavidSteinhauer - Mavik
@DavidSteinhauer,你有没有找到解决这个问题的好方法? - hobb
不,我没有想出直接的解决方案。相反,我们将串行通信移动到单独的FPGA板上。 - David Steinhauer

2

您可以使用 strace 来查看它锁定在哪里。如果超过10秒,那么很容易就能看到。


很好的想法。我现在正在尝试使用 strace,但即使将其输出发送到 ramdisk 中,它也会使我的进程变得太慢了。有什么加速 strace 的想法吗? - David Steinhauer
好的,我通过在恰当的时刻启动它来使strace工作。 - David Steinhauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接