性能文章>使用Perf插件跟踪进程切换信息>

使用Perf插件跟踪进程切换信息原创

9月前
209212

CPU 使用率是最直观和最常用的系统性能指标,是在排查性能问题时会关注的第一个指标。而在导致CPU使用率过高的因素中,进程切换问题也是非常常见的。进程上下文切换次数较多的情况下,很容易导致CPU 将大量时间消耗在寄存器、内核栈、页表等资源的保存和恢复上,以至于导致系统性能不能充分利用

但进程切换次数过多或切换次数异常的时候,针对C/C++程序调式手段非常有限,很难找到进程切换的原因,Perf插件本身可以跟踪进程切换调用栈并进行统计,下面用个简单例子测试下:

#include <pthread.h>
#include <unistd.h>

void sleep2()
{
   int i = 0;
    for (;i<100000;i++)
    {
        usleep(2500000);
        printf("---%d---usleep 25000...\n",i);
    }
    printf("sleep2 10000 finished\n");
}

void sleep1()
{
    sleep2();
}

void *thread1(void *arg)
{

   printf("hello from the thread\n");
   sleep1();
   pthread_exit(NULL);
}

int main()
{
   int  rc, stat;
   int i=0;
    for(; i<1; i++)
    {
        rc = pthread_create(NULL, NULL, thread1, NULL);
        if (rc == -1) {
            perror("error in pthread_create");
            return rc;
    }
   rc = pthread_join(thid, (void *)&stat);
   return 0;
}

通过perf record 命令追踪⼀下进程的切换情况
-ag 记录调⽤栈
-p 指定进程pid
-e 要记录的事件, 本例中为 context-switches
图片1.png

追踪结束后通过report命令来查看进程切换信息的报告
图片2.png

可以看到该报告中总共抓到该进程主动切换了10次,全部是由sleep1 函数调用 sys_nanosleep函数切换进程的。
我们测试一个复杂的例子使用fio模拟大量io

./fio -filename=/home/admin/xinglu/fiotest/testdir/filetest -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=16G -numjobs=10 -runtime=100 -group_reporting -name=mytest

通过上述命令可以发信fio进程的切换集中在文件io的等待操作,相关报告和调用栈如下:
图片3.png

大家在碰到系统进程进程切换次数异常的问题时可以借助Perf工具,排查出具体函数。

XPocket下载地址:https://xpocket.perfma.com/docs/download/
Perf插件下载地址:https://plugin.xpocket.perfma.com/plugin/57

请先登录,再评论

一些XPocket 下的perf 操作命令详细,有介绍吗。我想用在定位内核的一些内存定位上

9月前
回复 祝融:

具体内存哪方面? perf 资料不是很多

9月前回复

为你推荐

在调试器里看LINUX内核态栈溢出
图灵最先发明了栈,但没有给它取名字。德国人鲍尔也“发明”了栈,取名叫酒窖。澳大利亚人汉布林也“发明”了栈,取名叫弹夹。1959年,戴克斯特拉在度假时想到了Stack这个名字,后来被广泛使用。
LONG究竟有多长,从皇帝的新衣到海康SDK
转眼之间初中毕业30年了,但我仍清楚的记得初中英语的一篇课文,题目叫《皇帝的新装》(“The king’s new clothes”)。这篇课文的前两句话是:”Long long ago, there
雕刻在LINUX内核中的LINUS故事
因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人。虽然大家可能都听过钱钟书先生的名言:“假如你吃个鸡蛋觉得味道不错,又何必认识那个下蛋的母鸡呢?” 但是如果真是遇到一个“特别显赫”
从猫蛇之战再看内核戏CPU
连续写了几天的代码,有些疲倦,吃过晚饭,换个工作方式,继续和大家聊猫蛇之战。蛇不仅丑陋,而且可能伤人害命,是邪恶的象征。猫与蛇战,代表着讨伐奸邪,是正义之战。猫与蛇战,技艺娴熟,举重若轻,叫人拍手叫绝
如何使用Linux内核中没有被导出的变量或函数?
本文详细介绍了使用EXPORT_SYMBOL宏导出函数或变量、使用kallsyms_lookup_name()查找函数或变量的虚拟地址以及内核模块中直接使用内核函数的虚拟地址等3种方案解决没有被EXPORT_SYMBOL 相关的宏导出的变量或函数不能直接使用的问题
LINUX网络子系统中DMA机制的实现
我们先从计算机组成原理的层面介绍DMA,再简单介绍Linux网络子系统的DMA机制是如何的实现的。 计算机组成原理中的DMA 以往的I/O设备和主存交换信息都要经过CPU的操作。不论是最早的轮询方式,
那些吃CPU的大户
最近沉浸在代码的世界里,处于两耳不闻窗外事的状态。今晚偶有闲暇,看了一眼任务管理器,IDLE进程的时间居然有800多小时,还有多个进程的CPU净时间达到小时级别。如下图所示,IDLE进程的CPU净时间
内存泄漏(增长)火焰图
本文总结了在分析内存增长和内存泄漏问题用到的4种追踪方法得到有关内存使用情况的代码路径,使用栈追踪技术对代码路径进行检查,并且会以火焰图的形式把它们可视化输出,在Linux上演示分析过程,随后概述其它系统的情况。