首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一个CPU上跟踪/监视短时间CPU密集型进程

在一个CPU上跟踪/监视短时间CPU密集型进程
EN

Unix & Linux用户
提问于 2016-03-29 01:18:26
回答 2查看 1.5K关注 0票数 3

所以我已经处理这个问题有一段时间了,我很难找到解决这个问题的工具,我必须想象这个问题是存在的。下面是我的基本问题:

  • 我们运行一个4核RHEL5 5/centos5 5的抢占式rt补丁,并试图做一些事情,以确保少数应用程序得到合理的确定性(fifo调度,高优先级等)。无论如何,我们最近开始运行一个PTPv2客户端,其优先级略高于默认值。事实上,如果你饿了PTPv2客户端的CPU时间,就会产生一些非常可怕的副作用。在不太深入细节的情况下,我们很确定有什么东西占用了我们将PTP守护进程限制在相对较短的时间内的CPU (因为我们的传统日志记录没有捕捉到它)。因此,简短的版本是,我们在userland中启动这个PTP客户机(使用daemon调用),将它绑定到一个特定的taskset上,然后让它离开。每隔几个小时左右,就会有一些东西抢先我们的PTP客户端,或者出于某种原因,让它不能运行,时间是10 on 500 on。

因为我知道PTP运行在哪个CPU上,所以我认为相对来说,跟踪这个CPU正在发生什么是比较容易的。不幸的是,虽然在给定的时间(顶级和朋友)或最近的某个时间(sar和朋友)很容易跟踪某个CPU正在发生的事情,但是很难捕捉到可能只持续很短一段时间(毫秒范围内)但不经常(每隔几个小时左右)的性能高峰。我试过以下几种方法(但我并不声称它们都正确使用过!)因此,如果您认为我使用了正确的工具,请告诉我):

  • htop/ top : top和朋友对我了解当前发生的事情非常有用。在一个多核系统上,这变得稍微困难一些,因为现在你必须看一个选项,它告诉你一个进程最后在哪个CPU上执行,而忽略了其他的,但是如果一些事情发生在一段时间前,和/或仅仅在很短的一段时间内,似乎很难得到顶部去做我想做的事情,除非经常做很多顶级日志记录。Htop,虽然更令人愉快,但似乎提供了或多或少相同的功能,至少对于我想做的事情是这样的。
  • sar: sar似乎更适合它,因为据说它会跟踪一段时间的活动。然而,sar似乎非常擅长于告诉您系统在5、10、15分钟前是如何执行的,但不知道为什么会这样执行。换句话说,很难确定是哪个进程(如果它甚至是一个用户“进程”)导致了我的问题。不管是哪种方式,我都会手工记录和解析大量数据。
  • mpstat: mpstat真的很好,因为您可以很容易地将所查看的内容限制在您感兴趣的CPU上。但是,它提供的信息是非常不透明的,即使我设置mpstat来基本连续运行(以捕获相对较快的事件),即使我管理人员看到活动激增,也没有什么方法可以知道它是从哪里来的(除非我遗漏了什么东西,在这种情况下,这就是我来这里的原因!)

那么,你会如何解决这个问题呢?我知道我的用户PTP守护进程被搞砸了,因为据我所知,在一个基本的层次上,它从网络中获得绝对时间,而PTP试图使时钟频率和滴答值更接近那个时间。然而,如果出于某种原因(比如PTP会挨饿/暂时不运行),并且它看到的当前时间和它认为主时间是相当大的(通常大于1s),它就会继续前进,设置/强制时钟,而不会使它倾斜,这确实会扰乱应用程序,这些应用程序并不期望时钟会发生剧烈的变化(在这种情况下,时间急剧超过200 1s,但是我们确实看到了当时钟立即移动半秒钟或更长时间时,事情就会崩溃)--这正是我所看到的。正如我所说的,我们将它设置为一个CPU,所以我知道它运行在哪个CPU上。我们在我们的grub.conf中隔离,并且改变init的亲和力,这样init产生的子进程在特定的(不同的) CPU中产生,所以理论上我们可以完全控制CPU PTP正在运行in...but --有些东西仍然在阻止PTP在需要的时候接收数据包,我一直在努力跟踪它。

作为记录,是的,我确实知道我们应该将PTP作为内核模块运行,并且通过chrt‘将PTP守护进程设置为具有高(低)优先级的FIFO来避免这个问题,这似乎确实解决了这个问题,但随着时间的推移,这是一个关于在特定CPU上跟踪系统性能的一般性问题。你们怎么着手解决这个问题?

非常感谢!任何帮助都是非常感谢的。

EN

回答 2

Unix & Linux用户

发布于 2016-03-31 02:45:59

我遇到了一个类似于您的问题(有一个由Nagios使用的短命的、写好的监视器应用程序)。我想出的解决方案是收藏品和bash循环的组合。

因为收集器可以像这样被进程名唤醒

代码语言:javascript
运行
复制
collectl -sZ -i.1:.1 --procfilt f[your process name]

当然,我知道我将调用哪个进程,所以我将其放入这样的循环中:

代码语言:javascript
运行
复制
for((i=1;i<10000;i++)); do nohup /path/to/your/app & done

不确定这是否符合你的需要。另外,最好在任何VM /备用机器上进行测试。

票数 0
EN

Unix & Linux用户

发布于 2016-03-31 19:56:55

普雷克-你比我早。总是很高兴看到别人回答问题。为了记录在案,您可以说-i:.1,它将对非进程数据使用默认的1秒,但是由于您没有任何数据,所以输入的次数要少一些;)

同样非常清楚的是,进程名称有点痛苦。对于f,您需要记录在/proc/pid/stat中的名称,该名称通常可以工作。如果使用c,它将匹配/proc/pid/cmdline中的任何内容,其中包含指向命令的路径,甚至是开关。我的经验法则是,如果你找不到f,试试c,我猜你也很熟悉p,p和其他选项。我永远记不住他们的全部,所以总是提到收藏品

-mark

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/272752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档