c# - 我应该对 "latency-critical"线程使用线程关联吗?

标签 c# multithreading low-latency

在我的高频交易应用程序中,我有几个地方可以从网络接收数据。在大多数情况下,这只是一个只接收和处理数据的线程。以下是此类处理的一部分:

    public Reciver(IPAddress mcastGroup, int mcastPort, IPAddress ipSource)
    {

        thread = new Thread(ReceiveData);

        s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        s.ReceiveBufferSize = ReceiveBufferSize;

        var ipPort = new IPEndPoint(LISTEN_INTERFACE/* IPAddress.Any*/, mcastPort);
        s.Bind(ipPort);

        option = new byte[12];
        Buffer.BlockCopy(mcastGroup.GetAddressBytes(), 0, option, 0, 4);
        Buffer.BlockCopy(ipSource.GetAddressBytes(), 0, option, 4, 4);
        Buffer.BlockCopy(/*IPAddress.Any.GetAddressBytes()*/LISTEN_INTERFACE.GetAddressBytes(), 0, option, 8, 4);
    }

    public void ReceiveData()
    {
        byte[] byteIn = new byte[4096];
        while (needReceive)
        {
            if (IsConnected)
            {
                int count = 0;
                try
                {
                    count = s.Receive(byteIn);
                }
                catch (Exception e6)
                {
                    Console.WriteLine(e6.Message);
                    Log.Push(LogItemType.Error, e6.Message);
                    return;
                }
                if (count > 0)
                {
                    OnNewMessage(new NewMessageEventArgs(byteIn, count));
                }
            }
        }
    }

这个线程一旦创建就永远有效。我只是想知道是否应该将此线程配置为在某个核心上运行?因为我需要最低延迟,所以我想避免上下文切换。因为我想避免上下文切换,所以我最好在同一个处理器内核上运行同一个线程,对吧?

考虑到我需要最低延迟是正确的:

  • 为大部分“长时间运行”的线程设置“线程亲和性”会更好吗?
  • 为上面示例中的线程设置“线程亲和性”会更好吗?

如果这很重要,我现在将上面的代码重写为 c++,以便稍后移植到 Linux,但是我认为我的问题更多是关于硬件而不是语言或操作系统。

最佳答案

我认为尽可能少延迟的算法是将您的线程固定到一个核心并将它们设置为实时优先级(或任何最高优先级)。

这将导致操作系统驱逐碰巧使用该核心的任何其他线程。

希望当您的线程被调度到 CPU 缓存时,CPU 缓存仍将包含有用的数据。出于这个原因,我喜欢固定到核心的想法。

您可能应该将整个过程设置为高优先级,并尽量减少盒子上的其他事件。还要关闭未使用的硬件,因为它可能会产生中断。将 NIC 的中断修复到不同的 CPU 核心(一些更好的 NIC 可以做到这一点)。

关于c# - 我应该对 "latency-critical"线程使用线程关联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15295438/

相关文章:

c++ - 不调用线程函数。语法有什么问题吗

c# - 线程池线程的异常

c# - 后台线程的 MSTest 失败

c# - 使用 Action 委托(delegate)根据泛型调用正确的函数

c# - 测试 HttpResponse.StatusCode 的结果

ffmpeg - 减少 FFMPEG h264 视频流延迟

java - Memcache 延迟时间太长?

c# - 保护区与在基类中使用私有(private)区域

c# - 当一个文件缺少 EOF 时,如何在 C# 程序中将多个 gz 文件合并为一个文件