2012-02-24 75 views
4

我開發了一個應用程序,並且我想測量在一些典型測試用例中它消耗了多少網絡帶寬。如何可靠地測量進程使用的網絡帶寬

我發現了幾個應用程序,如nethog等,但我不知道它的報告是多麼準確!

我想用某種方式來非常準確地測量結果需要進入會議報告的結果。

如果有人指導我如何做,我願意爲相同的方案編寫定製的解決方案!

我想要一些可以運行監控程序和我的目標應用程序來獲取網絡使用情況統計信息 - 累計字節數/ rcvd。 ..最大使用量和平均使用量 等

+2

內存總線帶寬的方式嗎?網絡帶寬?什麼帶寬? – 2012-02-24 19:00:57

+1

是什麼讓你覺得nethogs不準確? – 2012-02-24 19:01:43

+0

@Vlad網絡帶寬 – AnkurVj 2012-02-24 19:02:31

回答

4

應用程序可以在一臺機器上隔離嗎?
還有其他的東西需要在系統上運行嗎?

如果系統可以這種方式專用,則週期性地從/proc/net/netstat中抓取最後一行並減去InOctetsOutOctets的相應值。

該系統的Fedora 15,顯示了這個在23天后的正常運行時間:

TcpExt: SyncookiesSent SyncookiesRecv SyncookiesFailed EmbryonicRsts PruneCalled RcvPruned OfoPruned OutOfWindowIcmps LockDroppedIcmps ArpFilter TW TWRecycled TWKilled PAWSPassive PAWSActive PAWSEstab DelayedACKs DelayedACKLocked DelayedACKLost ListenOverflows ListenDrops TCPPrequeued TCPDirectCopyFromBacklog TCPDirectCopyFromPrequeue TCPPrequeueDropped TCPHPHits TCPHPHitsToUser TCPPureAcks TCPHPAcks TCPRenoRecovery TCPSackRecovery TCPSACKReneging TCPFACKReorder TCPSACKReorder TCPRenoReorder TCPTSReorder TCPFullUndo TCPPartialUndo TCPDSACKUndo TCPLossUndo TCPLoss TCPLostRetransmit TCPRenoFailures TCPSackFailures TCPLossFailures TCPFastRetrans TCPForwardRetrans TCPSlowStartRetrans TCPTimeouts TCPRenoRecoveryFail TCPSackRecoveryFail TCPSchedulerFailed TCPRcvCollapsed TCPDSACKOldSent TCPDSACKOfoSent TCPDSACKRecv TCPDSACKOfoRecv TCPAbortOnSyn TCPAbortOnData TCPAbortOnClose TCPAbortOnMemory TCPAbortOnTimeout TCPAbortOnLinger TCPAbortFailed TCPMemoryPressures TCPSACKDiscard TCPDSACKIgnoredOld TCPDSACKIgnoredNoUndo TCPSpuriousRTOs TCPMD6NotFound TCPMD5Unexpected TCPSackShifted TCPSackMerged TCPSackShiftFallback TCPBacklogDrop TCPMinTTLDrop TCPDeferAcceptDrop IPReversePathFilter TCPTimeWaitOverflow TCPReqQFullDoCookies TCPReqQFullDrop 
TcpExt: 0 0 0 0 0 0 0 0 10 0 67116 0 0 0 0 8 117271 53 18860 0 0 102295 23352211 87967244 0 16861098 118195 893786 881659 0 29 10 0 0 0 9 10 16 12 2321 21 0 1 156 39 940 13 921 8015 0 1 2 0 18461 22 941 0 0 2974 15422 0 709 0 0 0 1 8 119 3 0 0 0 0 25231 0 0 0 4 0 0 0 
IpExt: InNoRoutes InTruncatedPkts InMcastPkts OutMcastPkts InBcastPkts OutBcastPkts InOctets OutOctets InMcastOctets OutMcastOctets InBcastOctets OutBcastOctets 
IpExt: 0 0 25308 48 725 1 24434248973 4218365129 2181277 13241 365505 65 

當然,該格式是不友好這裏,但相當不錯的腳本語言來處理。你可以看到信息的深度和多樣性!最後一行顯示該系統讀取了24,434,248,973個字節並寫入了4,218,365,129。 (這是在刮大型網站九個一天。)

+0

不幸的是另一個應用程序使用一個粗略的想法網絡將不得不在同一臺機器上同時運行! \ – AnkurVj 2012-02-24 19:56:04

+0

@AnkurVj:可以將應用程序配置爲執行網絡I/O只與一個系統?也就是說,是否可以將專用服務器設置爲使用相同的技術,但從另一端? – wallyk 2012-02-24 20:01:43

