How to reliably measure the network bandwidth used by a process

I developed an application, and I want to determine how much network bandwidth it consumes in some typical test cases.

I found several applications, such as nethog, etc., however I'm not sure how accurate its reports are!

I would like to measure very accurately somehow that the results should be included in the report for the conference.

I am ready to write individual solutions for the same, if someone tells me how to do it!

I want something where I can run the monitoring program and my target application to get network usage statistics - cumulative bytes sent / rcvd. Maximum use and average use, etc.

+4
source share
5 answers

Is it possible to isolate an application on one machine?
Is there anything else to run on the system?

If the system can be allocated this way, periodically grab the last line from /proc/net/netstat and subtract the corresponding InOctets and OutOctets .

This system, Fedora 15, shows this after 23 days of uptime:

 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 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 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 

Of course, this format is not friendly for here, but pretty nice for scripting languages. You can see the depth and variety of information! The last line shows that this system read 24,434,248,973 bytes and wrote 4218365129. (On the ninth day, a large website is scraped off.)

+4
source

Having tried a little more, I see that procfs contains what seems to be a process for net i / o stats.

 [ wally@lenovotower ~]$ 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 

If this is a lengthy process, then this can be used to calculate the bandwidth used.

--- change --- Despite this path, as others have noted, they are all the same for all processes and, therefore, do not explicitly relate to I / O statistics for each process.

0
source

The only way to get statistics for each task is to use some taskstats interface (based on netlink). Unfortunately, it takes into account everything you can imagine, as well as information about the network. I made a small patch to account for bytes in the write / read socket and two entries (for tx / rx) on taskstats to get such information from my systems.

Includes:

 Signed-off-by: Rafael David Tinoco < tinhocas@gmail.com > diff --git a/include/linux/taskstats.hb/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 */ }; 

And the source code:

 Signed-off-by: Rafael David Tinoco < tinhocas@gmail.com > diff --git a/include/linux/task_io_accounting.hb/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.hb/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.hb/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.cb/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.cb/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
source

Vnstat is a simple tool for checking the use of Internet traffic,

Here is the command to install it

 sudo apt-get install vnstat 

and to run vnstat you need to run the command below.

 vnstat 

Here ( check the use of network monitoring network ) - this is another option to check the daily, weekly, monthly and top 10-day use of network bandwidth.

Hope will help everyone.

0
source

Cat / proc / net / dev This is one way to learn about bandwidth usage.

 gaddenna@gaddenna-Vostro-3546 :~$ 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 
0
source

Source: https://habr.com/ru/post/1398283/


All Articles