简单记录一些 在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=, __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("
")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
打印的一秒内,统计处于各个微妙时间段内的请求个数
文章目录概览1. UDB 架构2. UDB 表格式3. Rocksdb:针对flash存储优化过的第三方库3.1 Rocksdb架构3.2 为什么选择Rocksdb4. MyRocks / Rocksdb 开发历程4.1 设计目标4.2 性能挑战4.2.1 降低CPU的消耗4.2.2 降低range-scan 的延时消耗4.2.3 磁...
Compaction过程中 产生大量读I/O 的背景 项目中因大value 需求,引入了PingCap 参考Wisckey 思想实现的key-value分离存储 titan, 使用过程中因为有用到Rocksdb本身的 CompactionFilter功能,所以就直接用TitanDB的option 传入了compaction filt...
想要自己随时随地写一写rocksdb的代码,并且快速测试,但是公司的物理机登陆过于麻烦,想要验证功能的话其实在自己的电脑就完全可以了。 安装 brew install rocksdb,默认二进制文件安装在/usr/local/bin在~/.bashrc或者自己正在使用的shell的rc文件中 加入rocksdb的bin文件所在路径...
实验4-2:fork父子进程 实验目的: 理解fork创建子进程的本质 实验要求: 1、按如下要求编写程序: (1)、打开一个有内容的文件; (2)、调用fork创建子进程; (3)、读文件的第一个字符输出打印出来; (4)、看看父进程和子进程分别读到的字符是什么 2、按如下要求编写程序:...
Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一。该数据结构在内核文件 include/linux/sched.h 中定义,在Linux 3.8 的内核中,该数据结构足足有 380 行之多,在这...
转自:http://www.cnblogs.com/chaofan/archive/2009/12/02/1615691.html 今天在使用apache的时候80端口被占用了,解决办法如下 在命令行里输入netstat -aon|findstr "80" 查看使用了80端口的tc...
打开 build文件夹下面的webpack.base.conf.js; 找到下面这段代码,并将它注释掉: const createLintingRule = () => ({// test: /.(js|vue)$/,// loader: 'eslint-loader',// enforce: 'pre',// includ...
写一个.cc文件,其中抱哈std::lock_guard以及std::thread等c++11特性,开始使用gcc编译,过程中出现如下问题 gcc test_lock.cc -o test_lock This file requires compiler and library support for the ISO C++ 201...
在阅读ceph源码过程中发现部分C++语法还是不够熟悉,特此做一下笔记。 关于STL中的reserve函数的使用 reserve()是为容器预留空间,即为当前容器设定一个空间分配的阈值,但是并不会为容器直接allocate具体的空间,具体空间的分配是在创建对象时候进行分配得 以vector的reserve函数过程为例,直接看如下代码...
第一种写法: 第二种写法: 转载于:https://www.cnblogs.com/w...
Rank() over()的用法 创建一个test表,并插入6条数据。 CREATE TABLE test (a INT,b INT,c CHAR ) INSERT INTO test VALUES(1,3,'E') INSERT INTO test VALUES(2,4,'A') INSERT INTO test VAL...