1

我正在对几个分布式系统(例如 Chord)进行一些研究,我希望能够仅用我的桌面编写算法并运行分布式系统的模拟。

在模拟中,我需要能够让每个节点独立执行并相互通信,同时手动诱导延迟、丢包、随机崩溃等元素。然后收集数据来估计系统的性能。

经过一番搜索,我发现 SimPy 非常适合我的目标。

SimPy会是适合这项任务的库吗?如果是,对于实施这样的系统有哪些建议/注意事项?

4

1 回答 1

1

我会说是的。

作为我博士学位的一部分,我使用 SimPy(第 2 版)来模拟任意通信网络。你可以在这里看到代码:

https://github.com/IncidentNormal/CommNetSim

但是,它有点密集并且没有很好的记录。此外,它真的应该被翻译成 SimPy 版本 3,因为不再支持 2(并且 3 修复了我在 2 中发现的一系列限制)。

我发现一些有用的概念/想法:

  • 在开始实施之前弄清楚你想要从模拟中得到什么;通信网络模拟对小的设计更改非常敏感,因为您正在有效地尝试监视/测量系统的紧急行为。
  • 开始过度设计仿真很容易,当您从设计中去除噪音时,使用原生 SimPy 对象几乎总是足够的。
  • 使用 Store 来模拟传输数据包/有效负载的媒介。在 SimPy 文档中有一个这样的示例用于模拟延迟:https ://simpy.readthedocs.io/en/latest/examples/latency.html
  • 事件很棘手 - 因为它们在每个模拟步骤中只能触发一次,所以这通常可能是错误的来源,因为如果多个事物在一个步骤中触发相同的事件,行为实际上会丢失。为了健壮性,尽量不要使用它们来表示通信网络中的行为(您很少需要低级别的东西),如上所述 - 使用 Stores 代替,因为它们在设计上就像队列一样。
  • 密切注意用于生成随机性的概率分布。与均匀分布相比,Expvariate 分布通常更接近于模拟自然系统,但请务必检查您使用的每个分布是否合理。例如,生成网络流量通常遵循泊松分布,而数据量通常遵循幂律 (Pareto) 分布。
于 2017-02-26T01:05:47.663 回答