ZeroMQ轮询函数在.NET上是否使用过多的CPU

本文关键字:CPU 是否 函数 NET ZeroMQ | 更新日期: 2023-09-27 18:30:02

我有一个简单的控制台应用程序,它使用ZeroMQ发送和接收消息。在接收部分,我有以下消息泵代码:

   ZMQ.Context _context = new ZMQ.Context(1);
   ZMQ.PollItem[] pollItems = new ZMQ.PollItem[0];
   while (!_finished)
   {
       if (pollItems.Length > 0)
           context.Poll(pollItems, pollTimeout);
       else
           Thread.Sleep(1);
       if (_receiversChanged)
           UpdatePollItems(ref pollItems);
   }

(我的想法是,我可以在运行时添加和删除轮询器中的项目,因为我需要添加接收器。UpdatePollItems只需在接收器集发生变化时创建一个新数组。)

我尝试过50毫秒和500毫秒的pollTimeout值,但该应用程序(位于Console.ReadKey上的主线程上)仍然使用100%的单核,即使没有发送消息。我在探查器下运行了该应用程序,并确认是ZMQ.Context.Poller占用了所有的CPU。

其他人看到过类似的行为吗?我使用的是最新的ZeroMQ C#绑定(来自NuGet的clrzmq-x64.2.3)。

ZeroMQ轮询函数在.NET上是否使用过多的CPU

是的,驱动程序中有一个错误。我也做到了。从代码来看,.net 4版本可能会更好,但你必须重新编译它。我会检查我重写的代码是否可以作为pull请求重新集成。

我猜,当您将轮询超时设置为500毫秒时,您将变量pollTimeout设置为500。这是不正确的。对于500ms的超时,变量pollTimeout应设置为500000。如果你做上下文。轮询(…,500),它被解释为500 usec,并在内部四舍五入为0毫秒。

我在自己的系统上验证了通过500进行轮询将导致CPU利用率在90%到100%之间。将该值设置为任何超过1000的值都会大大减少CPU使用量,对于500000(500ms),它应该可以忽略不计。

无论哪种方式,请将您的代码示例更新为变量pollTimeout的初始化。如果我完全偏离了底线,那么至少这会阻止其他潜在的回答者走上这条路。