mdb写経/カーネルメモリーアロケータ

2013/08/16

dcmds

thread ::allocdby
指定されたカーネルスレッドのアドレスを使用して、そのスレッドが割り当てたメモリーのリストを新しい順に出力します。
> fffffffffbc36de0::allocdby
> fffffffffbc36de0::allocdby
BUFCTL              TIMESTAMP CALLER
ffffff00cb845af8 b8483496d47c callb_add_common+0x81
ffffff00cb9f6cb8 b8483496b2e1 lgrp_affinity_init+0x26
ffffff00cbabd588 b8483496ac9f audit_thread_create+0x1e
ffffff00cbace658 b84834966817 segkp_get_internal+0x89
ffffff00cb5d7308 b8483496649e thread_create+0x4f
ffffff00cb9f6be0 b84834961b3c lgrp_affinity_init+0x26
ffffff00cbabd4b0 b84834961204 audit_thread_create+0x1e
ffffff00cbace580 b8483495d379 segkp_get_internal+0x89
ffffff00cb9fa468 b84834945c0d vmem_alloc+0x1d2
ffffff00cb5d7158 b848349455b0 thread_create+0x4f
ffffff00cbac8040 b8483493f28b lwp_create+0x78e
ffffff00cb5d42f0 b8483493ef34 lwp_create+0x709
    :
    :
 

bufctl ::bufctl [- a address] [-c caller ] [-e earliest] [- l latest] [-t thread ]
指定された bufctl 構造体についての要約を出力します。1 つまたは複数のオプションが指定されている場合は、オプション引数によって定義される条件に一致する bufctl 構造体の情報だけが出力されます。したがって、この dcmd をパイプラインの入力のフィルタとして使用できます。
-a buctl の対応するバッファーアドレスが指定されたアドレスと等しくなるように指定します
-c 指定された呼び出し元のプログラムカウント値が bufctl の保存されているスタックトレースの中に存在するように指定しま。
-e bufctl の時刻表示が、指定されたもっとも早い時刻表示と同じかそれよりも遅い時刻になるように指定します
-l bufctl の時刻表示が、指定されたもっとも遅い時刻表示と同じかそれよりも早い時刻になるように指定します
-t bufctl のスレッドポインタが、指定されたスレッドアドレスと等しくなるように指定します
> ffffff00cb845af8::bufctl -v
> ffffff00cb845af8::bufctl -v
            ADDR          BUFADDR        TIMESTAMP           THREAD
                            CACHE          LASTLOG         CONTENTS
ffffff00cb845af8 ffffff00cb6543c8     b8483496d47c fffffffffbc36de0
                 ffffff00c502a008 ffffff00c5c61200 ffffff00c6d99740
                 kmem_cache_alloc_debug+0x2b1
                 kmem_cache_alloc+0x14c
                 kmem_zalloc+0x66
                 callb_add_common+0x81
                 callb_add+0x48
                 sched+0x5a
                 main+0x513
                 _locore_start+0x90
 

[ address ] ::findleaks [-v]
フルセットの kmem デバッギング機能が有効になっている場合に、カーネルクラッシュダンプ時に効率的にメモリーリークを検出します。::findleaks の最初の実行では、ダンプを処理してメモリーリークを探します。この処理には数分かかる場合があります。次に、割り当てスタックトレース別にリークがまとめられます。findleaks レポートには、識別されたメモリーリークごとに bufctl アドレスと先頭のスタックフレームが表示されます。
-v オプションが指定されている場合には、この dcmd は実行の際により詳細なメッセージを出力します。dcmd の前に明示的にアドレスが指定されている場合には、レポートがフィルタリングされ、割り当てスタックトレースに指定された関数アドレスが含まれているリークだけが表示されます。

thread ::freedby
指定されたカーネルスレッドのアドレスを使用して、そのスレッドが解放したメモリーのリストを新しい順に出力します。

