1.mysqld起动方式:

  1.mysqld以root用户运行

  valgrind --tool=callgrind --separate-threads=yes  --trace-children=yes  mysqld --datadir=/data --basedir=/usr/local/mysql56 --user=root

  (,当shutdown mysqld 会在当前命令行目录下,生成callgrind.out * 开头的文件)

2.mysqld以mysql用户运行

1.cd /tmp

   2.valgrind --tool=callgrind --separate-threads=yes  --trace-children=yes  mysqld --datadir=/data --basedir=/usr/local/mysql56 --user=mysql

 

2.sql相关操作

mysql>select now()

3.mysqladmin -uroot -p shutdown

/tmp目录下生成callgrind.out * 开头的文件

4.把相关 callgrind.out * 开头的文件传送到windows,用kcachegrind.exe 打开

这个练习中,我打算上一节速成课,内容是使用Valgrind的两个工具callgrind和cachegrind。这两个工具会分析你程序的执行,并且告诉你哪一部分运行缓慢。这些结果非常精确,因为Valgrind的工作方式有助于你解决一些问题,比如执行过多的代码行,热点,内容访问问题,甚至是CPU的缓存未命中。

为了做这个练习,我打算使用bstree_tests单元测试,你之前用于寻找能提升算法的地方。你需要确保你这些程序的版本没有任何valgrind错误,并且和我的代码非常相似,因为我会使用我的代码的转储来谈论cachegrind和callgrind如何工作。

