0

我正在写我的学士论文,在那里我编写了一个程序,该程序分布在许多服务器上,并通过 IPv6 多播和单播交换消息。网络使用率相对较高,但我认为当我在测试中有 15 台服务器时,它并不太高,每秒有 2 个请求是这样的:

服务器 1 通过多播向服务器 3-15 请求信息。3-15 人中的每一个都必须做出回应。如果在 0.5 秒后缺少一个响应,则重新发送多播,但只有缺少的服务器必须响应(因此在大多数情况下,这只是一台服务器)服务器 2 完全相同。如果在 5 次重试后仍有缺失的结果,缺失的服务器将被标记为死机,并且更改会与另一台服务器同步 (1/2)

所以每秒有 2 次多播,每秒有 26 次单播。我觉得这个应该不会太多吧?

服务器 1 和 2 正在运行 python web 服务器,我用它们每秒在每台服务器上执行请求(通过 web 客户端)

整个 szenario 在 mininet 环境中运行,该环境在具有 2 个内核(最大 2.8ghz)和 1GB RAM 的虚拟盒 ubuntu 中运行。在运行测试时,我通过 htop 看到 CPU 为 100%,而 RAM 为 50%。所以CPU是这里的瓶颈。

我注意到在 2-5 分钟后(1 分钟 = 60 * (2+26) 消息 = 1680 条消息)有太多丢失的结果导致太多重复发送,而新请求已经进入,因此“管理服务器”认为客户端服务器 (3-15) 已关闭并注销它们。在与其他管理服务器同步后,所有客户端服务器在两个管理服务器上都被标记为死机,这是不正确的......

我想知道问题是否可能是我的调试输出?我为发送和接收的每条消息打印 3-5 条消息。这大约是(让我们猜测每个发送/接收消息有 5 条消息)(26 + 2)*5 = 140 行打印在控制台上。

我对服务器使用 python 2.6。

所以这里的问题是:控制台输出是否可以减慢整个系统的速度,即简单的请求需要超过 0.5 秒才能连续完成 5 次?在我的测试中请求处理很简单。没有复杂的计算或类似的东西。基本上它类似于“在[“bla”,“blaaaa”,...]中返回request_param(5个项目的小清单)”

如果是,我怎样才能完全禁用输出而不必注释掉每个打印语句?或者甚至有可能只输出包含“错误”或“警告”的行?(不是通过 grep,因为当 grep 变为活动状态时,所有打印都已经完成......我的意思是直接在 python 中)

还有什么可能导致我的应用程序这么慢?我知道这是一个非常普遍的问题,但也许有人已经对 mininet 和网络应用程序有一些经验......

4

1 回答 1

0

我终于找到了真正的问题。这不是因为打印(删除它们会稍微提高性能,但不是显着),而是因为使用共享锁的线程。这个锁在多个 CPU 内核上共享,导致整个事情变得非常缓慢。

我添加到正在执行的虚拟机中的内核越多,它甚至变得越慢,这很奇怪......

现在新的瓶颈似乎是 APScheduler ......我总是收到诸如“事件错过”之类的消息,因为调度程序的负载太多。所以这是接下来要加快速度的事情...... :)

于 2015-04-07T22:47:50.737 回答