value ::kgrep
カーネルアドレス空間の中で、指定されたポインタサイズ値を含んでいるポインタ整列アドレスを検索します。次に、一致する値を含んでいるアドレスのリストを出力します。MDB の組み込み検索演算子とは異なり、::kgrep はカーネルアドレス空間のすべてのセグメントを検索し、不連続セグメント境界にまたがって検索します。大きなカーネルでは、::kgrep は実行にかなりの時間がかかる場合があります。

::kmalog [ slab | fail ]
カーネルメモリーアロケータトランザクションログ内のイベントを表示します。イベントは新しい順に (つまり、最新のイベントから) 表示されます。::kmalog は、イベントごとに、「T-」表示による最新のイベントを基準にした相対時間 (たとえば、T-0.000151879)、bufctl、バッファーアドレス、kmem キャッシュ名、およびイベント発生時刻におけるスタックトレースを表示します。引数を指定しないと、::kmalog は kmem トランザクションログを表示しますが、このログは kmem_flags で KMF_AUDIT が設定されている場合にだけ存在します。::kmalog fail は、割り当て障害ログを表示します。このログは必ず存在します。これは、割り当て障害に正しく対処できないドライバのデバッグを行う場合に役立ちます。::kmalog slab は、スラブ作成ログを表示します。このログは必ず存在します。::kmalog slab は、メモリーリークの検索を行う場合に役立ちます。
> ::kmalog
> ::kmalog
 
T-0.000000000  addr=ffffff00dc6edd80  anon_cache
         kmem_cache_alloc_debug+0x2b1
         kmem_cache_alloc+0x14c
         anon_alloc+0x2d
         anon_zero+0x3c
         segvn_faultpage+0x2a6
         segvn_fault+0xb78
         as_fault+0x3e7
         pagefault+0x99
         trap+0x13d8
         0xfffffffffb8001d6
         0xfffffffffb85b60a
         uiomove+0xeb
         mmio+0x148
         mmrw+0x1bb
         mmread+0x22
 
    :
    :
 

::kmastat
カーネルメモリーアロケータキャッシュおよび仮想メモリー領域のリストと該当する統計を表示します。
> ::kmastat
> ::kmastat
cache                        buf    buf    buf    memory     alloc alloc
name                        size in use  total    in use   succeed  fail
------------------------- ------ ------ ------ ---------- --------- -----
kmem_magazine_1               16   1364   1506      24576B      1364     0
kmem_magazine_3               32   1228   1250      40960B      1228     0
kmem_magazine_7               64   1082   1116      73728B      1082     0
kmem_magazine_15             128   9412   9424    1245184B      9569     0
kmem_magazine_31             256      0    150      40960B       142     0
kmem_magazine_47             384    103    110      45056B       103     0
kmem_magazine_63             512      0      0          0B         0     0
kmem_magazine_95             768      0      0          0B         0     0
kmem_magazine_143           1152      0      0          0B         0     0
kmem_slab_cache               72  11744  11770     876544B     11744     0
kmem_bufctl_cache             24  46691  46760    1146880B     46691     0
kmem_bufctl_audit_cache      192      0      0          0B         0     0
    :
    :
 

::kmausers [- ef] [cache ...]
カーネルメモリーアロケータの現在のメモリーの割り当てが中程度あるいは多いユーザーに関する情報を出力するこの出力は、一意的なスタックトレースごとに 1 つのエントリで構成され、そのスタックトレースを使用して作成された合計メモリー量と割り当ての数が示されます。この dcmd を使用するには、kmem_flags で KMF_AUDIT フラグが設定されている必要があります。
1 つまたは複数のキャッシュ名 (たとえば、kmem_alloc_256) が指定されている場合、メモリー使用率の走査はそれらのキャッシュでだけ行われます。デフォルトでは、すべてのキャッシュが含まれます。-e オプションを指定すると、割り当て量の少ないユーザーが含まれます。割り当ての少ないユーザーとは、同じスタックトレースの合計メモリーが 1024 バイト未満または割り当て数 10 未満であるような割り当てのことです。-f オプションを指定すると、個々の割り当てのスタックトレースが出力されます。
> ::kmausers
> ::kmausers
197001216 bytes for 1503 allocations with data size 131072:
         kmem_slab_alloc_impl+0xbe
         kmem_slab_alloc+0xb0
         kmem_cache_alloc+0x267
         vmem_alloc+0x1d2
         segkmem_xalloc+0x94
         segkmem_alloc_vn+0xcb
         segkmem_zio_alloc+0x24
         vmem_xalloc+0x53e
         vmem_alloc+0x172
         kmem_slab_create+0x81
         kmem_slab_alloc+0x60
         kmem_cache_alloc+0x267
         zio_data_buf_alloc+0x29
         arc_get_data_block+0x153
         arc_read+0x2af
    :
    :
 

