免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5915 | 回复: 13
打印 上一主题 下一主题

[CPU及多核] 求助, 能不能获得futex在用户态的调用路径?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-23 15:59 |只看该作者 |倒序浏览
我们的多线程应用程序发现锁竞争很厉害, 通过strace 和 systemtap的futexer脚本
定位到 比如 这个 0x407d9860
=============================
futex(0x407d9860, FUTEX_WAIT, 2, NULL)
=============================

问题是 能通过Gdb 或者其他方式 得到 futex 的call trace 么
这样 就能知道 用户态的 调用路径, 修改起来就有的放矢了

再引申一下, strace得到了一大堆系统调用,能得到每个系统调用 在用户态的调用路径么?

论坛徽章:
0
2 [报告]
发表于 2013-02-23 22:01 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2013-02-24 15:52 |只看该作者
多谢,condition的时候也可能,光mutex 太多了

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2013-02-26 19:00 |只看该作者
回复 1# lovegq
我们的多线程应用程序发现锁竞争很厉害

这个貌似可以通过应用层的设计上实现吧。
找到用锁的地方,看看是否可以降低锁的范围。比如全局锁修改为hash锁等。
   

论坛徽章:
0
5 [报告]
发表于 2013-02-27 21:53 |只看该作者
推荐oprofile 采样,应该可以回溯到用户态栈

论坛徽章:
0
6 [报告]
发表于 2013-02-27 21:57 |只看该作者
根据0x407d9860 找到你pthread_mutex_lock的是哪把锁  自己写的代码应该知道这把锁的竞争流程吧

论坛徽章:
0
7 [报告]
发表于 2013-02-28 21:05 |只看该作者
回复 6# chenyu105


    我用 gdb 挂上进程后, 用以下方式设置的断点

    b pthread_mutex_lock if mutex= 0x407d9860  

    但是效果很不好,不知道阁下有什么高招没? help

论坛徽章:
0
8 [报告]
发表于 2013-02-28 22:06 |只看该作者

可以改用户态代码的话,在申请mutex锁的时候,把地址记录一下,
在故障复现时比较0x407d9860是谁的。

看到你说用systemtap,可以在futex_wait或者futex_wait_pi(看你的mutex是否有优先级继承)入口那里,插个C函数,做个统计。

原理就是,根据task_pt_regs找到进程进内核态的regs现场,
根据这个regs现场,来手工回溯用户态堆栈(各个CPU架构回溯方法不一样)
把这个回溯出来的堆栈数组,做个排序,得到被futex阻塞最多的前几个用户调用栈。
实际上有点类似oprofile的原理了。可能太麻烦了,得调。。。我也没试过,祝你好运。。

论坛徽章:
0
9 [报告]
发表于 2013-02-28 22:23 |只看该作者
回复 8# chenyu105


    我用 systemtap trace 了所有 sys_futex , 在调用处 过滤了 特定的锁, 比如 0x407d9860
    这一步是没有问题的,
    probe syscall.futex {
        blablablabla ....
        printf_ubacktrace()
    }

    但是在打印函数堆栈时出了问题, 堆栈打印不全,可能是我的rhel5u2系统太老,
    恩,不是不全,最多就只能打1,2行,全是,比如
    _L_lock_1966 ,  _L_lock_107之类

    我试了很多方法,比如 在
    probe syscall.futex.return 里面 直接给我的进程 发一个 stop信号 ,
   
    system("kill -19 %d", pid())

    然后 用 pstack 打印 此时的函数堆栈

    即使这样效果也不是很好, 函数堆栈根本和锁 对不上,很郁闷
   

论坛徽章:
0
10 [报告]
发表于 2013-02-28 22:59 |只看该作者
printf_ubacktrace()这个是systemtap自带的打印用户堆栈? 我觉得systemtap的回溯不是太靠谱。。

probe syscall.futex.return  这里futex退出时,给进程发sigkill信号,
但是在函数返回用户态,还没来得及回以前的用户态context ,就会先进入sigkill信号处理函数,
所以你回溯的应该是信号处理函数的堆栈?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP