【问题标题】:Network Bandwidth testing or speed testing in python 2.7python 2.7中的网络带宽测试或速度测试
【发布时间】:2017-11-19 05:15:53
【问题描述】:

我需要测试客户端和服务器之间的网络带宽。我可以对文件进行简单的拖放,根据 windows 网络监视器,我得到了 800meg 范围内的某个位置。目标是使用 python 应用程序执行相同的测试,例如用于网络内部的 speedtest.net。这是我一直在使用的代码,但结果并没有像我看到的那样给我任何东西,我可能只是不理解它们。代码来自本站https://svn.python.org/projects/python/trunk/Demo/sockets/throughput.py

#! /usr/bin/env python

# Test network throughput.
#
# Usage:
# 1) on host_A: throughput -s [port]                    # start a server
# 2) on host_B: throughput -c  count host_A [port]      # start a client
#
# The server will service multiple clients until it is killed.
#
# The client performs one transfer of count*BUFSIZE bytes and
# measures the time it takes (roundtrip!).


import sys, time
from socket import *

MY_PORT = 50000 + 42

BUFSIZE = 1024


def main():
    if len(sys.argv) < 2:
        usage()
    if sys.argv[1] == '-s':
        server()
    elif sys.argv[1] == '-c':
        client()
    else:
        usage()


def usage():
    sys.stdout = sys.stderr
    print 'Usage:    (on host_A) throughput -s [port]'
    print 'and then: (on host_B) throughput -c count host_A [port]'
    sys.exit(2)


def server():
    if len(sys.argv) > 2:
        port = eval(sys.argv[2])
    else:
        port = MY_PORT
    s = socket(AF_INET, SOCK_STREAM)
    s.bind(('', port))
    s.listen(1)
    print 'Server ready...'
    while 1:
        conn, (host, remoteport) = s.accept()
        while 1:
            data = conn.recv(BUFSIZE)
            if not data:
                break
            del data
        conn.send('OK\n')
        conn.close()
        print 'Done with', host, 'port', remoteport


def client():
    if len(sys.argv) < 4:
        usage()
    count = int(eval(sys.argv[2]))
    host = sys.argv[3]
    if len(sys.argv) > 4:
        port = eval(sys.argv[4])
    else:
        port = MY_PORT
    testdata = 'x' * (BUFSIZE-1) + '\n'
    t1 = time.time()
    s = socket(AF_INET, SOCK_STREAM)
    t2 = time.time()
    s.connect((host, port))
    t3 = time.time()
    i = 0
    while i < count:
        i = i+1
        s.send(testdata)
    s.shutdown(1) # Send EOF
    t4 = time.time()
    data = s.recv(BUFSIZE)
    t5 = time.time()
    print data
    print 'Raw timers:', t1, t2, t3, t4, t5
    print 'Intervals:', t2-t1, t3-t2, t4-t3, t5-t4
    print 'Total:', t5-t1
    print 'Throughput:', round((BUFSIZE*count*0.001) / (t5-t1), 3),
    print 'K/sec.'


main()

这是一个示例输出

OK
Raw timers: 1497614245.55 1497614245.55 1497614245.55 1497614268.85 1497614268.85
Intervals: 0.000999927520752 0.000999927520752 23.2929999828 0.00300002098083
Total: 23.2979998589
Throughput: 43952.271 K/sec.

【问题讨论】:

    标签: python python-2.7 bandwidth speed-test


    【解决方案1】:

    我正在做类似的测试,如果增加测试数据的大小,结果可能会更好 - 但仍然无法利用全部可用带宽(在我的情况下为 1Gbps),不要知道为什么。

    更详细的,我正在测试从 Win7 客户端到 Win7 服务器的带宽,如果我将 testdata 更改为接收缓冲区大小的 4 倍,则在 1Gbps 链路上网络使用率可能高达 80% 以上.如果测试数据的大小与缓冲区大小相近,则使用率只会超过 30%。

    当我在 Debian8 客户端和同一台 Win7 服务器之间进行测试时,使用率可能高达接近 100%。另外,当我只是通过文件共享在同一台Win7机器之间复制一个大文件时,它也是100%的使用率。看起来问题出在客户端。任何建议将不胜感激。

    服务器代码(Python3.6):

    from __future__ import print_function
    
    import datetime
    import socket
    
    HOST = '0.0.0.0'
    PORT = 50000
    BUFFER = 4096
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((HOST,PORT))
    sock.listen(0)
    print('listening at %s:%s\n\r' %(HOST, PORT))
    
    while True:
        client_sock, client_addr = sock.accept()
    
        starttime = datetime.datetime.now()
        print(starttime, end="")
        print('%s:%s connected\n\r' % client_addr)
    
        count = 0
        while True:
            data = client_sock.recv(BUFFER)
            if data:
                count += len(data)
                del data
                continue
    
            client_sock.close()
    
            endtime = datetime.datetime.now()
            print(endtime)
            print('%s:%s disconnected\n\r' % client_addr)
    
            print('bytes transferred: %d' % count)
            delta = endtime - starttime
            delta = delta.seconds + delta.microseconds / 1000000.0
            print('time used (seconds): %f' % delta)
            print('averaged speed (MB/s): %f\n\r' % (count / 1024 / 1024 / delta))
            break
    
    sock.close()
    

    客户端代码(Python3.6):

    import datetime
    import socket
    
    HOST = 'a.b.c.d'
    PORT = 50000
    BUFFER = 4096
    
    testdata = b'x' * BUFFER * 4
    
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((HOST,PORT))
    for i in range(1, 1000000):
        sock.send(testdata)
    sock.close()
    

    【讨论】:

    • 在您的应用程序中发送较大的数据块可能会在物理层结束时累积较少的开销,因此吞吐量是不一致的。
    【解决方案2】:

    我一直在尝试实现相同的目标,并且在某种程度上我已经使用此代码 Speedtest.py。如果您希望在网页上呈现测试结果,它们甚至提供了一个 API,这需要 python 框架。我推荐flask

    Speedtest.net - 使用套接字进行测试,而不是此代码中使用的 https。

    ps - 如果您已经取得了更好的方法,我会很高兴您告诉我们所有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多