[ address ] ::kmem_cache [-n name]
指定されたアドレスに格納されている kmem_cache_t 構造体、またはアクティブ kmem_cache 構造体の完全なセットをフォーマットし、表示します。
> ::kmem_cache
> ::kmem_cache
ADDR             NAME                      FLAG  CFLAG  BUFSIZE  BUFTOTL
ffffff00c5021008 kmem_magazine_1           0000 080000       16     1506
ffffff00c5021348 kmem_magazine_3           0000 080000       32     1375
ffffff00c5021688 kmem_magazine_7           0000 080000       64     3658
ffffff00c50219c8 kmem_magazine_15          0000 080000      128     9424
ffffff00c5022008 kmem_magazine_31          0000 080000      256      150
ffffff00c5023348 kmem_slab_cache           0000 080000       72    13530
ffffff00c5023688 kmem_bufctl_cache         0000 080000       24    56947
ffffff00c50239c8 kmem_bufctl_audit_cache   0000 080000      192        0
ffffff00c5024008 kmem_va_4096              0200 110000     4096    13792
ffffff00c5024348 kmem_va_8192              0200 110000     8192      352
ffffff00c5024688 kmem_va_12288             0200 110000    12288       60
ffffff00c50249c8 kmem_va_16384             0200 110000    16384     3136
ffffff00c5026008 kmem_va_20480             0200 110000    20480       24
ffffff00c5027008 kmem_alloc_8              0000 200000        8    17102
ffffff00c5027348 kmem_alloc_16             0000 200000       16    13052
ffffff00c5027688 kmem_alloc_24             0000 200000       24    17869
ffffff00c50279c8 kmem_alloc_32             0000 200000       32    22500
ffffff00c5028008 kmem_alloc_40             0000 200000       40     3600
ffffff00c5028348 kmem_alloc_48             0000 200000       48    26228
ffffff00c5028688 kmem_alloc_56             0000 200000       56     9017
ffffff00c50289c8 kmem_alloc_64             0000 200000       64     9982
    :
    :
 

[ address ] ::kmem_dump [-l]
クラッシュダンプが処理されている間に記録された kmem の利用を確認してください。
カーネルは、ダンプに使用する小さい代替ヒープを有します。このダンプ・ヒープオーバーフローは、通常の管理された kmem ヒープが代わりに使用されなければならない。この場合、メモリがダンプされている間に、kmem キャッシュの状態が変化し、一貫性のない状態になります。::findleaks と、::kmem_verify は、このような破損したバッファ、または行方不明のスラブのエントリーなど、様々なエラーを報告することがあります。::kmem_dump がオーバーフローを示していたり、問題になっているキャッシュが安全でない割り当てをしている場合、エラーメッセージは信頼することはできません。
オプションを指定しない場合、コマンドはダンプ・ヒープ使用量の要約を出力します。-l が指定されている場合、ダンプ中にアクセスされたすべての kmem キャッシュのリストを表示します。アドレスが提供されている場合は、addrで表される kmem_cache_t 構造体の活動をダンプを表示します。
HEADINGS
overflows ダンプヒープ後にオーバーフローしたalloc命令の回数
size ダンプヒープのサイズ(bytes)
hi-water 必要とされたダンプヒープの最大値
oversize 通常のallocより大きい
used 使用されたダンプエリアのサイズ, 内部断片化が含まれています
% used 使用されたダンプエリア: 0-100%
Cache headings:
Addr kmem_cache_t 構造体のアドレス
Flg U ダンプ時の使用で、常に安全でない場合
O オーバーフロー alloc が発生した場合
Alloc ダンプアロケーションの回数
Free ダンプ開放の回数
Overflow ダンプヒープのオーバーフローの回数
Nondump 非ダンプヒープの数
> ::kmem_dump -l
> ::kmem_dump -l
overflows            0
size                 0x20000
used                 0x4668
% used               13
hi-water             0x4668
Cache Name                            Addr Flg   Alloc    Free Ovrflow Nondump
kmem_alloc_768            ffffc1000002b2c8         377     377       0       0
kmem_alloc_1152           ffffc1000002b848          30      30       0       0
kmem_alloc_2048           ffffc1000002c2c8          44      44       0       0
kmem_alloc_2688           ffffc1000002c588          53      53       0       0
kmem_alloc_4096           ffffc1000002c848         148     148       0       0
streams_mblk              ffffc10000035b08           4       0       0       0
streams_dblk_64           ffffc10000036008           2       0       0       1
streams_dblk_256          ffffc10000036848           2       0       0       1
rootnex_dmahdl            ffffc10000568848         377     377       0       0
 
