6

最近、QA 環境全体を VMWare から Hyper-V 仮想マシンに移行しました。

私たちのアプリケーションの 1 つは、1 秒あたり 20K パケットの速度で UDP パケットをマルチキャスト クラウドに送信します。

これは VMWare 環境では完全に機能しましたが、Hyper-V では、数分の作業の後、アプリケーションが次の例外をスローします。

System.Net.Sockets.SocketException (0x80004005): An invalid argument was supplied
   at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)

また、ソケットの送信バッファ サイズを 1,000,000 バイトに定義すると、この問題をすぐに模倣することができました。

この問題を解決するにはどうすればよいですか?

更新 1 : これは、例外が発生した後のイベント ビューアーからのログ エントリです。

Faulting application name: Agent.exe, version: 1.0.12.7366, time stamp: 0x51389f69
Faulting module name: KERNELBASE.dll, version: 6.1.7601.18015, time stamp: 0x50b83c8a
Exception code: 0xe0434352
Fault offset: 0x0000c41f
Faulting process id: 0xaf0
Faulting application start time: 0x01ce1b4ce509dc7a
Faulting application path: C:\Users\DevUser\Desktop\QA\Agent.exe
Faulting module path: C:\Windows\syswow64\KERNELBASE.dll
Report Id: d2b45dce-8740-11e2-86f9-00155d022804

UPDATE 2 : UDP パケットのサイズは 100 ~ 200 バイトです。

更新 3 : 問題のあるコードは次のとおりです。

    m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    m_socket.Ttl = 1;

    if (GetRawParameter("send") != null)
    {
      Log("Starting sender...");

      StartSender();
    }

    ...snip...

private static void StartSender()
{
  m_lastPacketNumber = 0;

  m_socket.Connect(new IPEndPoint(m_ipAddress, m_port));

  if (m_bufferSize > 0)
    m_socket.SetSocketOption(
      SocketOptionLevel.Socket, SocketOptionName.SendBuffer, m_bufferSize);

  byte[] dataPad = null;

  if (m_packetSize > 8)
  {
    dataPad = new byte[m_packetSize - sizeof(long)];

    for (int i = 0; i < dataPad.Length; i++)
    {
      dataPad[i] = 0xFF;
    }
  }

  while (true)
  {
    Log("Sending data...");

    for (int i = 0; i < m_packetsPerSec; i++)
    {
      var data = BitConverter.GetBytes(m_lastPacketNumber.Value);

      if (dataPad != null)
        data = data.Concat(dataPad).ToArray();

      if (m_packetDump != null)
        m_packetDump.Add(m_lastPacketNumber.Value);

      m_socket.Send(data);

      if (m_usePerformanceCounters)
        IncreaseSendCounters(1);

      m_lastPacketNumber++;
    }

    Log(m_lastPacketNumber + " packets sent.");

    Thread.Sleep(1000);
  }
}

更新 4 : 失敗した Send() は、1 秒あたり 100K のパケットを送信しようとすると、#14156 または #32485 または #25412 パケット (最初のパケットではありません!) で発生するようです。

4

1 に答える 1

-1

パケットを「ロールアップ」して、より大きなサイズのパケットをはるかに少なく送信してから、反対側でそれらを展開できますか? 20k パケット/秒は、多くの送信先です。

于 2013-03-26T21:49:34.857 に答える