szhswl
          宋針還的個人空間
          DTrace即動態跟蹤Dynamic Tracing,是Solaris 10的一個新功能,透過此一新功能,用戶能夠動態檢測操作系統內核和用戶進程,以更精確地掌握系統的資源使用狀況,提高系統性能,減少支持成本,并進行有效的調節。1997年,供職于Sun而現已是Solaris內核開發部高級工程師的Bryan Cantrill 與他的工作組在緊張地研究一個性能問題,它出現在剛剛提及的Sun E10000服務器。該服務器在運行基準測試時,速度突然在一段時間內奇怪地降低。工作組經過六天夜以繼日的工作后,終于發現了問題的根本原因。某個“愚蠢之極”的配置錯誤將服務器配置成了路由器。

          “我很受震驚,”Cantrill 說到, “這是任何一個客戶都可能遇到的問題,但是他們可不敢奢望讓內核開發人員為之夜以繼日地工作,編寫自定義代碼以弄清楚問題。我們得找出一個更好的方法。” 
          經過兩年半的緊張開發,Cantrill和他的工作組終于研究出了這個更好的方法: Dtrace
          DTrace是過去十年中在操作系統方面最具意義的革新之一:
          Probe,Solaris中分散著30,000多的位置指針,也叫探測器probes,DTrace可激活成千上萬的探測器,記錄所關注的位置指定的數據,如命中,即可從該地址顯示用戶進程或系統內核的數據,從而了解系統,包括:
          1。任何函數的參數
          2。內核的任何全局變量
          3。函數調用的時間(NS,十億分之一秒,無任何其它PC/Unix在ns一級精度)
          4。跟蹤堆棧,包括指明函數調用的代碼
          5。函數調用時運行的進程
          6。產生函數調用的線程
          Probe于自定義D語言程序相關聯,probe表示的格式為:
          provider:module:function:name
          1。顯示當前動態系統中的動態Dtrace探針probe:
          # dtrace -l |more
             ID   PROVIDER            MODULE                          FUNCTION NAME
              1     dtrace                                                     BEGIN
              2     dtrace                                                     END
              3     dtrace                                                     ERROR
              4     vminfo          fasttrap                   fasttrap_uwrite softlock
              5     vminfo          fasttrap                    fasttrap_uread softlock
              6        fbt              pool                         pool_open entry
              7        fbt              pool                         pool_open return
              8        fbt              pool                        pool_close entry
              9        fbt              pool                        pool_close return
             10        fbt              pool                        pool_ioctl entry
             11        fbt              pool                        pool_ioctl return
             12        fbt              pool                         pool_info entry
             13        fbt              pool                         pool_info return
          。。。
          43545        fbt              zmod                        z_strerror return
          43546        fbt              zmod                      z_uncompress entry
          43547        fbt              zmod                      z_uncompress return
          即當前本人V210上有43547個probe。
          2。體驗 dtrace 與 Unix ps 命令:
          如用ps看mozilla進程:
          # ps -e |grep mozilla
            2386 pts/11      0:00 mozilla
            2436 pts/11     10:12 mozilla-
          也可使用dtrace 通過probe探針看:
          # dtrace -n 'syscall::exece:return { trace(execname);}'
          dtrace: description 'syscall::exece:return ' matched 1 probe
          CPU     ID                    FUNCTION:NAME
            0  11082                     exece:return   uname                            
            0  11082                     exece:return   uname                            
            0  11082                     exece:return   basename  
          。。。
            0  11082                     exece:return   sed                              
            0  11082                     exece:return   mozilla-bin                      
            1  11082                     exece:return   csh                              
            1  11082                     exece:return   mozilla      
          。。。
          2。實際dtrace看的更細,
          如用date顯示系統時間,很快就結束了,無法跟蹤,體驗dtrace跟蹤效果:
          % date
          2005年05月24日 星期二 20時39分03秒 CST
          # dtrace -n 'syscall::exece: {trace(timestamp)}'
          ddtrace: description 'syscall::exece: ' matched 2 probes
          CPU     ID                    FUNCTION:NAME
            0  11081                      exece:entry   102890531281542
            0  11082                     exece:return   102890532181875
          即可跟蹤其在第102890531281542納秒開始讀取,第102890532181875返回結果。
          3。體驗Dtrace 對系統調用更多的觀察:
          如看機器忙閑狀態,常用vmstat:
          # vmstat 1
           kthr      memory            page            disk          faults      cpu
           r b w   swap  free  re  mf pi po fr de sr s0 s3 s1 s1   in   sy   cs us sy id
           0 0 0 5523680 1378352 14 48 84 1  0  0  1  0  1  0  0  341 2058  883  3  1 96
           0 0 0 5368296 1218688 0 23 15  0  0  0  0  0  0  0  0  336 2605  722 10  1 89
           
          得知產生2605多系統調用,但無和簡單查找哪個進程的問題呢,試用dtrace看:
          # dtrace -n 'syscall::read:entry {@NUM[execname] = count();}'
          ddtrace: description 'syscall::read:entry ' matched 1 probe
          ^C
            dtfile                                                            5
            sdtperfmeter                                                     12
            soffice.bin                                                      23
            dic                                                              23
            dtterm                                                           53
            mozilla-bin                                                     394
            Xsun                                                            545
          顯然發現CDE和Mozilla是產生大量系統調用的程序,看I/O分布也可:
          如還是Mozilla:
          # dtrace -n 'syscall::write:entry {@NUM[execname] = quantize(arg2);}'
          ... 
            mozilla-bin                                       
                     value  ------------- Distribution ------------- count    
                         0 |                                         0        
                         1 |@@@@@@@@@@@@@@@@@@@@@                    470      
                         2 |                                         0        
                         4 |                                         7        
                         8 |                                         0        
                        16 |                                         0        
                        32 |                                         0        
                        64 |                                         0        
                       128 |                                         10       
                       256 |@@@@@@@@                                 184      
                       512 |@@@@@@                                   146      
                      1024 |@@@                                      78       
                      2048 |                                         8        
                      4096 |                                         1        
                      8192 |                                         0    
          ...
          可觀察到大量Mozilla產生的I/O在256-512字節間。
          4。 想再仔細看程序內部情況?
          truss不錯:
          # truss /usr/sfw/bin/mozilla
          execve("/usr/bin/ksh", 0xFFBFF564, 0xFFBFF574)  argc = 3
          resolvepath("/usr/bin/ksh", "/usr/bin/ksh", 1023) = 12
          resolvepath("/usr/lib/ld.so.1", "/lib/ld.so.1", 1023) = 12
          stat("/usr/bin/ksh", 0xFFBFF340)                = 0
          open("/var/ld/ld.config", O_RDONLY)             Err#2 ENOENT
          stat("/lib/libc.so.1", 0xFFBFEE70)              = 0
          resolvepath("/lib/libc.so.1", "/lib/libc.so.1", 1023) = 14
          open("/lib/libc.so.1", O_RDONLY)                = 3
          mmap(0x00010000, 8192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_ALIGN, 3, 。。。
          試下dtrace:
          # dtrace -n 'syscall::read:return /execname =="mozilla" /{ ustack();}'
          dtrace: description 'syscall::read:return ' matched 1 probe
          CPU     ID                    FUNCTION:NAME
            0  10984                      read:return 
                        libc.so.1`_read+0x8
                        ksh`io_readbuff+0x264
                        ksh`0x245e4
                        ksh`io_readc+0x2c
                        ksh`0x29c54
                        ksh`main+0xa30
                        ksh`_start+0x108
            0  10984                      read:return 
                        libc.so.1`_read+0x8
                        ksh`io_readbuff+0x264
                        ksh`0x245e4
                        ksh`io_readc+0x2c
                        ksh`0x28938
                        ksh`0x28654
          ...
          看到n多調用,開始和返回,夠開發人員分析的。 
                  總結,Dtrace功能強大,精度高,輕量,truss有時降低系統30%CPU利用率。但復雜,需對系統內核和應用熟悉,否則看不懂跟蹤到的數據,估計以后CU該開Dtrace編程板塊了。


          ---------------------------------------------------------------------------------------------------------------------------------
          說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
          http://www.aygfsteel.com/szhswl
          ------------------------------------------------------------------------------------------------------ ----------------- ---------
          posted on 2007-12-06 19:55 宋針還 閱讀(273) 評論(0)  編輯  收藏 所屬分類: 操作系統
          主站蜘蛛池模板: 陈巴尔虎旗| 呼和浩特市| 开远市| 镇江市| 江油市| 泰来县| 安仁县| 荔浦县| 宝丰县| 盐亭县| 江北区| 罗江县| 岳西县| 五河县| 新河县| 都江堰市| 九龙坡区| 阳泉市| 茶陵县| 娱乐| 平度市| 大庆市| 江北区| 阿鲁科尔沁旗| 鄱阳县| 出国| 朝阳县| 远安县| 广安市| 融水| 黔西县| 革吉县| 余姚市| 呼玛县| 新乐市| 苗栗县| 长阳| 娄底市| 古田县| 繁昌县| 黔东|