控制台输出消耗大量CPU? (大约每秒140行)

时间:2015-04-05 19:44:52

标签: python performance networking cpu mininet

我正在完成我的学士论文,在那里我编写了一个程序,该程序分布在许多服务器上,并通过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条消息)之后,有太多丢失的结果导致发送重复次数过多而新请求已经进入,因此& #34;管理服务器"认为客户端服务器(3-15)已关闭并取消注册。将其与其他管理服务器同步后,所有客户端服务器在两个管理服务器上都被标记为已死,这是不正确的......

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

我将python 2.6用于服务器。

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

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

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

1 个答案:

答案 0 :(得分:0)

我终于找到了真正的问题。这不是因为打印(删除它们有点改进性能,但不是很明显),而是因为一个线程正在使用共享锁。这个锁在多个CPU核心上共享,导致整个过程非常缓慢。

我添加到执行VM的核心越来越慢,这很奇怪......

现在新的瓶颈似乎是APScheduler ......我总是得到像#"事件错过"因为调度程序上有太多负载。因此,接下来要加快......:)