2013-06-10 27 views
12

Bir işlem gönder/alma baytlarını nasıl alabilirim? Tercih edilen yol C# ile yapıyor.İşlem ağ kullanımını geri alma

Bunu çok araştırdım ve bunun için herhangi bir basit çözüm bulamadım. Bazı çözümler WinPCap'ı makineye kurmayı ve bu lib ile çalışmayı önerdi.

Bu adamda şu soru soruldu: Need "Processes with Network Activity" functionality in managed code - Like resmon.exe does it Lib'in genel giderlerini istemiyorum.

Bunun için basit bir çözüm var mı? Aslında, Windows Kaynak İzleyicisi'nin "Ağ Etkinliği ile İşlemler" sekmesi altında tam olarak verdiği verileri istiyorum: enter image description here

Windows Kaynak İzleyicisi bu bilgileri nasıl alır? Herhangi bir örnek? olarak, her işlem, bu sayaç altında gösterilir değil - Missing network sent/received ancak başarılı :

Ayrıca burada açıklanan sayaç metodu kullanmayı denemişlerdir. Ve yine Kaynak Monitörü bu bilgiyi bu sayacı kullanmadan bile nasıl elde ettiğimi merak ediyorum ...

+1

Eğer Performans Sayacı cevap bulamadınız mı:

benim sürecin ağını IO geri rapor etmek geçenlerde böyle bir şey yazmış? http://www.codeproject.com/Articles/8590/An-Introduction-To-Performance-Counters – Yogee

+0

Performans sayaçları yolu ile çalışmaya çalıştım ama başarı olmadan - eklediğiniz bağlantıyı bile okuyun. –

+1

http://stackoverflow.com/questions/438240/monitor-a-processs-network-usage –

cevap

2

PerformanceCounter'u kullanabilirsiniz. Örnek kod:

//Define 
string pn = "MyProcessName.exe"; 
var readOpSec = new PerformanceCounter("Process","IO Read Operations/sec", pn); 
var writeOpSec = new PerformanceCounter("Process","IO Write Operations/sec", pn); 
var dataOpSec = new PerformanceCounter("Process","IO Data Operations/sec", pn); 
var readBytesSec = new PerformanceCounter("Process","IO Read Bytes/sec", pn); 
var writeByteSec = new PerformanceCounter("Process","IO Write Bytes/sec", pn); 
var dataBytesSec = new PerformanceCounter("Process","IO Data Bytes/sec", pn); 

var counters = new List<PerformanceCounter> 
       { 
       readOpSec, 
       writeOpSec, 
       dataOpSec, 
       readBytesSec, 
       writeByteSec, 
       dataBytesSec 
       }; 

// get current value 
foreach (PerformanceCounter counter in counters) 
{ 
    float rawValue = counter.NextValue(); 

    // display the value 
} 

Ve bu ağ kartı için performans sayaçlarını elde etmektir. belirli

string cn = "get connection string from WMI"; 

var networkBytesSent = new PerformanceCounter("Network Interface", "Bytes Sent/sec", cn); 
var networkBytesReceived = new PerformanceCounter("Network Interface", "Bytes Received/sec", cn); 
var networkBytesTotal = new PerformanceCounter("Network Interface", "Bytes Total/sec", cn); 

Counters.Add(networkBytesSent); 
Counters.Add(networkBytesReceived); 
Counters.Add(networkBytesTotal); 
+0

Ancak, yalnızca aygıt I/o işlemleri olmayan ağ etkinliğini istiyorum. "IO Okuma İşlemleri/sn - Saniyede, olayın okuma G/Ç işlemlerini yayınladığı hızı gösterir. Dosya, ağ ve aygıt G/Ç dahil olmak üzere işlem tarafından oluşturulan tüm G/Ç etkinliğini sayar. " –

+0

