' psutil.net_io_counters().byte_recv '究竟是什么意思?



我使用ExpressVPN,我的物理连接是有线以太网连接。我目前连接到VPN,并在我的"控制面板网络和互联网网络连接"中;页上有一个用于以太网的适配器和一个名为"本地连接2"的适配器。

我的Windows设置程序告诉我通过"本地连接2"连接到互联网。和";Ethernet"没有网络

我做了一个小测试,我关闭了所有可以使用网络连接的程序,取了一个bytes_recv的值,然后下载了这个文件,它正好是1,073,741,824字节长,然后取了另一个bytes_recv的值并检查了差异:

import psutil
import requests
import sys
from io import BytesIO
def test(lan2=False):
if lan2:
bytes_recv0 = psutil.net_io_counters(pernic=True)['Local Area Connection 2'].bytes_recv
else:
bytes_recv0 = psutil.net_io_counters().bytes_recv
done = 0
r = requests.get('http://ipv4.download.thinkbroadband.com/1GB.zip', stream=True)
with BytesIO() as f:
for chunk in r.iter_content(131072):
done += len(chunk)
f.write(chunk)
sys.stdout.write('r{}% done'.format(round(done / 1073741824 * 100, 4)))
if lan2:
bytes_recv1 = psutil.net_io_counters(pernic=True)['Local Area Connection 2'].bytes_recv
else:
bytes_recv1 = psutil.net_io_counters().bytes_recv

return (bytes_recv1 - bytes_recv0) / 1073741824

我得到了以下结果:

In [69]: test()
100.0% doneOut[69]: 2.161009442061186
In [70]: test()
100.0% doneOut[70]: 2.1637731716036797
In [71]: test()
100.0% doneOut[71]: 2.174186712130904
In [72]: test(1)
100.0% doneOut[72]: 1.033312937244773
In [73]: test(1)
100.0% doneOut[73]: 1.0409678984433413
In [74]: test(1)
100.0% doneOut[74]: 1.0346684455871582

如果我不设置pernic,很明显,数据在某种程度上是重复计算的,事实上,如果我检查psutil.net_io_counters(pernic=True),那么'Local Area Connection 2''Ethernet'都会随着时间的推移而改变(所有其他接口都不会改变).

如果我只检查'Local Area Connection 2'接口,那么结果更像它,但不完全是。在检查过程中,我很确定只接收到1GiB的数据,但差异有点大,errin,errout,dropin&dropout计数没有改变…

我不知道为什么这个数字比预期的要大一些,但是我知道在电信中,较小的数据块被编码成较大的块,因此有一点开销,这个数字似乎类似于64b/66b编码,但如果是这种情况,那么这个数字应该接近1.03125,这些数字不太匹配。

为什么差异大于预期?

既然没有人费心回答这个问题,我就自己回答吧。

很明显,数字1.03125不是巧合,我的网络确实使用64b/66b行编码。

已经说过,我得到的数字仍然略高于1.03125,但是我执行了多次测试并平均了额外位的比例,差异相当小:

In [83]: sum(test(1)/1.03125-1 for i in range(16))/16
100.0% doneOut[83]: 0.0020151299734910144

大约有0.2%的开销,即大约有2.0635 MiB的额外数据(每传输1 GiB的有效负载),这非常接近2.048 MiB。

可能有其他应用程序正在使用我没有考虑到的网络,或者0.2%的开销是由加密引起的。

我认为额外的开销是由加密引起的,但我不确定,在我的网络中很难连接到VPN,所以我没有费心断开并检查。

由于数字很小,我不会试图纠正它,以免过度纠正。但是在进行计算时要考虑1.03125位。

最新更新