我有一个应用程序,它通过串行端口与最多 50 个设备进行通信。通信在线程中进行,并且线程受到限制,因此一次只有一定数量的线程处于活动状态。线程根据需要创建,执行其工作,然后终止并释放其使用的资源。
在某些情况下,串行端口通过 Moxa TCP/IP 以太网端口实现。Moxa 驱动程序在 PC 上运行,将网络上的 Moxa 设备显示为 COM 端口。
在其他情况下,串行端口通过每个提供 10 个串行端口的 USB 集线器实现。
问题就在这里。当仅使用 Moxa 串行端口并启用(例如)8 个时,应用程序的 CPU 使用率会在 1% 到 30% 之间波动,具体取决于有多少个线程处于活动状态。应用程序运行正常,PC 响应迅速。
当启用 8 个 USB 端口时,应用程序的 CPU 使用率会达到我预期的 50-60% 峰值,但全部的PC CPU 使用率攀升至接近 100% 并保持在该水平。毫不奇怪,一切都陷入停滞。
我使用 Process Explorer 发现,我的应用程序之外的大部分 CPU 使用率都在两个任务中 - 系统空闲进程/DPC(延迟过程调用)和系统空闲进程/系统。这两个任务的使用率峰值分别约为 40%。当仅使用 Moxa 端口时,这些任务不会显示出明显的 CPU 使用率。
我尝试过调整线程优先级,但没什么效果。端口以相对较低的波特率 (2400) 运行。
运行DPC延迟检查工具当使用 USB 串行端口时,延迟最多可达 6ms。
答案1
CPU 使用率过高的原因在于,在应用程序中,每个通道在会话开始时都会打开其串行端口,并在应用程序会话期间保持打开状态。对于基于 Moxa 以太网转 COM 端口适配器的端口或“本地”端口,这没有问题,但在 USB 端口中,只要打开端口就会导致 DPC CPU 使用率过高。打开 16 个 USB 端口会使 PC 无法使用,尽管任何端口上都没有流量。
我改变了应用程序,以便在需要时打开端口(大约每分钟仅打开几秒钟)并随后立即关闭。