+0

是的,我也許可以做到這一點。我認爲應該給我什麼,我需要..謝謝1 – AnkurVj 2012-02-24 20:03:50

0

周圍的一些更戳,我看到PROCFS包含似乎是每個進程網絡I/O統計。

[[email protected] ~]$ cat /proc/32089/net/dev 
Inter-| Receive            | Transmit 
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed 
    lo: 622834 6102 0 0 0  0   0   0 622834 6102 0 0 0  0  0   0 
    eth0: 3290609241 20752766 0 0 0  0   0   0 161708339 16831446 0 0 0  0  0   0 
virbr0:  0  0 0 0 0  0   0   0  0  0 0 0 0  0  0   0 

如果這是一個長期運行的過程,那麼這可以用來計算使用的帶寬。

---編輯--- 儘管路徑,正如其他人所指出的,這些都是所有過程是相同的,因此顯然不進程的網絡I/O統計。

+1

我檢查,發現所顯示的I/O統計資料不會每個進程......它顯示了同樣的統計數據所有流程... – AnkurVj 2012-04-04 10:33:05

+0

@AnkurVj這是正確的,'的/ proc//NET/dev'包含了相同的信息'的/ proc /淨/ dev'。 – scai 2012-08-17 11:33:32

0

獲取每個任務網絡io統計數據的唯一方法是使用某種taskstats接口(基於netlink)。不幸的是,它記錄了你可以想象的一切,但是網絡信息。我爲套接字寫入/讀取上的會計字節和taskstats上的兩個條目(對於tx/rx)做了一個小補丁,以從我的系統中獲取這種信息。

包括:

Signed-off-by: Rafael David Tinoco <[email protected]> 
diff --git a/include/linux/taskstats.h b/include/linux/taskstats.h 
index 341dddb..b0c5990 100644 
--- a/include/linux/taskstats.h 
+++ b/include/linux/taskstats.h 
@@ -163,6 +163,10 @@ struct taskstats { 
    /* Delay waiting for memory reclaim */ 
    __u64 freepages_count; 
    __u64 freepages_delay_total; 
+ 
+ /* Per-task network I/O accounting */ 
+ __u64 read_net_bytes;   /* bytes of socket read I/O */ 
+ __u64 write_net_bytes;  /* bytes of socket write I/O */ 
}; 

和源代碼:

Signed-off-by: Rafael David Tinoco <[email protected]> 
diff --git a/include/linux/task_io_accounting.h b/include/linux/task_io_accounting.h 
index bdf855c..bd45b92 100644 
--- a/include/linux/task_io_accounting.h 
+++ b/include/linux/task_io_accounting.h 
@@ -41,5 +41,12 @@ struct task_io_accounting { 
    * information loss in doing that. 
    */ 
    u64 cancelled_write_bytes; 
+ 
+ /* The number of bytes which this task has read from a socket */ 
+ u64 read_net_bytes; 
+ 
+ /* The number of bytes which this task has written to a socket */ 
+ u64 write_net_bytes; 
+ 
#endif /* CONFIG_TASK_IO_ACCOUNTING */ 
}; 
diff --git a/include/linux/task_io_accounting_ops.h b/include/linux/task_io_accounting_ops.h 
index 4d090f9..ee8416f 100644 
--- a/include/linux/task_io_accounting_ops.h 
+++ b/include/linux/task_io_accounting_ops.h 
@@ -12,6 +12,11 @@ static inline void task_io_account_read(size_t bytes) 
    current->ioac.read_bytes += bytes; 
} 

+static inline void task_io_account_read_net(size_t bytes) 
+{ 
+ current->ioac.read_net_bytes += bytes; 
+} 
+ 
/* 
    * We approximate number of blocks, because we account bytes only. 
    * A 'block' is 512 bytes 
@@ -26,6 +31,11 @@ static inline void task_io_account_write(size_t bytes) 
    current->ioac.write_bytes += bytes; 
} 

+static inline void task_io_account_write_net(size_t bytes) 
+{ 
+ current->ioac.write_net_bytes += bytes; 
+} 
+ 
/* 
    * We approximate number of blocks, because we account bytes only. 
    * A 'block' is 512 bytes 
@@ -59,6 +69,10 @@ static inline void task_io_account_read(size_t bytes) 
{ 
} 

+static inline void task_io_account_read_net(size_t bytes) 
+{ 
+} 
+ 
static inline unsigned long task_io_get_inblock(const struct task_struct *p) 
{ 
    return 0; 
@@ -68,6 +82,10 @@ static inline void task_io_account_write(size_t bytes) 
{ 
} 

+static inline void task_io_account_write_net(size_t bytes) 
+{ 
+} 
+ 
static inline unsigned long task_io_get_oublock(const struct task_struct *p) 
{ 
    return 0; 
diff --git a/include/linux/taskstats.h b/include/linux/taskstats.h 
index 341dddb..b0c5990 100644 
--- a/include/linux/taskstats.h 
+++ b/include/linux/taskstats.h 
@@ -163,6 +163,10 @@ struct taskstats { 
    /* Delay waiting for memory reclaim */ 
    __u64 freepages_count; 
    __u64 freepages_delay_total; 
