2012-07-30 30 views
2

我試圖用mutrace來測量我的程序中的互斥量,但我堅持如何使用它輸出的報表。測量互斥量爭用/解釋mutrace輸出

mutrace: Showing statistics for process test (PID: 5924). 
mutrace: 1223 mutexes used. 

Mutex #362 (0x0x1a23750) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2) [0x7fb6b14129b4] 
     ./test() [0x500042] 

Mutex #390 (0x0x1a23ac0) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2) [0x7fb6b14129b4] 
     ./test() [0x500042] 

Mutex #965 (0x0x1a3a600) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2) [0x7fb6b14129b4] 
     ./test() [0x500042] 

Mutex #502 (0x0x1abbc90) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2) [0x7fb6b14129b4] 
     ./test() [0x500042] 

Mutex #241 (0x0x7fb6af9019c0) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_lock+0x116) [0x7fb6b1412da6] 
     /lib/libgcc_s.so.1(_Unwind_Find_FDE+0x2a) [0x7fb6af6fe3ea] 
     [(nil)] 

Mutex #704 (0x0x7fb6afe85020) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_lock+0x116) [0x7fb6b1412da6] 
     /usr/lib/libstdc++.so.6(_ZNSt6localeC1Ev+0x2f) [0x7fb6afbf021f] 

Mutex #452 (0x0x1a240b0) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2) [0x7fb6b14129b4] 
     ./test() [0x500042] 

Mutex #981 (0x0x1a3a770) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2) [0x7fb6b14129b4] 
     ./test() [0x500042] 

Mutex #626 (0x0x73daa8) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2) [0x7fb6b14129b4] 
     ./test(_ZN7threads5mutexC2Eb+0x5e) [0x50675e] 

Mutex #801 (0x0x1ab6798) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_mutex_init+0x1b2) [0x7fb6b14129b4] 
     ./test(_ZN7threads5mutexC1Eb+0x5e) [0x50643e] 

mutrace: Showing 10 mutexes in order of (write) contention count: 

Mutex # Locked Changed Cont. cont.Time[ms] tot.Time[ms] avg.Time[ms] Flags 
    362 517216 163871 70638  619.184  138.933  0.000 M-.--. 
    390 180589 61197 31681  5926.827  463.255  0.003 M-.--. 
    965 38679 24052 10646  661.639  718.836  0.019 M-.--. 
    502 35394 19012  1540  153.286  134.116  0.004 M-.--. 
    241  3481  2715  1378  135.624  1.189  0.000 M-.--. 
    704 20902  3879  70   0.594  6.702  0.000 M-.--. 
    452  892  158  49  21.401  125.918  0.141 M-.--. 
    981  2369  2361  12   0.229  12.984  0.005 M-.--. 
    626  598  270  4   0.139  8.417  0.014 Mx.r-. 
    801  125  2  1   0.012  0.270  0.002 Mx.r-. 
    ...  ...  ...  ...   ...   ...   ... |||||| 
                      /||||| 
      Object:          M = Mutex, W = RWLock /|||| 
      State:         x = dead, ! = inconsistent /||| 
      Use:         R = used in realtime thread /|| 
     Mutex Type:     r = RECURSIVE, e = ERRORCHECK, a = ADAPTIVE /| 
    Mutex Protocol:          i = INHERIT, p = PROTECT/
    RWLock Kind: r = PREFER_READER, w = PREFER_WRITER, W = PREFER_WRITER_NONREC 

mutrace: Note that rwlocks are shown as two lines: write locks then read locks. 

mutrace: Note that the flags column R is only valid in --track-rt mode! 

mutrace: 275 condition variables used. 

Condvar #235 (0x0x7fb6a039d5c8) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #153 (0x0x7fb6a8259978) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #42 (0x0x7fb6a03e8188) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #222 (0x0x7fb6a019b7c8) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #118 (0x0x7fb6a0223ca8) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #8 (0x0x7fb6a820d748) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #171 (0x0x7fb69c04d9d8) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #0 (0x0x7fb69c22a2e8) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #75 (0x0x7fb6a81a65f8) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

