当前位置: 首页 > 编程日记 > 正文

Linux 下 进程运行时内部函数耗时的统计 工具:pstack,strace,perf trace,systemtap

简单记录一些 在linux下 统计进程内部函数运行耗时的统计工具,主要是用作性能瓶颈分析。当然以下工具除了pstack功能单一之外,其他的工具都非常强大,这里仅仅整理特定场景的特定用法,用作协同分析。

以下工具需要追踪具体的进程,如果想要打印信息更全,建议编译的时候将符号信息都编译到二进制文件之中,-g选项

  • strace
    strace -tttT -f -p $pid -o $save_file_name 追踪指定进程内部所有线程调用到的系统调用运行耗时,单位是秒,将统计结果保存到save_file_name的文件之中

    [pid 35467] 1596874136.770976 <... clock_gettime resumed> {1479879, 802163984}) = 0 <0.000293>
    [pid 35466] 1596874136.770989 <... futex resumed> ) = 0 <0.000290>
    [pid 35462] 1596874136.770998 <... futex resumed> ) = 1 <0.000289>
    [pid 35460] 1596874136.771007 <... sched_yield resumed> ) = 0 <0.000286>
    [pid 35457] 1596874136.771016 <... clock_gettime resumed> {1479879, 802216718}) = 0 <0.000280>
    [pid 35454] 1596874136.771025 <... sched_yield resumed> ) = 0 <0.000275>
    
  • pstack
    pstack $pid 追踪正在运行的进程的调用栈

    Thread 445 (Thread 0x7f17e35fe700 (LWP 33120)):
    #0  0x00007f18638be945 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
    #1  0x00007f18640a0cbc in __gthread_cond_wait (__mutex=<optimized out>, __cond=__cond@entry=0x13af91c8) at gthr-default.h:864
    #2  std::condition_variable::wait (this=this@entry=0x13af91c8, __lock=...) at condition_variable.cc:53
    #3  0x000000000065c21f in rocksdb::ThreadPoolImpl::Impl::BGThread (this=this@entry=0x13af9130, thread_id=thread_id@entry=29) at util/threadpool_imp.cc:196
    #4  0x000000000065c5c5 in rocksdb::ThreadPoolImpl::Impl::BGThreadWrapper (arg=0x13afbaf0) at util/threadpool_imp.cc:306
    #5  0x00007f18640a6f20 in execute_native_thread_routine_compat () at thread.cc:94
    #6  0x00007f18638bae25 in start_thread () from /lib64/libpthread.so.0
    #7  0x00007f18635e834d in clone () from /lib64/libc.so.6
    
  • perf trace
    sudo perf trace -p $pid --duration 50 --call-graph dwarf -o $save_file_name
    统计运行耗时超过50ms的系统调用,并打印该系统调用的calltrace,并将打印的结果保存到save_file_name的文件之中,一般用于追踪IO性能问题

    563.060 (61.970 ms): rocksdb:high0/33123 fdatasync(fd: 8396          ) = 0[0xffff80e79cbff9dd] (/usr/lib64/libc-2.17.so)rocksdb::PosixWritableFile::Sync (test)rocksdb::WritableFileWriter::SyncInternal (test)rocksdb::WritableFileWriter::Sync (test)rocksdb::BuildTable (test)rocksdb::FlushJob::WriteLevel0Table (test)rocksdb::FlushJob::Run (test)
    
  • systemtap
    这本身是一个非常强大的黑科技工具,除了内核态的调试之外,拥有符号表的用户进程也能够进行调试
    如下stap脚本trace_function_time,抓取运行时进程内部指定函数的耗时情况,并将耗时结果打印出来

    #!/bin/stap
    global sends #打印出来的单位是微妙
    probe process("test").function("rocksdb::DBImpl::GetImpl").return {sends <<< gettimeofday_us() - @entry(gettimeofday_us()) 
    }probe timer.s(1) { #每隔一秒打印一次print(ctime(gettimeofday_s()))print("\n")print(@hist_log(sends))delete sends    
    }
    

    需要sudo权限,直接sudo ./trace_function_time即可

    Fri Aug  7 03:24:18 2020 
    value |-------------------------------------------------- count0 |                                                       01 |                                                       02 |                                                     1824 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  212808 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                 1466616 |@@@@@@@@@@@@@@@                                     651832 |@@@@@@@@@@                                          460864 |@@@@@@@@                                            3421128 |@@@@@                                               2148256 |@@                                                   923512 |                                                     3611024 |                                                     1942048 |                                                      754096 |                                                      308192 |                                                       0
    16384 |                                                       0
    

    打印的一秒内,统计处于各个微妙时间段内的请求个数

