全部博文(389)
分类: Oracle
2013-09-15 21:48:55
Exadata IO过程解读
首先我们来看传统的oracle数据库在执行io的过程,假设现在DBWR进程需要写入一个数据块到磁盘上去。大体流程是DBWR进程
发布一个IO调用,操作系统执行IO函数,数据流主要是oracle buffer=>HBA卡=>光纤=>存储交换机=>存储控制器=>存储cache(磁盘)
可以看出DBWR进程在执行io时,和其他应用程序使用IO使用一样的,都是使用标准的操作系统IO函数.
SQL> alter system flush buffer_cache;
System altered.
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
91.13 0.003996 3 1284 semtimedop
3.83 0.000168 15 11 pwrite
2.69 0.000118 0 890 semctl
2.35 0.000103 0 5145 times
0.00 0.000000 0 1 read
0.00 0.000000 0 1 open
0.00 0.000000 0 1 close
0.00 0.000000 0 8 getrusage
------ ----------- ----------- --------- --------- ----------------
100.00 0.004385 7341 total
可以看到pwrite一直在增长,查看一下系统帮助,答案这个系统函数是linux系统执行写调用的系统函数.
在Exadata上,ORACLE开发了一种全新,专有的协议,称为iDB协议.这个协议主要是用来在infiniband上的连接来实现到storage server的IO.
当Exadata上的DBWR进程执行IO时,首先把需要发布的IO经过组装成包,再调用专有的sendmsg函数通过infiniband发送到storage server上,
在storage server上的cellsrv进程接收到这个消息,解压,再根据消息的类型,进行相应的IO(本质是由cellsrv进程调用storage server上的操作系统的标准IO函数).
在RDBMS层面上,Exadata和传统的IO特点大不相同.比如smart scan就是通过在封装在消息包里,然后由cellsrv进行相应的处理。iDB可能还会包括其他的一些元数据,如是否有IORM,
Exadata上的RDBMS,ASM,CLUSTER都是链接了libcell.so协议,对于iDB的实现和函数都是在这个库文件中实现,这一点和非Exadata上的相应
oracle软件有很大的不同.
[oracle@rac1 lib]$ ls -l libcell*
-rw-r--r-- 1 oracle oinstall 1932476 May 24 10:37 libcell12.a
-rw-r--r-- 1 oracle oinstall 1399742 May 24 10:37 libcell12.so