Condvar #142 (0x0x7fb6a001c308) first referenced by: 
     /usr/local/lib/libmutrace.so(pthread_cond_init+0x120) [0x7fb6b14134be] 
     ./test(_ZN7threads4condC1Ev+0x17) [0x5051b7] 

mutrace: Showing 10 condition variables in order of wait contention count: 

    Cond # Waits Signals Cont. tot.Time[ms] cont.Time[ms] avg.Time[ms] Flags 
    235  271  0  0  1370.469   0.000  0.000  x. 
    153  190  0  0  960.142   0.000  0.000  x. 
     42  65  0  0  328.264   0.000  0.000  x. 
    222  52  0  0  262.584   0.000  0.000  x. 
    118  51  0  0  261.869   0.000  0.000  x. 
     8  48  0  0  242.422   0.000  0.000  x. 
    171  41  0  0  207.044   0.000  0.000  x. 
     0  38  0  0  191.881   0.000  0.000  x. 
     75  37  0  0  186.835   0.000  0.000  x. 
    142  35  0  0  176.704   0.000  0.000  x. 
    ...  ...  ...  ...   ...   ...   ...  || 
                       /| 
      State:          x = dead, ! = inconsistent/
      Use:          R = used in realtime thread 

mutrace: Note that the flags column R is only valid in --track-rt mode! 

mutrace: Total runtime is 3701.228 ms. 

mutrace: Results for SMP with 8 processors. 

看來我絕對有一個互斥的爭用問題,但我不知道如何將這個關聯到我的源代碼。我希望有更好的回溯痕跡。

可執行文件已根據mutrace的網站(和-g -gdb)與-rdynamic一起編譯。

我在stackoverflow上發現了mutrace,所以希望有一些有經驗的人!

謝謝。

+1

短版本:瀏覽輸出中出現的每個互斥鎖。仔細考慮互斥體的作用以及您可以合理預期的爭用程度。對於任何顯示比您合理預期的爭用更多的互斥鎖,請確定該爭用是否有意義,如果是這樣,請分析該互斥鎖的使用情況,以查看是否有簡單的方法來最小化爭用。 – 2012-07-30 09:55:54

+1

是的,但是使用這種有限的回溯,我該如何確定哪個互斥量是哪個?顯然它使用的是地址,但這不是我以前必須做的事情。我該如何解決它? – goji 2012-07-30 21:39:21

+0

我不確定你爲什麼會收到如此有限的回溯。最糟糕的情況是,您可以添加代碼來記錄互斥鎖的地址。 – 2012-07-30 22:23:13

回答

2

我在我的realease構建中留下了調試標誌,所以-g -gdb -rdynamic都已啓用。我想這會沒事的。切換回我的調試版本後,刪除-O2使得回溯更有用。仍然破損,但好得多。

我發現所有具有最高爭用的互斥量都用於gnutls使用的gcrypt庫中的同步。可能要試驗一下,看看是否回到openssl改進它,或者cyassl!

謝謝。

4

決不mutrace工作,但地址符號轉換功能也可以用: addr2line

如:

addr2line -e sysopview 0x5051b7 

在這個例子中「sysopview」爲路徑,以二進制中地址應該被定位,並且0x5051b7是示例地址。 Addr2line將會發出它認爲應該映射到的名稱。與回溯一起工作。

輸出示例:

folkert @美女:〜/項目/ entropybroker /主幹$ addr2line -e ./entropy_broker 0x0000000000406968 /home/folkert/Projects/entropybroker/trunk/handle_client.cpp:761

在這個例子中的地址0x406968映射到文件handle_client.cpp線761

在Debian這個程序可以在「binutils的」包中找到。