2011-08-22 6 views
2

UDP 클라이언트가있는 & 서버가 자주 메시지를 교환하고 두 엔티티의 메모리 사용량이 초당 약 8K의 속도로 증가하는 문제가 나타납니다 (궁극적으로이 작업 관리자에서 관찰 된 것처럼 그들 사이의 통학 속도에 달려 있음)..NET UDP 소켓 보내기 메모리 사용량 증가

가능한 한 간단하게 설명하기 위해 UDP 서비스를 사용하는 MSDN을 기반으로 샘플을 만들었습니다 http://msdn.microsoft.com/en-us/library/tst0kwb1.aspx.

서버 :

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

public class UDPListener 
{ 
private const int listenPort = 11000; 

private static void StartListener() 
{ 
    bool done = false; 

    UInt32 count = 0; 
    UdpClient listener = new UdpClient(listenPort); 
    IPEndPoint groupEP = new IPEndPoint(IPAddress.Loopback, listenPort); 

    try 
    { 
     while (!done) 
     { 
      byte[] bytes = listener.Receive(ref groupEP); 

      if ("last packet" == System.Text.Encoding.UTF8.GetString(bytes)) 
      { 
       done = true; 
       Console.WriteLine("Done! - rx packet count: " + Convert.ToString(count)); 
      } 
      else 
      { 
       count++; 
      } 
     } 

    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
    } 
    finally 
    { 
     listener.Close(); 
    } 
} 

public static int Main() 
{ 
    StartListener(); 

    return 0; 
} 

}

그리고 클라이언트 : 나는 모두가 각각의 전송 후 클라이언트 소켓을 떨어 뜨리고, 직접 소켓 인터페이스를 사용하고 UDPClient 시도했습니다

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

namespace UDPSender 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 
      ProtocolType.Udp); 

     IPAddress broadcast = IPAddress.Parse(IPAddress.Loopback.ToString()); 

     byte[] sendbuf = Encoding.ASCII.GetBytes("test string"); 
     IPEndPoint ep = new IPEndPoint(broadcast, 11000); 

     for (int i = 0; i < 500; i++) 
     { 
      s.SendTo(sendbuf, ep); 

      System.Threading.Thread.Sleep(50); 
     } 

     s.SendTo(Encoding.ASCII.GetBytes("last packet"), ep); 

     s.Dispose(); 
    } 
} 
} 

, 명백한 GC.Collect 등은 아무 소용이 없습니다.

어떤 아이디어

여기에 무슨 일이 일어나고 있는지 -이이 .NET에 근본적인 문제가 보라 할 수없는, 내 코드/샘플에 문제가있을 수 있어야합니다 ....

+0

@rw : 작업 관리자를 사용하여 메모리 사용량을 확인하지 마십시오. Perfmon (Windows와 함께 제공됨) 또는 Sysinternals의 Process Explorer와 같은 것을 사용하고 'Private bytes'메트릭 값을 모니터링하십시오. – Andy

+0

@Andy : 작업 관리자의 '가상 메모리 크기'열은 '비공개 바이트'와 같습니다. –

+0

@rw : 모든 rx/tx를 실행 한 후에 스레드를 잠자기 상태로 유지하여 모든 미해결 패키지를 보내고 메모리 사용량을 확보 할 수 있습니까? –

답변

0

을이 시도 :

 
bytes = null; 
+0

불행히도 이것은 작동하지 않았습니다. 그러나 위에서 언급 한 것처럼 UDPClient를 버리고 원시 소켓을 사용하고 명시 적으로 collect를 삭제하여 서버의 개인 바이트 사용을 향상시킬 수 있습니다. –