新久保さんのブログに書かれたの小幡さんのコメントを読んでいて、
自分のコメントを読み返してみて誤解されそうだったので補足します:
10046 trace name context forever: 続 Unbreakable Enterprise Kernel
33.3%のパフォーマンスアップ???
ASMにするともう少しアップするのでは?という意味で、
「相性が良い」と書きました。
性能差が出るとしたら、使っているシステムコールが違ったりするのかなと思って、ぐぐってみたら、
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 ...上記のシステムコールではデータファイルへの書き込みはできません。
ASMLibに関する検証 その6 | Insight Technology, Inc.
ただ、RAWデバイスとASMLibを使用している場合では、DBWRが発行しているシステムコールから動作が全く違うということから推測すると、実際に書き込みを行っている部分でも上記のように全く異なる書き込み方法を行っている可能性が高そうです。
そのため、そもそも行っている処理が違うために、INSERT文で処理時間に差が出た可能性が高いと考えられます。
こんなんでてきた。
ASM じゃなくて ASMLib の話だけど、ASMLib を使うとディスクI/Oを行う際に使うシステムコールがrawデバイスを使う場合と違うらしい。
rawデバイスだと同期I/O(O_SYNCフラグ付きでファイルをopen())していて、非同期I/Oの制御は全て Oracle Database 側で行っている。
それに対して、ASMLib は libaio を使って非同期I/Oを行っているみたい。
ASMLib を使うかどうかで性能差が出る可能性があるということか。
結構、大事な話だな。