【发布时间】:2015-04-08 06:47:50
【问题描述】:
我正在完成我的学士论文,其中我编写了一个程序,该程序分布在许多服务器上并通过 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 和网络应用程序有一定的经验......
【问题讨论】:
-
我忘了提:整个输出通过 bash 发送到一个文件:python myscript.py > log.txt
-
格式化输出很昂贵,尤其是对控制台而言。你可以试试
> /dev/null。那应该会有所作为。真正要尝试的是注释所有 I/O。无论如何,try this。它不花费任何费用,并告诉您正在发生的事情。 -
是的,控制台输出可能是一个瓶颈,不仅取决于您的代码,还取决于显示文本的程序。只需在 Windows 的控制台中进行基准测试,您就会明白我的意思……一些 linux 虚拟终端在这个方向上做了巨大的工作。呃……听说过什么是日志记录吗?
-
日志记录到底是什么意思?
-
我知道一般的日志记录是什么,但你在什么情况下是这样的?
标签: python performance networking cpu mininet