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

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

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

ActiveDirectoryって?? その2

ActiveDirectoryでは、「認証」と「承認」作業に「kerberos」(ケルベロス)を使用してます。
Kerberosでの認証/承認では、
認証に成功すると「TGT」(Ticket Granting Ticket)と呼ばれるチケットを発行されます。


その後、承認を行う際に、クライアント側は受け取った「TGT」を提示し、
アクセスしてもよいユーザーであることを確認されると、「ST」(Service Ticket)と呼ばれるチケットが発行され、
ActiveDirectoryドメインの各種リソース(PC、プリンターなど)にアクセスできるようになります。
その後、クライアント側は、「Kerberos」に対して、「再度認証/承認作業は行わず、サービスチケットを使いまわし、
各種リソースにアクセスします。


ActiveDirectory側がTGTとSTをクライアントPCに提供することで認証と承認を制御します。

Kerberos認証は、ActiveDirectoryから受け取った「TGT」をパスワードで復号化します。
そのためパスワードを送信しないため、
ネットワークを介して情報が盗まれるリスクが低い特徴があります。

Kerbros認証の流れ
・認証に成功後「TGT」(Ticket Granting Ticket)が発行
・「TGT」をパスワードで復号化
・クライアント側が「TGT」をActiveDirectoryに提示し、サービスチケットを取得

その3では、「ドメインコントローラー」に関して記載します。
ActiveDirectoryって?? その1

ActiveDirectoryは、
WindowsServerの機能の1つで、
ネットワーク上のサーバーPC、クライアントPC、プリンタなどを
使用する利用者のアクセス権限などの情報を一元管理する機能です。

たとえば、社内の複数のPCのログインユーザーとパスワードを一括で管理できます。

基本的にはPC毎にユーザーアカウントを持っているので、パスワードを忘れると、
リカバリするしかないですが、
ActiveDirectoryを使用することでサーバーがアカウント情報(ユーザー、パスワード)を一元管することで、
パスワード確認することはできませんが、パスワードがわからなくなった場合、
管理者ユーザー(Administrator権限)でパスワードをリセットすることが出来ます。
AD画像1

また、ActiveDirectoryにユーザーを作成することで、
「認証」、「承認」を実現することが出来ます。
適切なユーザーがActiveDirectoryドメインにあるファイルサーバー、データーベースサーバー、クライアントPCなどの
リソースにアクセスできるようなります。
- 認証:「ユーザー名」と「パスワード」を入力して、ログオンを行うユーザーが誰であるかを確認する作業です。
- 承認:ログオンを行ったユーザーがサーバーにアクセスする際に、アクセスしてもよいか確認する作業です。

ActiveDirectoryには、以下の主なプロトコル機能があり、認証と承認作業に「Kerberos」を使用しています。
・Kerberos
共有機密鍵暗号を使用して、信頼のおける第三者機関による認証サービスとして認証を実行します。
・LDAP(Lightweight Directory Access Protocol)
ディレクトリデータベースへアクセスするためのプロトコル
・SMB
WindowsPCの間でファイル共有やプリンタ共有などを行うためのプロトコル

「認証」、「承認」で使用している「kerberos」に関しては、「その2」に記載します。
今回はperfは出てこないですがパフォーマンス測定の番外編です。

性能を評価していてシステムレベルでの動作が重いと思われたのでCPUの利用状況を調べてみたのでその方法を書きます。

CPU利用状況を調べるの使用したのはmpstatである。

 mpstat [options] [] []

interval:実行間隔(秒)
count:実行する回数

optionsを何も指定しないと全CPUのトータルが出力される。
CPUごとの利用状況が知りたい場合は、
 -P ALL
を指定する。


[-P ALL]を指定したときの実行結果

----------------------------------------------------
07:09:21 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:09:26 PM all 3.72 0.00 0.17 0.01 0.00 0.00 0.00 0.00 0.00 96.10
07:09:26 PM 0 79.23 0.00 4.44 0.00 0.00 0.00 0.00 0.00 0.00 16.33
07:09:26 PM 1 76.26 0.00 3.42 0.00 0.00 0.00 0.00 0.00 0.00 20.32
07:09:26 PM 2 87.20 0.00 3.86 0.00 0.00 0.00 0.00 0.00 0.00 8.94
07:09:26 PM 3 32.33 0.00 0.80 0.00 0.00 0.00 0.00 0.00 0.00 66.87
07:09:26 PM 4 86.84 0.00 4.05 0.00 0.00 0.00 0.00 0.00 0.00 9.11
07:09:26 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
07:09:26 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
07:09:26 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
07:09:26 PM 8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
----------------------------------------------------