::kmem_log
kmem トランザクションログの完全なセットを新しい順にソートして表示します。この dcmd は、::kmalog より簡単な表形式で出力します。
> ::kmem_log
> ::kmem_log
CPU ADDR             BUFADDR                 TIMESTAMP THREAD
    ffffff00c61481c0 ffffff00ca0a6f60    13035b1c42df7 ffffff00020a1c20
    ffffff00c6148100 ffffff00cac82e00    13035b1c42ccf ffffff00020a1c20
    ffffff00c6148040 ffffff00d6411cc0    13035b1c4217d ffffff00020a1c20
    ffffff00c6147f80 ffffff00c77aac40    13035b1c41f74 ffffff00020a1c20
    ffffff00c6147ec0 ffffff00c77a9300    13035b1c41925 ffffff00020a1c20
    ffffff00c6147e00 ffffff00cca7f7c0    13035b1c4162e ffffff00020a1c20
    :
    :
  3 ffffff00c6257cc0 ffffff00c77a9300    13035b1b75549 ffffff00dae9c080
  3 ffffff00c6257c00 ffffff00c77a9300    13035b1b6bef7 ffffff00dae9c080
  3 ffffff00c6257b40 ffffff00cb98d300    13035b1b6bacd ffffff00dae9c080
  0 ffffff00c6147bc0 ffffff00ca0a6f60    13035b1b66d1c ffffff0002272c20
  0 ffffff00c6147b00 ffffff00cac82e00    13035b1b66ab5 ffffff0002272c20
  0 ffffff00c6147a40 ffffff00d19f1380    13035b1b665b2 ffffff0002272c20
  0 ffffff00c6147980 ffffff00d6412f00    13035b1b660bd ffffff0002272c20
  1 ffffff00c598e8c0 ffffff00c8d72700    13035b1b62f29 ffffff00cd59d0e0
  1 ffffff00c598e800 ffffff00cb995a00    13035b1b62caa ffffff00cd59d0e0
  1 ffffff00c598e740 ffffff00c8d72e80    13035b1b4e6ef ffffff00cd59d0e0
    :
    :
 