Tek bir işlemle ilgili bir ağ kartı IO yapmak için başka bir yerel yol yoktur (3-taraf parti lib'lerine başvurmazsanız). Yaptığım şey, IO izleme sürecini ve ayrıca bir ağ kartını (IO) izlemekti. Daha sonra olsa da bir sürece özgü değildir - yani bir süreçten bağımsız olarak tüm IO sayaçlarını toplar. Ağ kartı sayaçlarını göstermek için kodu düzenleyeceğim. – oleksii

+1

Çözümünüz için teşekkürler, ancak bu zaten bulduğum ve hedefimi tam olarak yerine getiremediğim çözümlerden biri. Başka bir yol arıyorum, Windows Kaynak İzleyicisi bu bilgiyi alır gibi ... –

2

Kaynak monitör işlemek değildir Not ETW kullanır - minnetle Microsoft kullanımı kolaylaştırmak için güzel nuget .net wrapper oluşturduk.

using System; 
using System.Diagnostics; 
using System.Threading.Tasks; 
using Microsoft.Diagnostics.Tracing.Parsers; 
using Microsoft.Diagnostics.Tracing.Session; 

namespace ProcessMonitoring 
{ 
    public sealed class NetworkPerformanceReporter : IDisposable 
    { 
     private DateTime m_EtwStartTime; 
     private TraceEventSession m_EtwSession; 

     private readonly Counters m_Counters = new Counters(); 

     private class Counters 
     { 
      public long Received; 
      public long Sent; 
     } 

     private NetworkPerformanceReporter() { } 

     public static NetworkPerformanceReporter Create() 
     { 
      var networkPerformancePresenter = new NetworkPerformanceReporter(); 
      networkPerformancePresenter.Initialise(); 
      return networkPerformancePresenter; 
     } 

     private void Initialise() 
     { 
      // Note that the ETW class blocks processing messages, so should be run on a different thread if you want the application to remain responsive. 
      Task.Run(() => StartEtwSession()); 
     } 

     private void StartEtwSession() 
     { 
      try 
      { 
       var processId = Process.GetCurrentProcess().Id; 
       ResetCounters(); 

       using (m_EtwSession = new TraceEventSession("MyKernelAndClrEventsSession")) 
       { 
        m_EtwSession.EnableKernelProvider(KernelTraceEventParser.Keywords.NetworkTCPIP); 

        m_EtwSession.Source.Kernel.TcpIpRecv += data => 
        { 
         if (data.ProcessID == processId) 
         { 
          lock (m_Counters) 
          { 
           m_Counters.Received += data.size; 
          } 
         } 
        }; 

        m_EtwSession.Source.Kernel.TcpIpSend += data => 
        { 
         if (data.ProcessID == processId) 
         { 
          lock (m_Counters) 
          { 
           m_Counters.Sent += data.size; 
          } 
         } 
        }; 

        m_EtwSession.Source.Process(); 
       } 
      } 
      catch 
      { 
       ResetCounters(); // Stop reporting figures 
       // Probably should log the exception 
      } 
     } 

     public NetworkPerformanceData GetNetworkPerformanceData() 
     { 
      var timeDifferenceInSeconds = (DateTime.Now - m_EtwStartTime).TotalSeconds; 

      NetworkPerformanceData networkData; 

      lock (m_Counters) 
      { 
       networkData = new NetworkPerformanceData 
       { 
        BytesReceived = Convert.ToInt64(m_Counters.Received/timeDifferenceInSeconds), 
        BytesSent = Convert.ToInt64(m_Counters.Sent/timeDifferenceInSeconds) 
       }; 

      } 

      // Reset the counters to get a fresh reading for next time this is called. 
      ResetCounters(); 

      return networkData; 
     } 

     private void ResetCounters() 
     { 
      lock (m_Counters) 
      { 
       m_Counters.Sent = 0; 
       m_Counters.Received = 0; 
      } 
      m_EtwStartTime = DateTime.Now; 
     } 

     public void Dispose() 
     { 
      m_EtwSession?.Dispose(); 
     } 
    } 

    public sealed class NetworkPerformanceData 
    { 
     public long BytesReceived { get; set; } 
     public long BytesSent { get; set; } 
    } 
} 
+0

Yönetici tarafından idam edilmek mi gerekiyor? EnableKernelProvider yönteminden 'System.UnauthorizedAccessException' istisnası alıyorum. –

+0

Evet yönetici hakları gerekiyor. – Kram