ablog

不器用で落着きのない技術者のメモ

ASMLib Kernel Driver のI/O処理の効率化

新久保さんのブログに書かれたの小幡さんのコメントを読んでいて、

自分のコメントを読み返してみて誤解されそうだったので補足します:
33.3%のパフォーマンスアップ???
ASMにするともう少しアップするのでは?という意味で、
「相性が良い」と書きました。

10046 trace name context forever: 続 Unbreakable Enterprise Kernel

性能差が出るとしたら、使っているシステムコールが違ったりするのかなと思って、ぐぐってみたら、

2.インスタンスのOPEN時にDBWRが発行するシステムコール
以下、straceコマンドを使用して、インスタンスのOPEN時にDBWRが発行したシ
ステムコールを確認した結果、大きく違いが見られた部分です。

open("/dev/raw/raw1", O_RDWR|O_SYNC)    = 19
fcntl(19, F_SETFD, FD_CLOEXEC)          = 0


open("/opt/oracle/extapi/64/asm/orcl/1/libasm.so", O_RDONLY) = 19
read(19, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \21\0\0\0\0\0
                                                   \0"..., 832) = 832
fstat(19, {st_mode=S_IFREG|0755, st_size=18176, ...}) = 0
mmap(NULL, 2113432, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE,
                                              19, 0) = 0x2ac1aca92000
mprotect(0x2ac1aca96000, 2093056, PROT_NONE) = 0
mmap(0x2ac1acc95000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED
                         |MAP_DENYWRITE, 19, 0x3000) = 0x2ac1acc95000
close(19)                               = 0
open("/dev/oracleasm/.check_iid", O_RDWR) = 19
write(19, "MSA\0\2\0\3\0\30\0\0\0\0\0\0\0\23\0\0\0\0\0\0\0", 24) = 24
read(19, "MSA\0\2\0\3\0\30\0\0\0\0\0\0\0\23\0\0\0\0\0\0\0", 24) = 24
close(19)                               = 0 000019>
open("/dev/oracleasm/iid/0000000000000013", O_RDWR|O_CREAT, 0770) = 19
fcntl(19, F_GETFD)                      = 0
fcntl(19, F_SETFD, FD_CLOEXEC)          = 0

大きく違う部分としては以下の2点です。
1.libasm.soのopenの有無
2.データファイルのopenシステムコール発行時のO_SYNCオプション

1つめのlibasm.soは、ASMLibをインストールした際に配置されるファイルです。
そのため、ASMLibの動作に必要なライブラリを使用可能にしているだけのためASMLibを使用する環境としては当然の動作です。

2つめについて、O_SYNCオプションを使用している場合は同期モードでデータファイルのopenすることになります。
また、オプションを使用していない場合では非同期モードでファイルをopenすることになります。


...

...

io_submit(47418402635776, 6, {
  {0x2b207560e1a0, 0, 1, 0, 19},
  {0x2b207560d7a0, 0, 1, 0, 19}, {0x2b207560d1a0, 0, 1, 0, 19},
  {0x2b207560d9a0, 0, 1, 0, 19}, {0x2b207560dfa0, 0, 1, 0, 19},
  {0x2b207560d3a0, 0, 1, 0, 19}}) = 6
io_getevents(47418402635776, 4, 128, {
  {0x2b207560e1a0, 0x2b207560e1a0, 212992, 0},
  {0x2b207560d3a0, 0x2b207560d3a0, 8192, 0},
  {0x2b207560dfa0, 0x2b207560dfa0, 8192, 0},
  {0x2b207560d1a0, 0x2b207560d1a0, 344064, 0}},
  {600, 0}) = 4

...

上記のシステムコールではデータファイルへの書き込みはできません。
ただ、RAWデバイスとASMLibを使用している場合では、DBWRが発行しているシステムコールから動作が全く違うということから推測すると、実際に書き込みを行っている部分でも上記のように全く異なる書き込み方法を行っている可能性が高そうです。
そのため、そもそも行っている処理が違うために、INSERT文で処理時間に差が出た可能性が高いと考えられます。

ASMLibに関する検証 その6 | Insight Technology, Inc.

こんなんでてきた。
ASM じゃなくて ASMLib の話だけど、ASMLib を使うとディスクI/Oを行う際に使うシステムコールがrawデバイスを使う場合と違うらしい。
rawデバイスだと同期I/O(O_SYNCフラグ付きでファイルをopen())していて、非同期I/Oの制御は全て Oracle Database 側で行っている。
それに対して、ASMLib は libaio を使って非同期I/Oを行っているみたい。

ASMLib を使うかどうかで性能差が出る可能性があるということか。
結構、大事な話だな。