我有一个实时进程,定期通过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!”是相机的响应)。
慢的 select() 使得相机反应似乎也很慢。但是,我知道这不是真的,因为它的速度会受到更改后台进程优先级的影响。在这种情况下,select() 是否依赖于某个特定的其他进程运行?
如果我跳过 select() 直接执行 read(),那么 read() 系统调用就会变慢。
总之,在串行通信期间,如果进程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() 系统调用就会变慢。