Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

9个月前关闭。



Improve this question




我在Go中编写了一个复杂的程序(它使用许多并发构造)。
我想对程序的 CPU使用率进行准确的分析,但是我不知道从哪里开始。
我特别希望获得有关以下方面的有用信息:
  • 同时运行的goroutine(即并发线程)的最大数量;
  • 如果我同时运行同一程序的多个实例,CPU使用率会发生多少变化?
  • 堆栈利用率(根据我使用了多少个嵌套函数,它告诉我是否使用大量(或少量)堆栈);

  • 我在Linux Ubuntu 18.04.1 LTS中工作。
    我应该怎么做才能获得这些信息?是否有任何程序(可能特定于Golang)可以获取此信息?

    最佳答案

    嗯,这是一个复杂的话题,所以不可能有一个明确的答案。

    实际上,您接近的产品在生产环境中称为“度量标准集合”或“遥测”。

    在大多数情况下,指标的收集使用采样方法:即,收集感兴趣的系统状态的快照并将其发送到某个地方。
    “某处”通常是一些系统,它允许将度量值保留在某处,并且通常还提供各种分析它们的方法。

    在最简单的情况下,通过查看从某种UI中收集的数据绘制的图形来完成分析。更复杂的情况包括:当某个指标的值上升到某个阈值之上(或下降到某个阈值之下)时发出警报。

    单个指标是特定类型的某些命名值。

    指标可以从不同的数据源中产生。
    使用Go运行的程序在合理通用的设置中典型的来源包括:

  • Go运行时本身。

    其中包括诸如goroutine的数量和垃圾收集统计信息之类的数据,这些数据不可能超出运行范围
    出于明显的原因执行程序。
  • 操作系统提供的有关正在执行程序的运行进程的度量。

    这包括诸如在内核的用户和系统上下文中花费的CPU时间,操作系统所看到的内存消耗,打开的文件(和套接字)描述符的数量,CPU上下文切换的数量,磁盘I / O状态之类的事情。等等。
  • 由运行包含程序的容器的容器化软件提供的度量。

    在Linux上,这通常由cgroup子系统提供,该子系统主要负责控制施加到进程层次结构上的资源限制。


  • 如何准确地从这些数据源转换数据是一个悬而未决的问题(这就是为什么它不适合SO格式的原因)。

    例如,要收集Go运行时统计信息,您可以使用@Adrian建议的expvar机制,并定期轮询它提供的HTTP端点以获取数据。

    或者,您可以在程序中运行内部goroutine,以定期从运行时获取这些数据并将其推送到某个地方。

    同样,可以以不同的方式对与操作系统级别的过程相关的数据进行采样。假设您可以使用 github.com/shirou/gopsutil/process 之类的东西从您的程序中收集它们,并将它们与从运行时统计信息中收集的指标一起推送,或者您可以使用一种或多种工具从外部收集这些数据。

    (收集我所了解的操作系统级性能数据的技术含量最低但可访问性最高的方法是使用诸如pidstatiotopatopcpustat等工具)。

    持久性和分析收集到的数据的问题再次存在。

    首先,它可能很简单,就像将所有内容都转储到结构化文件中一样-可能在每个记录上都带有时间戳记-并使用您喜欢的任何东西对其进行处理-例如pyplot或RRD-tool或R或其他。

    或者,您可能从一开始就拿起大手枪,然后将指标发送到石墨,graphana,zabbix或icinga或臀部曲线顶部的任何当前位置。

    关于linux - 程序,用于收集CPU使用率数据以进行性能分析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59491098/

    10-15 01:16
    查看更多