perf パフォーマンス測定 その2 | パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

パークのソフトウエア開発者ブログ|ICT技術(Java・Android・iPhone・C・Ruby)なら株式会社パークにお任せください

開発の解決方法や新しい手法の情報を、パークのエンジニアが提供します。パークのエンジニアが必要な場合は、ぜひお気軽にお問い合わせ下さい。 株式会社パーク:http://www.pa-rk.co.jp/

perfに標準で用意されていないイベントを測定する方法を記載する。

調査しようしたOS環境を書き忘れていた。

OS : centOS7

perfのバージョンは、3.10.0です。

インテルのCPUには、パフォーマンスモニタ用のイベントが多数用意されている。
イベントの詳細に関しては、以下のドキュメントに記載されているのでインテルのサイトから入手してください。日本語のドキュメントはありません。
64-ia-32-architectures-software-developer-manual

パフォーマンス・イベントを調べるのでCPUIDが分かっていると目的のテーブルを見つけやすいので、CPUIDを以下のようにして調べる。
$ cat /proc/cpuinfo

----------------------------------------------
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E7-8870 v2 @ 2.30GHz
stepping : 7
microcode : 0x70d
 ・
 ・
 ・
----------------------------------------------

CPUIDは、上位8ビットをcpu familyとし下位8ビットにmodelでいいはず。
今回使用しているCPUのCPUIDは06-3Eとなる。

上記のドキュメントのVolume3.System Programming GuideのChapter 18,19に
各CPUに対応したパフォーマンスイベントを記述したたテーブルが記載されているので該当するテーブルを見つける。

テーブルには、Event numとUmask valueが記載されているので目的のイベントが見つかったら以下のように指定する。
$ perf stat -e cpu/event=0xd0,umask=0x21,name=lock_loads/ ls

nameに任意の名前を指定すると測定結果に表示される。

----------------------------------------------------
Performance counter stats for 'ls':

  lock_loads   5,979

0.004494705 seconds time elapsed
----------------------------------------------------

特殊な指定の仕方をするOFFCORE_RESPONSE_0についてです。
まずは、libpfm4.4をインストールしてください。
インストールしたらexampleフォルダにmakeを実行してcheck_eventとshowevtinfoの実行モジュールを作成する。

できたcheck_eventsを以下のように実行すると、指定したイベントをperfに指定する際に設定する値が取得できる。

 $ ./check_events OFFCORE_RESPONSE_0:ANY_IF

----------------------------------------------------
Requested Event: OFFCORE_RESPONSE_0:ANY_IFETCH
Actual Event: ivb_ep::OFFCORE_RESPONSE_0:DMND_IFETCH:PF_IFETCH:PF_LLC_IFETCH:ANY_RESPONSE:k=1:u=1:e=0:i=0:c=0:t=0
PMU : Intel Ivy Bridge EP
IDX : 216006723
Codes : 0x5301b7 0x10244
----------------------------------------------------

perfに指定する方法は以下になる。
Codesに表示される値が一つならばconfigのみを指定する。

$ perf stat -e cpu/config=0x5301b7,config1=0x10244,name=ANY_IFETCH/ ls

----------------------------------------------------
Performance counter stats for 'ls':

17,491 ANY_IFETCH

0.003449671 seconds time elapsed
----------------------------------------------------

これでコア部のパフォーマンスイベントは指定できるようになったので、
次回はアンコア部のパフォーマンスイベントの指定方法を記載する。