【问题标题】:Console output consuming much CPU? (about 140 lines per second)控制台输出消耗大量 CPU? (大约每秒 140 行)
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2021-10-18
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    相关资源
    最近更新 更多