システムレベルの利用状況が多い時にどのシステムコールが呼ばれているか調査するのに以下のコマンドを使用した。
  strace -cf -p pid -o 出力ファイル名
pidはpsコマンドで調べる。

以下のように結果が出力される。
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
79.41 615.893782 54601 11280 1155 futex
19.12 148.318638 1128 131501 mprotect
1.46 11.286654 7616 1482 nanosleep
0.01 0.072216 1313 55 mmap
0.00 0.020947 997 21 munmap
0.00 0.007072 884 8 mremap
0.00 0.002639 2639 1 restart_syscall
------ ----------- ----------- --------- --------- ----------------
100.00 775.601948 144348 1155 total

多く呼ばれているシステムコールが何かを見てボトルネックとなっている処理を推測できました。

timeoutコマンドを併用するとある時間範囲の測定ができます。
  timeout 10 strace -cf -p pid -o 出力ファイル名

これで10秒間だけ監視できます。
今回はnuma構成のマシンで、メモリとスレッドの関係を変更して性能評価する方法を書く。


まずは、使用するマシンのnuma構成を取得する。

$ numactl -H

----------------------------------------------------
available: 4 nodes (0-3)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
node 0 size: 262037 MB
node 0 free: 239110 MB
node 1 cpus: 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
node 1 size: 262144 MB
node 1 free: 246338 MB
node 2 cpus: 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
node 2 size: 262144 MB
node 2 free: 240336 MB
node 3 cpus: 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
node 3 size: 262144 MB
node 3 free: 237420 MB
node distances:
node 0 1 2 3
0: 10 21 21 31
1: 21 10 31 21
2: 21 31 10 21
3: 31 21 21 10
----------------------------------------------------


CPU番号とソケットの関係はcpuinfoに記載されているので確認する。
$ cat /proc/cpuinfo

メモリ位置はノード番号で指定し、実行位置はCPU番号で指定する。
メモリはノード0を使用して、CPUの0と1で実行する場合は以下のように指定する。

$ numactl -m 0 -C 0-2 ls

ちなみにperfで測定する場合は、以下のようにする。
$ perf stat numactl -m 0 -C 0-2 ls

前回書いたアンコア部のカウンタを調査するときにnumactlでメモリ位置等を制御すると案外おもしろい値が取れたりするのでやってみてね。
xeonやi7の用にマルチコア構成になっているCPUにはコア間を制御するアンコア部がある。
アンコア部がL3キャッシュやDRAM等へのアクセス制御を行う。
DRAMへのアクセス性能を評価する場合はアンコアのイベントを取得する。

xeonのアンコア部分のパフォーマンスモニタについては以下のドキュメントに記載されていた。
 xeon-e5-2600-v2-uncore-manual


メモリ帯域を評価したいので、DRAMとQPIのカウンタを使用することにした。
DRAMはCAS_COUNTのREADとWRITE
QPIはTxL_FLITS_G0のDATAとNON_DATA

測定に使用するマシンはマルチソケットのnuma構成になっているので、
ソケットごとのカウンタを取得し、各ソケットの動作状況を測定した。
コマンドは以下のようになる。
$ perf stat -a --per-socket -e
"uncore_imc_0/event=0x04,umask=0x0F,name=IMC0_ALL/","uncore_imc_1/event=0x04,umask=0x0F,name=IMC1_ALL/",
"uncore_imc_2/event=0x04,umask=0x0F,name=IMC2_ALL/","uncore_imc_3/event=0x04,umask=0x0F,name=IMC3_ALL/",
"uncore_qpi_0/event=0x00,umask=0x02,name=QPI0_DATA/","uncore_qpi_0/event=0x00,umask=0x04,name=QPI0_NONDATA/"
./test

-aを指定は必須。-aを指定するとroot権限がないと動作しない。

結果は以下。

----------------------------------------------------
S0 1 152,662,593 IMC0_ALL
S0 1 300,257,069 IMC1_ALL
S0 1 468,061,436 IMC2_ALL
S0 1 314,609,460 IMC3_ALL
S0 1 2,017,971,144 QPI0_DATA (100.00%)
S0 1 2,308,366,536 QPI0_NONDATA
S1 1 113,422,561 IMC0_ALL
S1 1 122,583,629 IMC1_ALL
S1 1 130,274,692 IMC2_ALL
S1 1 195,739,059 IMC3_ALL
S1 1 208,651,932 QPI0_DATA (100.00%)
S1 1 1,876,664,190 QPI0_NONDATA
----------------------------------------------------

これで、メモリ帯域とソケット間通信の帯域が測定できるようになりました。