[ address ] ::kmem_slabs [-v] [-n cache] [-N cache] [-b maxbins] [-B minbinsize]
kmem cache ごとの slab の使用状況を表示する。
-n name 指定した名前の kmem_cache 構造体の情報を表示します(名前の一部が一致したものを含む)
-N name 正確に名前が一致した kmem_cache 構造体の情報を表示します
-b maxbins アロケートされていないメモリは "bin" と呼ばれる同じサイズの chunk のグループに分けて管理されます。このオプションでは、スラブごとに割り当てられたバッファの分布を maxbins に分割して表示します。最初の bin は完全に割り当てられたスラブ用に予約されています。 maxbins に 0 を設定 (-b 0) すると、スラブごとの最大割り当てられたバッファを指定するか、minbinsize に 1 を設定する (-B 1) のと同じ効果があります
-B minbinsize 全ての bin を、少なくとも minbinsize バッファで分割して(完全に割り当てられたスラブの予約をまず除く)、スラブごとの割り当てられたバッファの分布を表示します
-v 詳細出力:使用法によって順序付けられているスラブがどの程度を示すために、前から後に順に空きリスト上の各部分スラブの割り当てられたバッファ数を一覧表示します
例:
10 complete, 3 partial (8): 7 3 1

それぞれ 8 つのバッファを持つ 13 のスラブが存在することを意味します。8 つの割り当てられたすべてのバッファよりも少ない、3つの部分的に割り当てられたスラブを含みます。
バッファ割り当ては、常に部分スラブリストの先頭から行われます。完全に使用されたスラブからバッファが解放されると、そのスラブは、部分スラブなリストの先頭に追加されます。すべてのバッファは等しくすぐに解放される可能性があると仮定すると、部分的なスラブが要求される順序は、最も使用されるものがリストの先頭に、最も使用されないものが末尾にあります(上記の例のように)。
しかしながら、すぐに解放されない割り当てられたバッファがスラブに含まれている場合は、そのすべての割り当て可能なバッファの前方にあるほうが良いでしょう。部分的なスラブリストからスラブを取得すると、キャッシュの断片化が減少します(すべてのバッファが解放されたか、すべてのバッファが割り当てられたかのいずれか)。
部分的なスラブを表す、スラブの割り当てられたバッファ数がマークされることがあります(下の例では 9)。
9* のアスタリスクは、kmem のクライアントが、スラブのバッファの移動を拒否したため、kmem が、スラブを非再生可能としてマークしていたことを示しています。なので、kmem はスラブを完全に解放することを期待していないので、代わりにそれを完全に割り当てることを希望して、リストの先頭に移動します。アスタリスクでマークされたスラブは、それが部分的なスラブ・リストに残っている限り、マークされたままになります。
Column Description
Cache Name kmem キャッシュの名前
Slabs スラブの数
Partial Slabs フリーリストの部分的に確保されたスラブの数
Buffers バッファ数 (Slabs * (buffers per slab))
Unused Buffers 部分スラブの確保されていないバッファーの数
Waste (Unused Buffers / Buffers) アカウンティング構造(デバッグモード)、スラブカラーリング(バッファの配置をずらすための小さなオフセットの増分)、または CPU ごとのマガジン層のためのスペースは含まれません
> ::kmem_slabs
> ::kmem_slabs
                                    Partial              Unused
Cache Name                   Slabs    Slabs   Buffers   Buffers  Waste
------------------------- -------- -------- --------- --------- ------
kmem_magazine_1                 20        1      2000        93   4.7%
kmem_magazine_3                133        1      8246        56   0.7%
kmem_magazine_7                 60        1      2460        14   0.6%
kmem_magazine_15                21        1       420        11   2.6%
kmem_magazine_31                31        1       372         2   0.5%
kmem_magazine_47                20        1       160         7   4.4%
kmem_magazine_63                 0        0         0         0   0.0%
kmem_magazine_95                 0        0         0         0   0.0%
kmem_magazine_143                0        0         0         0   0.0%
kmem_slab_cache                564        1     23124        37   0.2%
kmem_bufctl_cache              248        1     20584        80   0.4%
kmem_bufctl_audit_cache      18971        1    341478         3   0.0%
kmem_va_4096                   423        1     13536        14   0.1%
kmem_va_8192                    25        1       400         9   2.3%
kmem_va_12288                   22        1       220         8   3.6%
kmem_va_16384                  396        1      3168         2   0.1%
kmem_va_20480                    3        1        18         5  27.8%
kmem_va_24576                    1        1         5         2  40.0%
kmem_va_28672                   19        1        76         3   3.9%
kmem_va_32768                    1        1         4         3  75.0%
kmem_alloc_8                   140        1     17920        10   0.1%
kmem_alloc_16                  129        1     13158        23   0.2%
kmem_alloc_24                  214        1     18190         1   0.0%
kmem_alloc_32                  297        1     21681        29   0.1%
    :
    :
 