运行 Callgrind
为了运行Callgrind,你需要向valgrind传入--tool=callgrind选项,之后它会产生callgrind.out.PID文件(其中PID为所运行程序的进程PID)。一旦你这样运行了,你就可以使用一个叫做callgrind_annotate的工具分析callgrind.out文件,它会告诉你哪个函数运行中使用了最多的指令。下面是个例子,我在bstree_tests上运行了callgrind,之后得到了这个信息: $ valgrind --dsymutil=yes --tool=callgrind tests/bstree_tests
...
$ callgrind_annotate callgrind.out.
--------------------------------------------------------------------------------
Profile data file 'callgrind.out.1232' (creator: callgrind-3.7..SVN)
--------------------------------------------------------------------------------
I1 cache:
D1 cache:
LL cache:
Timerange: Basic block -
Trigger: Program termination
Profiled target: tests/bstree_tests (PID , part )
Events recorded: Ir
Events shown: Ir
Event sort order: Ir
Thresholds:
Include dirs:
User annotated:
Auto-annotation: off --------------------------------------------------------------------------------
Ir
--------------------------------------------------------------------------------
,, PROGRAM TOTALS --------------------------------------------------------------------------------
Ir file:function
--------------------------------------------------------------------------------
, src/lcthw/bstrlib.c:bstrcmp [tests/bstree_tests]
, src/lcthw/bstree.c:BSTree_get [tests/bstree_tests]
, src/lcthw/bstree.c:default_compare [tests/bstree_tests]
, src/lcthw/bstree.c:BSTree_delete [tests/bstree_tests]
, src/lcthw/bstrlib.c:bformat [tests/bstree_tests]
, src/lcthw/bstrlib.c:bfromcstralloc [tests/bstree_tests]
, src/lcthw/bstree.c:BSTree_set [tests/bstree_tests]
, src/lcthw/bstrlib.c:bdestroy [tests/bstree_tests]
, src/lcthw/bstree.c:BSTreeNode_create [tests/bstree_tests]
, /private/tmp/pkg-build/coregrind//vg_preloaded.c:vg_cleanup_env [/usr/local/lib/valgrind/vgpreload_core-amd64-darwin.so] $
我已经移除了单元测试和valgrind输出,因为它们对这个练习没有用。你应该看到了callgrind_anotate输出,它向你展示了每个函数所运行的指令数量(valgrind中叫做Ir),由高到低排序。你通常可以忽略头文件的数据,直接跳到函数列表。 注 如果你获取到一堆“???:Image”的行,并且它们不是你程序中的东西,那么你读到的是OS的垃圾。只需要在末尾添加| grep -v "???"来过滤掉它们。
我现在可以对这个输出做个简短的分解,来找出下一步观察什么: 每一行都列出了Ir序号和执行它们的file:function 。Ir是指令数量,并且如果它越少就越快。这里有些复杂,但是首先要着眼于Ir。
解决这个程序的方式是观察最上面的函数,之后看看你首先可以改进哪一个。这里,我可以改进bstrcmp或者BStree_get。可能以BStree_get开始更容易些。
这些函数的一部分由单元测试调用,所以我可以忽略它们。类似bformat,bfromcstralloc和 bdestroy就是这样的函数。
我也可以找到我可以简单地避免调用的函数。例如,或许我可以假设BSTree仅仅处理bstring键,之后我可以不使用回调系统,并且完全移除default_compare。
到目前为止,我只知道我打算改进BSTree_get,并且不是因为BSTree_get执行慢。这是分析的第二阶段。 Callgrind 注解源文件
下一步我使用callgrind_annotate输出bstree.c文件,并且使用所带有的Ir对每一行做注解。你可以通过运行下面的命令来得到注解后的源文件: $ callgrind_annotate callgrind.out. src/lcthw/bstree.c
...
你的输出会是这个源文件的一个较大的转储,但是我会将它们剪切成包含BSTree_get和BSTree_getnode的部分: --------------------------------------------------------------------------------
-- User-annotated source: src/lcthw/bstree.c
--------------------------------------------------------------------------------
Ir , static inline BSTreeNode *BSTree_getnode(BSTree *map, BSTreeNode *node, void *key)
. {
, int cmp = map->compare(node->key, key);
, => src/lcthw/bstree.c:default_compare (14850x)
.
, if(cmp == ) {
. return node;
, } else if(cmp < ) {
, if(node->left) {
. return BSTree_getnode(map, node->left, key);
. } else {
. return NULL;
. }
. } else {
, if(node->right) {
. return BSTree_getnode(map, node->right, key);
. } else {
. return NULL;
. }
. }
. }
.
. void *BSTree_get(BSTree *map, void *key)
, {
, if(map->root == NULL) {
, return NULL;
. } else {
. BSTreeNode *node = BSTree_getnode(map, map->root, key);
, return node == NULL ? NULL : node->data;
. }
. }
每一行都显示它的Ir(指令)数量,或者一个点(.)来表示它并不重要。我所要找的就是一些热点,或者带有巨大数值的Ir的行,它能够被优化掉。这里,第十行的输出表明,BSTree_getnode开销非常大的原因是它调用了default_comapre,它又调用了bstrcmp。我已经知道了bstrcmp是性能最差的函数,所以如果我想要改进BSTree_getnode的速度,我应该首先解决掉它。 之后我以相同方式查看bstrcmp: , int bstrcmp (const_bstring b0, const_bstring b1) {
. int i, v, n;
.
, if (b0 == NULL || b1 == NULL || b0->data == NULL || b1->data == NULL ||
, b0->slen < || b1->slen < ) return SHRT_MIN;
, n = b0->slen; if (n > b1->slen) n = b1->slen;
, if (b0->slen == b1->slen && (b0->data == b1->data || b0->slen == ))
. return BSTR_OK;
.
, for (i = ; i < n; i ++) {
, v = ((char) b0->data[i]) - ((char) b1->data[i]);
. if (v != ) return v;
. if (b0->data[i] == (unsigned char) '\0') return BSTR_OK;
. }
.
. if (b0->slen > n) return ;
. if (b1->slen > n) return -;
. return BSTR_OK;
. }