相关文章:

c语言作业扩展名通常为什么,C语言的源程序通常的扩展名是( )

C语言的源程序通常的扩展名是( )更多相关问题【C20】A&#xff0e;asB&#xff0e;afterC&#xff0e;untilD&#xff0e;whenAlthough I spoke to her about the matter several times, she took little ______ of what I s“以质取胜”战略包括三个方面内容&#xff0c;分别是…

VS中C#读取app.config数据库配置字符串的三种方法(转)

关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet,SqlDataAparter,SqlConnection等控件时如影随行地提示你让去选择,或者是新建字符串。如果要用代码的方式取得…

获取线程中抛出的异常信息

1 ScheduledExecutorService service Executors.newScheduledThreadPool(10);2 // 从现在开始delay毫秒之后&#xff0c;每隔一天执行一次&#xff0c;转换为毫秒3 // service.scheduleAtFixedRate(this, delay, period, TimeUnit.MILLISECONDS);4 …

浅谈批处理获取管理员运行权限的几种方法

很多用了Win10版本系统的人都会发现&#xff0c;Windows对程序的运行权限是控制得更加严格了&#xff0c;即使你将UAC控制放至最低&#xff0c;如果没有特别赋予外来程序管理员运行权限的话&#xff0c;很多程序都会运行出错&#xff0c;包括很多用于系统维护的批处理程序由于运…

使用 sched_setaffinity 将线程绑到CPU核上运行

linux 提供CPU调度函数&#xff0c;可以将CPU某一个核和指定的线程绑定到一块运行。 这样能够充分利用CPU&#xff0c;且减少了不同CPU核之间的切换&#xff0c;尤其是在IO密集型压力之下能够提供较为友好的性能。 通过sched_setaffinity 设置 CPU 亲和力的掩码&#xff0c;从…

Objective C内存管理之理解autorelease------面试题

Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了&#xff0c;对于每一个Autorelease&#xff0c;系统只是把该Object放入了当前的Autorelease pool中&#xff0c;当该pool被释放时&#xff0c;该pool中的所有Object会被调用Release。 &…

c语言子程序return,c语言return返回到哪

c语言return返回到哪c语言return&#xff0c;返回给了上一级&#xff0c;比如一个递归程序&#xff0c;从第三层返回到第二层&#xff1b;又比如一个普通的子程序&#xff0c;那就返回到主程序中去。主程序中return返回给了操作系统。比如下面一个c程序int sum(int a, int b) {…

有关 schema

2019独角兽企业重金招聘Python工程师标准>>> 主要分析2点 &#xff1a;schema含义 以及 多schema下的XA处理 A schema is a collection of database objects (used by a user.). Schema objects are the logical structures that directly refer to the database’…

关于查询ios的app更新的历史版本记录

https://www.qimai.cn 推荐七麦数据 可以查询app的各种版本更新内容 由于历史久远忘记了自己app第一次上架的时间 通过这个可以查询 转载于:https://www.cnblogs.com/ccw-congcong/p/10593917.html

关于 Rocksdb 性能分析 需要知道的一些“小技巧“ -- perf_context的“内功” ,systemtap、perf、 ftrace的颜值

文章目录内部工具包含头文件接口使用核心指标Perf ContextIOStats Context外部工具Systemtap 工具Perf工具Ftrace 工具2020.8.20 23:23 &#xff0c;又到了夜深人静学习时&#xff0c;不断得思考总结总会让繁忙一天的大脑得到舒缓。作为单机存储引擎&#xff0c;Rocksdb总会被嵌…