> ::kmem_slabs -b 5
> ::kmem_slabs -b 5
                                    Partial              Unused
Cache Name                   Slabs    Slabs   Buffers   Buffers  Waste
------------------------- -------- -------- --------- --------- ------
kmem_magazine_1                 14        1      3514       146   4.2%
 
  Allocated
    Buffers  ------------------ Distribution ------------------ Slabs
        256 |                                                   0
    192-255 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@     13
    128-191 |                                                   0
     64-127 |@@@                                                1
       1-63 |                                                   0
 
                                    Partial              Unused
Cache Name                   Slabs    Slabs   Buffers   Buffers  Waste
------------------------- -------- -------- --------- --------- ------
kmem_magazine_3                 11        7      1375       747  54.3%
 
  Allocated
    Buffers  ------------------ Distribution ------------------ Slabs
        128 |                                                   0
     96-127 |@@@@@@@@@@@@@@@@@@                                 4
      64-95 |                                                   0
      32-63 |                                                   0
       1-31 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                    7
    :
    : 
 
> ffffc100000212c8::kmem_slabs -v
> ffffc100000212c8::kmem_slabs -v
                                    Partial              Unused
Cache Name                   Slabs    Slabs   Buffers   Buffers  Waste
------------------------- -------- -------- --------- --------- ------
kmem_magazine_3                 11        7      1375       747  54.3%
  4 complete (128), 7 partial: 19 24 18 29 19 12 7
 
 

[ address ] ::kmem_verify
指定されたアドレスに格納されている kmem_cache 構造体、またはアクティブ kmem_cache 構造体の完全なセットの完全性を検証します。明示的にキャッシュアドレスが指定されている場合、この dcmd はエラーに関するより冗長な情報を表示します。明示的に指定されていない場合は、要約レポートを表示します。::kmem_verify dcmd については、「カーネルメモリーキャッシュ」で詳しく説明します。
> ::kmem_verify
> ::kmem_verify
Cache Name                      Addr             Cache Integrity
kmem_magazine_1                 ffffff00c5021008 clean
kmem_magazine_3                 ffffff00c5021348 clean
kmem_magazine_7                 ffffff00c5021688 clean
kmem_magazine_15                ffffff00c50219c8 clean
kmem_magazine_31                ffffff00c5022008 clean
kmem_magazine_47                ffffff00c5022348 clean
kmem_magazine_63                ffffff00c5022688 clean
kmem_magazine_95                ffffff00c50229c8 clean
kmem_magazine_143               ffffff00c5023008 clean
kmem_slab_cache                 ffffff00c5023348 clean
kmem_bufctl_cache               ffffff00c5023688 clean
kmem_bufctl_audit_cache         ffffff00c50239c8 clean
kmem_alloc_8                    ffffff00c5027008 clean
kmem_alloc_16                   ffffff00c5027348 clean
kmem_alloc_24                   ffffff00c5027688 clean
kmem_alloc_32                   ffffff00c50279c8 clean
    :
    :
 

