【问题标题】:How to check which part of app is consuming CPU?如何检查应用程序的哪个部分正在消耗 CPU?
【发布时间】:2009-09-24 08:45:56
【问题描述】:

我有一个 wxPython 应用程序,它有许多工作线程、空闲事件周期和许多其他可以消耗 CPU 的事件处理代码,现在当应用程序不被交互时消耗大约 8-10% 的 CPU。

问题:

是否有工具可以判断我的应用程序的哪些部分/线程消耗最多的 CPU?如果没有这样的通用工具,我愿意知道您通常采用哪些方法来解决此类情况?例如禁用部分应用程序、跟踪等

编辑:可能是我的问题语言不明确,我不想知道我的代码中的哪个函数或代码块占用了大部分资源,因为我可以使用分析器。 我想知道的是当我运行我的应用程序时,我看到 cpu 使用率为 8-10%,现在有没有办法知道我的应用程序的哪些不同部分、线程正在使用这 10% 的 cpu? 基本上在那一刻我想知道代码的哪一部分正在运行?

【问题讨论】:

  • “语言歧义”不会改变下面的答案。使用分析器——不管是什么语言——看看时间在哪里。您希望获得“魔法”还是一些“秘密”工具?您拒绝的探查器答案有什么问题?
  • @S.Lott:因为我无法看到分析器如何更有效地或根本无法解决我的问题,而不是我只是打开跟踪几秒钟以查看正在发生的事情在那一刻运行,而不是说做分析,你能解释一下如何使用分析是这种情况,可能是解释要么会澄清你的疑问,要么很可能是我的

标签: python wxpython cpu-usage


【解决方案1】:

如果您的所有线程都有独特的启动方法,您可以使用profiler that comes with Python

如果您使用的是 Mac,则应该查看 Instruments 应用。对于 Linux,您也可以使用 dtrace

【讨论】:

  • 探查器将如何提供帮助? dtrace 可用于 linux(ubuntu) 吗?
  • @Anurag Uniyal:你不清楚分析器是做什么的吗?它告诉程序的哪一部分一直在用完。如果每个线程都有一个唯一的启动方法,那么一直使用的方法名称会告诉你哪个线程一直在使用。请阅读分析器。
  • 我可能没有你那么有见识,但是我经常使用分析器,可能是我的问题的语言不明确,我已经编辑了它,看看现在是否有意义?
  • @S.Lott,profilet 告诉我们执行时间(io 和其他等待计数),而不是每个函数的 cpu 使用率
【解决方案2】:

这在与语言无关的级别上不太实用。去掉语言,你剩下的就是一堆机器代码指令,这些指令到处都是系统调用。您可以在 Linux 上使用 strace 或在 Windows 上使用 ProcessExplorer 来尝试猜测这些系统调用发生了什么,但仅使用探查器会更有意义。如果您确实可以使用该语言,那么您可以做很多事情(额外的日志记录、调试器中的随机暂停),但在这种情况下,分析器仍然是您最好的工具。

【讨论】:

  • ok 删除了与语言无关的,但我仍然不确定 profiler 是否可以帮助我很多
  • 几个分析器不仅可以为您提供单个函数(例如采样)的输出,还可以为您提供整个调用堆栈(例如函数属性或“调用图”)的输出。这可以准确地告诉您应用程序的大部分时间都花在了哪里。
  • 我明白这一点,但分析线程和主线程会提供大量数据,并且可能是错误警报,例如大部分时间都花在了正确的功能上,但是由于整个系统中存在大量事件、计时器、线程,所以虽然没有任何活动正在进行,但基本 cpu 使用率,我只想跟踪那些
  • 您将准确跟踪那里的内容。如果没有“活动”,那么分析器中显示的内容正是您谈论的内容。
【解决方案3】:

在 Windows XP 及更高版本上,Process Explorer 将显示所有进程,您可以查看每个进程的属性并查看打开的线程。它显示线程 ID、开始时间、状态、内核时间、用户时间等。

【讨论】:

    【解决方案4】:

    我可以通过编写python trace模块的修改版本来解决我的问题,可以启用禁用,基本上修改Trace类这样的东西

    import sys
    import trace
    
    class MyTrace(trace.Trace):
        def __init__(self, *args, **kwargs):
            trace.Trace.__init__(self, *args, **kwargs)
            self.enabled = False
    
        def localtrace_trace_and_count(self, *args, **kwargs):
            if not self.enabled:
                return None 
            return trace.Trace.localtrace_trace_and_count(self, *args, **kwargs)
    
    tracer = MyTrace(ignoredirs=[sys.prefix, sys.exec_prefix],)
    
    def main():
        a = 1
        tracer.enabled = True
        a = 2
        tracer.enabled = False
        a = 3
    
    # run the new command using the given tracer
    tracer.run('main()')
    

    输出:

     --- modulename: untitled-2, funcname: main
    untitled-2.py(19):     a = 2
    untitled-2.py(20):     tracer.enabled = False
    

    在关键点启用它可以帮助我逐行跟踪哪些代码语句执行得最多。

    【讨论】:

    • 嗨@Anurag Uniyal,我们正在寻找完全相同的解决方案。您能否分享您的修改和使用情况。
    • 但是执行得最多的行..不需要相同的 CPU 时间?探查器只是告诉你,numcalls 函数
    • @AmolPujari 如果您阅读了这个问题,它是关于如何知道 GUI 应用程序在给定时刻正在执行什么,主要是消耗 CPU,它基本上是跟踪源代码而不是配置它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多