收集CPU使用率数据以进行性能分析的程序[关闭]

问题描述 投票:-3回答:1

我用Go编写了一个复杂的程序(它使用许多并发构造)。我想对程序的CPU使用率进行准确的分析,但是我不知道从哪里开始。我特别希望获得有关以下方面的有用信息:

  • 同时运行的goroutine的最大数量(即并发线程);

  • 如果同时运行同一程序的多个实例,CPU使用率会发生多少变化?

  • 堆栈利用率(它根据我使用的嵌套函数数量告诉我是否使用大量(或少量)堆栈);

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

linux go performance-testing cpu-usage analysis
1个回答
1
投票

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

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

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

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

单个度量标准是特定类型的某些named

值。

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

  • Go运行时本身。

    其中包括goroutine的数量和垃圾收集状态之类的数据,这些测量值不可能超出运行范围出于明显的原因进入程序。

  • 操作系统提供的有关正在执行程序的运行进程的度量。

  • 这包括诸如在内核的用户和系统上下文中花费的CPU时间,操作系统所看到的内存消耗,打开的文件(和套接字)描述符的数量,CPU上下文切换器的数量,磁盘I /等等。

  • 由运行包含程序的容器的容器化软件提供的度量。

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


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

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

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

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

((我所了解的收集操作系统级别性能数据的技术含量最低但可访问性最高的方法是使用github.com/shirou/gopsutil/processpidstatiotopatop等工具。


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

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

或者您可能从一开始就大手笔,将指标发送到石墨,graphana,zabbix或icinga或当前位于臀部曲线顶部的任何东西。

© www.soinside.com 2019 - 2024. All rights reserved.