[ address ] ::vmem
指定されたアドレスに格納されている vmem 構造体、またはアクティブ vmem 構造体の完全なセットをフォーマットし、表示します。この構造体は、<sys/vmem_impl.h> で定義されます。
> ::vmem
> ::vmem
ADDR             NAME                        INUSE        TOTAL   SUCCEED  FAIL
fffffffffbcd78c0 heap                    273100800 1095132774400      2738     0
fffffffffbcd8700   vmem_metadata           4112384      4194304       965     0
fffffffffbcd9540     vmem_seg              3665920      3665920       880     0
fffffffffbcda380     vmem_hash              182784       188416        37     0
fffffffffbcdb1c0     vmem_vmem              266688       294528        76     0
fffffffffbcddc80   static                        0            0         0     0
fffffffffbcdeac0     static_alloc                0            0         0     0
fffffffffbcdf900   hat_memload             1966080      1966080       483     0
ffffff00c5001000   kstat                    296160       303104      1029     0
ffffff00c5002000   kmem_metadata           4984832      5111808      1163     0
ffffff00c5003000     kmem_msb              4050944      4050944       994     0
ffffff00c5004000     kmem_cache             382336       475136       511     0
ffffff00c5005000     kmem_hash              451072       458752       319     0
ffffff00c5006000   kmem_log                 131808       135168         6     0
ffffff00c5007000   kmem_firewall_va       13529088     13529088       814     0
ffffff00c5008000     kmem_firewall               0            0         0     0
ffffff00c500d000     kmem_oversize        13527160     13529088       814     0
ffffff00c501a000   mod_sysfile                   7         4096         1     0
ffffff00c501f000   kmem_va               143998976    143998976      1001     0
ffffff00c5020000     kmem_default        143228928    143228928     17536     0
ffffff00c5049000   kmem_io_1G                28672        28672         7     0
ffffff00c504a000   kmem_io_16M                   0            0         0     0
ffffff00c504d000   bp_map                        0            0         0     0
ffffff00c505c000   umem_np                  524288       524288        23     0
ffffff00c505e000   ksyms                   2216252      2244608       289     0
ffffff00c505f000   ctf                     2045575      2068480       290     0
    :
    :
 

address ::vmem_seg
指定されたアドレスに格納されている vmem_seg 構造体をフォーマットし、表示します。この構造体は、<sys/vmem_impl.h> で定義されます。
> 0x30000022bd0::vmem_seg -v
> 0x30000022bd0::vmem_seg -v
            ADDR TYPE            START              END             SIZE
                                THREAD        TIMESTAMP                 
     30000022bd0 ALLC      30002358000      3000235a000             8192
 
 

address ::whatis [- abv]
指定されたアドレスに関する情報をレポートします。特に、::whatis は、そのアドレスが kmem によって管理されているバッファーへのポインタまたはスレッドスタックのような別のタイプの特殊メモリー領域へのポインタかどうかを判断し、検出結果をレポートします。
オプション:
-a 照会に最初に一致するものだけでなく、すべての一致をレポートします
-b アドレスが既知の kmem bufctl によって参照されているかどうかも判断します
-v 種々のカーネルデータ構造体を検索する際に進行状況をレポートします
> ffffff00c5004000::whatis
> ffffff00c5004000::whatis
ffffff00c5004000 is allocated from the vmem_vmem vmem arena:
            ADDR TYPE            START              END             SIZE
                                THREAD        TIMESTAMP                 
fffffffffbcea7a8 ALLC ffffff00c5004000 ffffff00c5004e40             3648
                      fffffffffbc36de0                0
                 vmem_hash_insert+0x89
                 vmem_seg_alloc+0x12d
                 vmem_xalloc+0x6c2
                 vmem_alloc+0x172
                 vmem_create_common+0xcb
                 vmem_create+0x38
                 kmem_init+0x129
                 startup_kmem+0xbf
                 startup+0x33
                 main+0x3a
                 _locore_start+0x90
 

walker

allocdby
指定された kthread_t 構造体のアドレスを開始点として使用して、当該カーネルスレッドによって行われたメモリー割り当てに対応する bufctl 構造体のセットに対して反復適用します。

bufctl
指定された kmem_cache_t 構造体のアドレスを開始点として使用して、このキャッシュに関連する割り当てられた bufctl 構造体のセットに対して反復適用します。

freectl
指定された kmem_cache_t 構造体のアドレスを開始点として使用して、このキャッシュに関連する空き bufctl のセットに対して反復適用します。

freedby
指定された kthread_t 構造体のアドレスを開始点として使用して、このカーネルスレッドによって行われたメモリー割り当て解除に対応する bufctl 構造体のセットに対して反復適用します。

