如何衡量互斥争用?

Luí*_*ira 23 c linux pthreads dtrace

我有一些在Linux上使用PThreads的线程代码,我怀疑它正遭受过多的锁争用.有哪些工具可供我测量?

Solaris有DTrace和plockstat.Linux上有类似的东西吗?(我知道Linux最近的DTrace端口,但它似乎还没有为黄金时间做好准备.)

小智 14

mutrace是工具: http://0pointer.de/blog/projects/mutrace.html

它易于构建,安装和使用.


Luí*_*ira 5

在没有太多运气之后,我决定尝试使用DTrace Linux端口取得一些成功,尽管缺少plockstat提供程序.以下DTrace脚本不是plockstat的替代品,但它设法向我展示了我之后的一些信息.

#!/usr/sbin/dtrace -s 

/* Usage: ./futex.d '"execname"' */

long total;

END
{
    printf("total time spent on futex(): %ldms\n", total);
}

/* arg1 == 0 means FUTEX_WAIT */
syscall::futex:entry
/execname == $1 && arg1 == 0/
{
    self->start = timestamp;
}

syscall::futex:return
/self->start/
{
    this->elapsed = (timestamp - self->start) / 1000000;
    @[execname] = quantize(this->elapsed);
    total += this->elapsed;
    self->start = 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是使用上述DTrace脚本测量此DTrace文章中的简单测试程序在FUTEX_WAIT中花费的时间的示例.

$ ./futex.d '"mutex-test"'
dtrace: script './futex.d' matched 3 probes
^C
CPU     ID                    FUNCTION:NAME
  1      2                             :END total time spent on futex(): 11200ms


  mutex-test                                        
           value  ------------- Distribution ------------- count    
             128 |                                         0        
             256 |@@@@@@@@@@@@@@@@@@@@                     1        
             512 |                                         0        
            1024 |                                         0        
            2048 |                                         0        
            4096 |                                         0        
            8192 |@@@@@@@@@@@@@@@@@@@@                     1        
           16384 |                                         0        
Run Code Online (Sandbox Code Playgroud)

绝对不是很好,但至少它是一个起点.


ire*_*ses 1

在没有 DTrace 的情况下,最好的选择可能是SystemTap。这是一篇积极的文章。

http://davidcarterca.wordpress.com/2009/05/27/systemtap/

  • 他在评论中表示,他并没有尝试解析符号。 (2认同)