【发布时间】:2013-03-08 13:48:45
【问题描述】:
在我的 HFT 交易应用程序中,我有几个地方可以从网络接收数据。在大多数情况下,这只是一个只接收和处理数据的线程。以下是此类处理的一部分:
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,但是我认为我的问题更多是关于硬件而不是语言或操作系统。
【问题讨论】:
-
上下文切换是指线程间的切换。这不受线程亲和性的影响。操作系统仍然需要调度这个线程和其他线程。
-
无论您使用什么,延迟都无法得到保证,因为许多线程在不同的内核上并行执行,只要您希望安排其他线程,就会有一些琐事要执行操作系统方面,它不是一个固定时间的任务。
-
程序不应该完全依赖于固定延迟。这样的程序很容易崩溃。
-
我不需要保证延迟。我需要尽量减少延迟。这是交易。更低的延迟 - 我可以赚更多的钱。
-
这样说吧。有几篇关于亲和力的博文以及如何尝试改善延迟/性能。 AFAIK,nobdy 尚未发布任何后续消息,称他们的应用程序性能已经有所提高。
标签: c# multithreading low-latency