【问题标题】:Network Simulation on SimPySimPy 上的网络模拟
【发布时间】:2021-07-23 22:29:30
【问题描述】:

我正在尝试模拟许多节点使用的网络链接在SimPy(python 库)上进行通信。我将网络设为simpy.Resource(env, 1),因为所有通信通道通常都是 FIFO。当节点需要发送数据时,它会请求网络资源,然后传输数据。

def transfer(env,data_size):
    net_delay = data_size/WAN_BANDWIDTH
    with network_queue.request() as req:
        yield req
        yield env.timeout(net_delay)

但正因为如此,传输大量数据的节点会占用通道,而小型传输会排队。我确信这不是真正的网络传输的工作方式。每次传输都会获得相等且分开的带宽。有什么解决这个问题的建议吗?

以下是我想出的。

def transfer(env,transfer_size):
    transfer_size_remaining = transfer_size
    while(transfer_size_remaining>0):
        with network_queue.request() as request:
            yield request
            
            data_size = min(transfer_size_remaining,MTU)
            yield env.timeout(data_size/WAN_BANDWIDTH)
            
            transfer_size_remaining -= data_size

我将在每个请求中请求网络队列和MTU(1500 字节)字节数。我认为这应该自动使其循环并在所有正在传输数据的节点之间分配等量的带宽。

我的解决方案有什么问题吗?有没有更好的方法来做到这一点?或者是否有使用 SimPy 执行此操作的标准正确方法?

提前致谢!

【问题讨论】:

    标签: python simpy


    【解决方案1】:

    我认为您的解决方案看起来不错。我想这就是我第一次尝试的样子。我没有看到叶试图提出的问题

    您可能要考虑的一件事是使用优先级资源,其中节点的第一次传输比其后面的传输获得更高的优先级。好处是,如果您的队列充满了一堆巨大的多传输作业,那么小的一个传输作业不会受到大队列时间的影响。不利的一面是,如果您的工作负载主要由小型作业组成,那么大型作业将永远不会获得任何资源时间,因为小型作业将具有更高的优先级。但是,如果大型作业在队列中的等待时间过长,则可以通过添加中断以重新提交具有更高优先级的大型作业来解决该问题。当然,最好的工作负载策略(其中有很多)取决于工作负载的构成。

    【讨论】:

      【解决方案2】:

      您应该创建另一个进程来实现超时。否则会被第一次yield阻塞。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      相关资源
      最近更新 更多