一维数组求平均值c语言编程软件,c语言编程:用数组名作函数参数,编写一个对一维数组求平均值的函数,并在主函数中调用它...

#includeincludeint main(){void sort1(char*p1);void print(char*p2);static char*name[]{"zhangwww.book1234.com防采集请勿采集本网。#include #include #include float b(float arr[],int n); //<<<不知道你说的第2&#xff0c;4&#xff0c;5语句对应的是什…

2014年10月18日

我姐一个一点追求都没有弄的我气死了.女人管不住自己的臭嘴就让人烦死/ 还能不能嫁出去 蠢 女人说一个男的没追求没出息就是找枪口撞 蠢死转载于:https://www.cnblogs.com/wangduqiang/p/4180892.html

接口响应慢?那是你没用 CompletableFuture 来优化!

大多数程序员在平时工作中,都是增删改查。这里我跟大家讲解如何利用CompletableFuture优化项目代码,使项目性能更佳!

SQL Server 2012入门T-SQL基础篇:(8)Delete语句

基本的语法格式如下:Deleteform表名[where条件语句]此语句将删除表的部分或者全部记录;(1)带WHERE条件子句,将删除符合条件的记录:可以看到已经删除了"EmployeeKey1"的记录;(2)不带条件的delete的语句,将表中删除所有记录;转载于:https://blog.51cto.com/281816327/1…

30张图带你彻底理解红黑树

当在10亿数据进行不到30次比较就能查找到目标时,不禁感叹编程之魅力!人类之伟大呀!—— 学红黑树有感。终于,在学习了几天的红黑树相关的知识后,我想把我所学所想和所感分享给大家。红黑树是一种比较难的数据结构,要完全搞懂非常耗时耗力,红黑树怎么自平衡?什么时候需要左旋或右旋?插入和删除破坏了树的平衡后怎么处理?等等一连串的问题在学习前困扰着我。如果你在学习过程中也会存在我的疑问,那么本文对你会有帮助,本文帮助你全面、彻底地理解红黑树!

Linux内核分析--理解进程调度时机、跟踪分析进程调度和进程切换的过程

学号后三位:426 原创作品转载请注明出处 https://github.com/mengning/linuxkernel/ 1.进程的创建 除了0号进程&#xff08;系统创建的&#xff09;之外&#xff0c;linux系统中都是由其他进程创建的。创建新进程的进程&#xff0c;即调用fork函数的进程为父进程&#xff0c;…

数据结构 -- 散列表

散列表作为一种能够提供高效插入&#xff0c;查找&#xff0c;删除 以及遍历的数据结构&#xff0c;被应用在很多不同的存储组件之中。 就像rocksdb中的hashskiplist&#xff0c;redis的有序集合&#xff0c;java的 LinkedHashMap 等 都是一些非常有特色的核心数据结构&#xf…

c语言编程题餐饮服务打分,求详细分析C语言题餐饮服务质量调查打分题和答案..._质量员考试_帮考网...

bangsaizhuo新兵答主11-09TA获得超过6761个赞二、填空题1. &#xff3f;&#xff3f;&#xff3f;变量&#xff3f;&#xff3f;是指在程序运行过程中&#xff0c;值可以发生变化的量。2.C语言是一种&#xff3f;&#xff3f;&#xff3f;&#xff3f;区分&#xff3f;(区分/不…

为什么阿里巴巴修正了HashMap关于1024个元素扩容的次数?(典藏版)

此番修正主要是每个人对「扩容」定义存在了分歧,在JDK1.8中如果没有给HashMap设置初始容量,那么在第一次put()操作的时候会进行resize()。而有的人认为这算一次扩容,有的人认为这不是一次扩容,这只是HashMap容量的初始化。所以存储1024的元素时:前者的人认为扩容次数为8次。后者的人认为扩容次数为7次。孤尽老师说对此分歧,希望用没有「二义性」的语言来表示,所以「扩容次数」修正为「resize次数」。

【转】每天一个linux命令(31): /etc/group文件详解