+ 
+ /* Per-task network I/O accounting */ 
+ __u64 read_net_bytes;   /* bytes of socket read I/O */ 
+ __u64 write_net_bytes;  /* bytes of socket write I/O */ 
}; 


diff --git a/kernel/tsacct.c b/kernel/tsacct.c 
index 00d59d0..b279e69 100644 
--- a/kernel/tsacct.c 
+++ b/kernel/tsacct.c 
@@ -104,10 +104,14 @@ void xacct_add_tsk(struct taskstats *stats, struct task_struct *p) 
    stats->read_bytes  = p->ioac.read_bytes; 
    stats->write_bytes  = p->ioac.write_bytes; 
    stats->cancelled_write_bytes = p->ioac.cancelled_write_bytes; 
+ stats->read_net_bytes = p->ioac.read_net_bytes; 
+ stats->write_net_bytes = p->ioac.write_net_bytes; 
#else 
    stats->read_bytes  = 0; 
    stats->write_bytes  = 0; 
    stats->cancelled_write_bytes = 0; 
+ stats->read_net_bytes = 0; 
+ stats->write_net_bytes = 0; 
#endif 
} 
#undef KB 
diff --git a/net/socket.c b/net/socket.c 
index 769c386..dd7dbb6 100644 
--- a/net/socket.c 
+++ b/net/socket.c 
@@ -87,6 +87,7 @@ 
#include <linux/wireless.h> 
#include <linux/nsproxy.h> 
#include <linux/magic.h> 
+#include <linux/task_io_accounting_ops.h> 

#include <asm/uaccess.h> 
#include <asm/unistd.h> 
@@ -538,6 +539,7 @@ EXPORT_SYMBOL(sock_tx_timestamp); 
static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, 
          struct msghdr *msg, size_t size) 
{ 
+ int ret; 
    struct sock_iocb *si = kiocb_to_siocb(iocb); 
    int err; 

@@ -550,7 +552,12 @@ static inline int __sock_sendmsg(struct kiocb *iocb, struct socket *sock, 
    if (err) 
      return err; 

- return sock->ops->sendmsg(iocb, sock, msg, size); 
+ ret = sock->ops->sendmsg(iocb, sock, msg, size); 
+ 
+ if (ret > 0) 
+   task_io_account_write_net(ret); 
+ 
+ return ret; 
} 

int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) 
@@ -666,6 +673,7 @@ EXPORT_SYMBOL_GPL(sock_recv_ts_and_drops); 
static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock, 
            struct msghdr *msg, size_t size, int flags) 
{ 
+ int ret = 0; 
    struct sock_iocb *si = kiocb_to_siocb(iocb); 

    si->sock = sock; 
@@ -674,7 +682,12 @@ static inline int __sock_recvmsg_nosec(struct kiocb *iocb, struct socket *sock, 
    si->size = size; 
    si->flags = flags; 

- return sock->ops->recvmsg(iocb, sock, msg, size, flags); 
+ ret = sock->ops->recvmsg(iocb, sock, msg, size, flags); 
+ 
+ if (ret > 0) 
+   task_io_account_read_net(ret); 
+ 
+ return ret; 
} 

static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, 
0

Vnstat是簡單的工具來檢查網絡帶寬的使用,

下面是一個命令來安裝它

sudo apt-get install vnstat 

並運行您需要運行以下命令的vnstat。

vnstat 

這裏(check Monitor Network Bandwidth Usage)是每天檢查,每週多一些選擇,每月和十大一天的網絡帶寬的使用。

希望能幫助大家。

0

貓的/ proc /淨/ dev這是找出帶寬使用

[email protected]:~$ cat /proc/net/dev 
Inter-| Receive            | Transmit 
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed 
wlan1: 9420966650 7703510 0 1 0  0   0   0 673178457 4296602 0 0 0  0  0   0 
    eth2: 7961371946 6849173 0 10 0  0   0 167030 446826449 3289015 0 0 0  0  0   0 
    lo: 48209054 473527  0 0 0  0   0   0 48209054 473527  0 0 0  0  0   0