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

パークのソフトウエア開発者ブログ|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
----------------------------------------------------

これでコア部のパフォーマンスイベントは指定できるようになったので、
次回はアンコア部のパフォーマンスイベントの指定方法を記載する。
linuxでプログラムのパフォーマンスを測定する必要があり、パフォーマンス解析ツールであるperfについて調査したので忘れないように書きます。

1回目は、perfの基本的な使い方について記載する。
作成したプログラムの性能を測定するのに、特殊な設定をしないで使うことができるので便利である。

たとえば、lsコマンドの性能を測定したければ、以下のように入力する。

$ perf stat ls

すると測定結果が以下ように表示される。
---------------------------------------------------------------------------------
Performance counter stats for 'ls':

1.596928 task-clock # 0.371 CPUs utilized
67 context-switches # 0.042 M/sec
0 cpu-migrations # 0.000 K/sec
291 page-faults # 0.182 M/sec
4,239,166 cycles # 2.655 GHz
3,296,123 stalled-cycles-frontend # 77.75% frontend cycles idle
stalled-cycles-backend
1,998,801 instructions # 0.47 insns per cycle
# 1.65 stalled cycles per insn
393,089 branches # 246.153 M/sec
15,010 # 3.82% of all branches

0.004305785 seconds time elapsed
---------------------------------------------------------------------------------

task-clock : OSが実行プロセスに割り振った実行時間(ms)
 context-switches : コンテキストが切り替わった回数
 cpu-migrations     : CPUを移動した回数
 page-faults : ページフォルトが発生した回数
 cycles : 使用したCPUサイクル数
 stalled-cycles-frontend : フロントエンドで命令が止まったサイクル数(CPU依存)
 stalled-cycles-backend : バックエンドで命令が止まったサイクル数(CPU依存)
 instructions : リタイアした命令数
 branches : 分岐命令の実行回数
 branch-misses : 分岐予測をミスした回数



デフォルトで測定されるイベント以外を使ってみよう。
perfで測定できるイベントを調べるには以下を実行する。

 $ perf list

すると以下のように測定できるイベントの一覧が表示される。

---------------------------------------------------------------------------------
List of pre-defined events (to be used in -e):
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
cache-references [Hardware event]
cache-misses [Hardware event]
branch-instructions OR branches [Hardware event]
branch-misses [Hardware event]
bus-cycles [Hardware event]
ref-cycles [Hardware event]

cpu-clock [Software event]
task-clock [Software event]
page-faults OR faults [Software event]
context-switches OR cs [Software event]
cpu-migrations OR migrations [Software event]
minor-faults [Software event]
major-faults [Software event]
alignment-faults [Software event]
emulation-faults [Software event]
dummy [Software event]
---------------------------------------------------------------------------------

使用したいイベントを指定する方法は以下のようにする。

$ perf stat -e cache-references,cache-misses ls

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

33,448 cache-references
5,701 cache-misses # 17.044 % of all cache refs

0.003821157 seconds time elapsed
---------------------------------------------------------------------------------

指定したイベントが測定されました。
標準でもたくさんのイベントが用意されているので結構使えます。


次回は、標準で用意されていないイベントを測定する方法です。
最近、すごいパソコンのCMとかで取り上げられている
Office 365について調べてみました。

今回は、Office 365 Business Essentials について

月額410円~で利用でき、
Office アプリケーション(Access なし)
Web 版 Office による表示・編集
組織内個人用クラウド ストレージ (1 TB)
メール・予定表・連絡先、スパム / ウィルス対策
在籍確認・Web 会議・インスタント メッセージ
個人用アーカイブ、クライアント アクセス
共同作業ポータル
Active Directory との統合
インプレース電子情報開示 (eDiscovery)
などが利用可能。

http://www.microsoft.com/ja-jp/office/365/product-m.aspx

自社でも取り入れたら便利なのでは?
コストについてもうちょっと洗い出せたらと思います。
oracleの不具合に関する情報を書きたいと思います。

【発生条件】
クライアント・サーバー間でキャラクタ・セットが異なる。

【発生現象】
エクスポート時に警告(EXP-00091:不審な統計をエクスポートしています。)が出る。

【警告の内容】
統計情報がエクスポートできていない。

【対処方法】
インポート時にstastics=safeとする。または、インポート後に統計情報を取得しなおす。

【補足】
エクスポート時にstastics=noneとすれば警告は出ません。
初投稿です。
oracleの不具合に関する情報を書きたいと思います。

【発生条件】
1.oracle11g以降のバージョン
2.テーブルにnot null制約とデフォルト値を設定したカラムを追加
3.ダイレクト・パス・エクスポート(exp direct=y)で上記2.のテーブルをエクスポート

【発生現象】
上記2.で追加したカラムにデフォルト値ではなくnullが入る

【回避方法】
以下のどちらかで回避できます。

1.ダイレクト・パス・エクスポート(exp direct=y)をやめて、従来型パス・エクスポート
 (exp direct=n)でエクスポートする。
2.expコマンドではなく、expdpコマンド(Data Pump Export)でエクスポートする。

【補足】
・通常、ダイレクト・パス・エクスポートに比べて従来型パス・エクスポートは処理速度が
 劣ります。
・exp/impコマンドは、oracle11g以降は基本的にサポートされていません。
(参考URL)
http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05768-02/exp_imp.htm