valgrind 生成mysqld调用图之 select now()跟踪的更多相关文章

  1. valgrind 内存检测与调用图生成

    http://blog.csdn.net/destina/article/details/6198443  感谢作者的分享! 一  valgrind是什么? Valgrind是一套Linux下,开放源 ...

  2. C++源码的调用图生成

    前言 之前受知乎用户mailto1587启发,写了个C++源码的调用图生成器,可以以图示法显示C++函数的调用关系, 代码放在了github仓库里,仅供参考: CodeSnippet/python/S ...

  3. 从 Java 代码逆向工程生成 UML 类图和序列图

    from:http://blog.itpub.net/14780914/viewspace-588975/ 本文面向于那些软件架构师,设计师和开发人员,他们想使用 IBM® Rational® Sof ...

  4. 简单的使用gulp生成雪碧图

    有一个在线工具:https://www.toptal.com/developers/css/sprite-generator.生成雪碧图是极其方便的. 现在呢,我们来试试用gulp来生成雪碧图. 第一 ...

  5. JS生成gif动态图下载

    需求:通过动态变化的图生成一个gif图提供下载. 实现方案:1.可通过服务端生成对应gif,然后前端请求下载2.前端自己实现生成gif图片,自行下载 采用方案:前端实现方式,于是在网上找各种相关的几款 ...

  6. ROS库生成和调用

      参考资料: 生成.so文件:http://blog.csdn.net/u013243710/article/details/35795841 调用.so文件:http://blog.csdn.ne ...

  7. NSwag生成客户端调用代码

    NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码 https://www.cnblogs.com/hunanzp/p/9297361.html 前言 上一篇博客中我们 ...

  8. php 生成饼状图,折线图,条形图 通用类 2

    生成饼状图,折线图,条形图通用的php类,这里使用的是国外的 HighCharts,前台页面别忘了调用HighCahrt  js HighCharts中文网站  http://www.hcharts. ...

  9. php 生成饼状图,折线图,条形图 通用类

    生成饼状图,折线图,条形图通用的php类,这里使用的是百度 Echart. Echart 官方网站  http://echarts.baidu.com/ <?php class Echarts ...

随机推荐

  1. 【spring-boot】快速构建spring-boot微框架

    spring-boot是一个快速构建环境的一套框架,其设计理念是尽可能的减少xml的配置,用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义 ...

  2. 【转】 实现 Cocos2d-x 全局定时器

    转自:http://www.tairan.com/archives/3998 cocos2d-x 中有自己的定时器实现,一般用法是在场景,层等内部实现,定时器的生命周期随着它们的消亡而消亡,就运行周期 ...

  3. CSS中的块级元素与行级元素

    最近初学CSS时对块级元素与行级元素有时会产生混淆,写篇博客记录一下自己对其的理解. 先从概念上来看: 块级元素 特点:1.每个块级元素都是独自占一行,其后的元素也只能另起一行,并不能两个元素共用一行 ...

  4. 《深入Java虚拟机学习笔记》- 第3章 安全

    3.1为什么需要安全性 Java的安全模型是其多个重要结构特点之一,它使Java成为适于网络环境的技术.因为网络提供了一条攻击连人的计算机的潜在途径,因此安全性是非常重要的.Java安全模型侧重于保护 ...

  5. 转:maven项目添加jar包.

    很多新手都不知道如何在maven项目里添加jar包. 以前我还没接触maven的时候下载过一个demo,是maven项目. 我居然是照着他的pom.xml文件一个一个的写!!! 很多人认为理所当然的东 ...

  6. 用COM方式快速导出到Excel一例,批量导出

    开发中用到填充Excel时,一个一个的填充不免太慢,现有用数组方式填充一例,可以实现COM方式快速填充. C#,VBA中用法类似 适用场景:需要自动化操作Excel的方式下使用,比较除填充数据外还要自 ...

  7. 【OpenGL】画立方体

    编写一个程序,该程序运行时可以用鼠标的一个按键调整立方体的方向,用另一个按键平移立方体,用第三个按键缩放立方体. 这是题目,我的程序不一定完全按照这个来.初学OpenGL,对那一堆坐标系表示十分混乱, ...

  8. C语言不支持默认参数,不过可以用宏来模拟

    C语言不支持默认参数,不过可以用宏来模拟: //--------------------------------------------------------------------------- ...

  9. [转载]C++命名规则

    在软件开发这一高度抽象而且十分复杂的活动中,命名规则的重要性更显得尤为突出.一套定义良好并且完整的.在整个项目中统一使用的命名规范将大大提升源代码的可读性和软件的可维护性. 在引入细节之前,先说明一下 ...

  10. HDU-2262 Where is the canteen 概率DP,高斯消元

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2262 题意:LL在一个迷宫里面转,每次走向周围能走的点的概率都是一样的,现在LL要随机的走到cante ...