原文网址&#xff1a;http://www.cnblogs.com/peida/archive/2012/12/05/2802419.html Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件。linux /etc/group文件是有关于系统管理员对用户和用户组管理的文件,linux用户组…

C#设计模式(7)——适配器模式(Adapter Pattern)

一、引言在实际的开发过程中&#xff0c;由于应用环境的变化&#xff08;例如使用语言的变化&#xff09;&#xff0c;我们需要的实现在新的环境中没有现存对象可以满足&#xff0c;但是其他环境却存在这样现存的对象。那么如果将“将现存的对象”在新的环境中进行调用呢&#…

强烈建议你不要再使用Date类了!!!

这里就不细说修改流程了,主要说一下我们在改造的时候遇到的一些问题。(Date从现在开始)是一个糟糕的类型,这解释了为什么它的大部分内容在 Java 1.1 中被弃用(但不幸的是仍在使用)。只能说这种基础的类改起来牵一发动全身,需要从DO实体类看起,然后就是各种Converter,最后是DTO。这个改造难度不高,但是复杂度非常高,一个地方没改好,轻则接口报错,重则启动失败,非常耗费精力,真不想改。我们要改的原因很简单,我们的代码缺陷扫描规则认为这是一个必须修改的缺陷,否则不给发布,不改不行,服了。

windows 安装MySQL服务 zip解压程序

1&#xff1a;配置 my.ini 文件 如下&#xff1a; [mysql] default-character-setutf8[mysqld] port3306basedirD:\\Program Files\\databases\\mysql-5.7.24datadirD:\\Program Files\\databases\\mysql-5.7.24\\datamax_connections200max_connections200character-set-serve…

数据结构 -- 图与图存储

我们在使用像QQ &#xff0c;微信&#xff0c;微博&#xff0c;快手&#xff0c;抖音等社交软件的过程中经常需要添加好友&#xff0c;关注好友和被好友关注。这个过程中 这样的社交网络中的好友关系就需要被存储下来&#xff0c;存储在各个公司的后台服务器之上&#xff0c;都…

Struts2 验证规则配置文件

1. Action级别校验命名格式&#xff1a; ActionClassName-validation.xml 2. Action中某个方法的校验命名格式&#xff1a; ActionClassName-ActionAliasName-validation.xml 注意&#xff1a;这里的ActionAliasName(action别名)指的是struts.xml中Action name"XX"的…

c语言中手机系统,一种手机课堂C语言编程系统的制作方法

技术特征&#xff1a;1.一种手机课堂C语言编程系统&#xff0c;其特征在于&#xff1a;该系统由手机端C语言编译运行单元、嵌入式主机端传输单元、台式机端显示单元和投影仪端显示单元组成&#xff1b;所述手机端C语言编译运行单元、嵌入式主机端传输单元、台式机端显示单元和投…

cpp中sizeof与指针

一直不清楚c的sizeof&#xff0c;现在通过实验得到了一些了解。 1 #include<iostream>2 3 using namespace std;4 5 class A{6 private:7 char * a1;8 // ! static int totalPeople0; //error: ISO C forbids in-class initialization of non-const static me…

利用Python制作简单的小程序:IP查看器

前言 说实话&#xff0c;查看电脑的IP&#xff0c;也挺无聊的&#xff0c;但是够简单&#xff0c;所以就从这里开始吧。IP地址在操作系统里就可以直接查看。但是除了IP地址&#xff0c;我们也想通过IP获取地理地址和网络运营商情况。IP地址和地理地址并没有固定的关系&#xff…

一文带你看透 GDB 的 实现原理 -- ptrace真香

文章目录Ptrace 的使用GDB 的基本实现原理Example1 通过ptrace 修改 被追踪进程的内存数据Example2 通过ptrace 对被追踪进程进行单步调试Ptrace的实现PTRACE_TRACEMEPTRACE_ATTACHPTRACE_CONTPTRACE_SINGLESTEPPTRACE_PEEKDATAPTRACE_POKEDATAPTRACE_GETREGSGDB本身能够attach…

线程使用 c语言,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …