私の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に移植しますが、私の質問は言語やOSよりもハードウェアに関するものだと思います。