freemem
指定された kmem_cache_t 構造体のアドレスを開始点として使用して、このキャッシュに関連する空きバッファーのセットに対して反復適用します。

kmem
指定された kmem_cache_t 構造体のアドレスを開始点として使用して、このキャッシュに関連する割り当てられたバッファーのセットに対して反復適用します。

kmem_cache
アクティブな kmem_cache_t 構造体のセットに対して反復適用します。この構造体は、<sys/kmem_impl.h> で定義されます。
> ::walk kmem_cache |::print kmem_cache_t cache_name
> ::walk kmem_cache |::print kmem_cache_t cache_name
cache_name = [ "kmem_magazine_1" ]
cache_name = [ "kmem_magazine_3" ]
cache_name = [ "kmem_magazine_7" ]
cache_name = [ "kmem_magazine_15" ]
cache_name = [ "kmem_magazine_31" ]
cache_name = [ "kmem_magazine_47" ]
cache_name = [ "kmem_magazine_63" ]
cache_name = [ "kmem_magazine_95" ]
    :
    :
 

kmem_cpu_cache
指定された kmem_cache_t 構造体のアドレスを開始点として使用して、このキャッシュに関連する CPU ごとの kmem_cpu_cache_t 構造体に対して反復適用します。
> 0000030000160008::walk kmem_cpu_cache |::print kmem_cpu_cache_t cc_flags
> 0000030000160008::walk kmem_cpu_cache |::print kmem_cpu_cache_t cc_flags
cc_flags = 0
cc_flags = 0
cc_flags = 0
cc_flags = 0
cc_flags = 0
cc_flags = 0
cc_flags = 0x1000
cc_flags = 0
 

kmem_slab
指定された kmem_cache_t 構造体のアドレスを開始点として使用して、関連する kmem_slab_t 構造体のセットに対して反復適用します。この構造体は、<sys/kmem_impl.h> で定義されます。
> 00000300000a0008::walk kmem_slab |::print kmem_slab_t slab_cache
> 00000300000a0008::walk kmem_slab |::print kmem_slab_t slab_cache
slab_cache = 0x300000a0008
slab_cache = 0x300000a0008
slab_cache = 0x300000a0008
slab_cache = 0x300000a0008
slab_cache = 0x300000a0008
    :
    :
 

kmem_log
kmem アロケータトランザクションログに格納されている bufctl のセットに対して反復適用します。

leak
指定された bufctl 構造体のアドレスを使用して、同様な割り当てスタックトレースを持つ、リークが発生したメモリーバッファーに対応する bufctl 構造体のセットに対して反復適用します。leak walker を使用する前には、::findleaks dcmd を適用してメモリーリークを発見しておく必要があります。

leakbuf
指定された bufctl 構造体のアドレスを使用して、同様な割り当てスタックトレースを持つ、リークが発生したメモリーバッファーに対応するバッファーアドレスのセットに対して反復適用します。leakbuf walker を使用する前には、::findleaks dcmd を適用してメモリーリークを発見しておく必要があります。

vmem
指定された vmem 構造体に対して反復適用します。
> ::walk vmem |::print vmem_t vm_name
> ::walk vmem |::print vmem_t vm_name
vm_name = [ "heap" ]
vm_name = [ "vmem_metadata" ]
vm_name = [ "vmem_seg" ]
vm_name = [ "vmem_hash" ]
vm_name = [ "vmem_vmem" ]
vm_name = [ "static" ]
vm_name = [ "static_alloc" ]
vm_name = [ "hat_memload" ]
vm_name = [ "kstat" ]
    :
    :
 

vmem_seg
指定された kmem_cache_t 構造体のアドレスを使用して、vmem_seg 構造体に対して反復適用します。
> 0000030005ea0da0::walk vmem_seg |::print vmem_seg_t vs_type
> 0000030005ea0da0::walk vmem_seg |::print vmem_seg_t vs_type
vs_type = 0x10
vs_type = 0x20
vs_type = 0x10
vs_type = 0x1
vs_type = 0x1
    :
    :
 

0 件のコメント:

コメントを投稿