一直以来只是听说裸设备如果能提高性能,如果没有文件系统管理方便等等,昨天看了一篇文章后,终于明白什么叫裸设备了,下面的例子是在一个3节点的rac环境下的一个节点测试的,盯着一个节点做是为了避免过多的cache fusion而影响性能测试。
环境如下:
存储:emc cx500
主机:dell 1950
OS:redhat as4u4 64bit
DB:oracle 10.2.0.2
在存储上划出一块空间10G,然后把这个lun分配到已经存在的三个节点共享的STORGE GROUP中,依次重启每个节点(据说不重启也可以的,不过我一般选择重启,因为是rac环境,所以每次启动一个也不会使得数据库宕机的),最后保证每个节点都可以看到新添加的lun(这里使用disk -l)。
对新划分的空间进行分区(这个步骤只要在一个节点上操作就可以了),fdisk /dev/emcpowerk,分区后到各节点查看是否有新的设备/dev/emcpowerk1生成,新生成的设备是块设备,当时做试验的时候还不是很理解,就直接把表空间创建到了这个/dev/emcpowerk1设备上,也可以创建成功,但是因为一个lun在不同的主机上对应的设备名称不一定相同,会导致其他的node不能正确读写相应的设备,导致I/O错误。因此后来选择把块设备映射到字符设备上。
执行raw /dev/raw/raw3 /dev/emcpowerk1,把设备映射关系建立好,并到/dev/raw目录,把/dev/raw/raw3的属主和组改变成oracle:dba,把权限改为777(权限其实不需要这么大,偷懒就可以这么做),然后再其他节点也这样映射,注意要把同一个lun映射到相同的裸设备名称上去。同时应该把此步骤放到开机自动启动的脚本中,否则重新启动后映射关系就消失了。需要做两个步骤,首先在/etc/sysconfig/rawservice中添加一行/dev/raw/raw3 /dev/emcpowerk1,然后在/etc/rc.d/rc.local中增加修改/dev/raw/raw3的属主和权限的脚本,chown oracle:dba /dev/raw/raw3 chmod 777 /dev/raw/raw3。其他节点也依次做一遍。当时做试验的时候只在一个node上做完映射就开始创建表空间,
CREATE TABLESPACE tbsraw DATAFILE
'/dev/raw/raw3' SIZE 1024M AUTOEXTEND ON NEXT 10M MAXSIZE 9800M
LOGGING
PERMANENT
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL
FLASHBACK ON;
表空间创建成功,但是在其他节点上使用select file_name from dba_data_files查询是,会报file 7读写错误,这里的file 7就是新加的表空间对应的裸设备,错误日志如下:
Errors in file /u01/app/oracle/admin/billdb/bdump/billdb2_dbw0_9496.trc:
ORA-01157: cannot identify/lock data file 7 - see DBWR trace file
ORA-01110: data file 7: '/dev/raw/raw3'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
因为这个节点还没有进行设备间的映射,于是按照上面的步骤操作完毕,重新执行sql查询,还是报错,重启db后,问题解决。在第三个节点上重复此步骤,到最后三个节点都可以看到这个裸设备,执行sql返回结果如下:
SQL> select file_name from dba_data_files where file_id=7;
FILE_NAME
--------------------------------------------------------------------------------
/dev/raw/raw3
创建一个表,然后开始测试,以下测试全部在一个节点进行。
SQL> alter table test nologging;
Table altered.
Elapsed: 00:00:00.03
SQL> alter table test1 nologging;
Table altered.
Elapsed: 00:00:00.02
SQL> INSERT /*+ APPEND*/ INTO TEST SELECT /*+ PARALLEL(A,4)*/ * FROM TEST A;
100000 rows created.
Elapsed: 00:00:02.19
SQL> INSERT /*+ APPEND*/ INTO TEST SELECT /*+ PARALLEL(A,4)*/ * FROM TEST A;
200000 rows created.
Elapsed: 00:00:02.33
SQL> INSERT /*+ APPEND*/ INTO TEST SELECT /*+ PARALLEL(A,4)*/ * FROM TEST A;
400000 rows created.
Elapsed: 00:00:03.99
SQL> INSERT /*+ APPEND*/ INTO TEST SELECT /*+ PARALLEL(A,4)*/ * FROM TEST A;
800000 rows created.
Elapsed: 00:00:10.68
SQL> INSERT /*+ APPEND*/ INTO TEST SELECT /*+ PARALLEL(A,4)*/ * FROM TEST A;
1600000 rows created.
Elapsed: 00:00:14.97
SQL> INSERT /*+ APPEND*/ INTO TEST SELECT /*+ PARALLEL(A,4)*/ * FROM TEST A;
3200000 rows created.
Elapsed: 00:00:29.37
SQL> INSERT /*+ APPEND*/ INTO TEST SELECT /*+ PARALLEL(A,4)*/ * FROM TEST A;
6400000 rows created.
Elapsed: 00:01:14.80
SQL> INSERT /*+ APPEND*/ INTO TEST SELECT /*+ PARALLEL(A,4)*/ * FROM TEST A;
12800000 rows created.
Elapsed: 00:01:55.63
SQL> INSERT /*+ APPEND*/ INTO TEST1 SELECT /*+ PARALLEL(A,4)*/ * FROM TEST1 A;
100000 rows created.
Elapsed: 00:00:01.55
SQL> INSERT /*+ APPEND*/ INTO TEST1 SELECT /*+ PARALLEL(A,4)*/ * FROM TEST1 A;
200000 rows created.
Elapsed: 00:00:02.03
SQL> INSERT /*+ APPEND*/ INTO TEST1 SELECT /*+ PARALLEL(A,4)*/ * FROM TEST1 A;
400000 rows created.
Elapsed: 00:00:05.52
SQL> INSERT /*+ APPEND*/ INTO TEST1 SELECT /*+ PARALLEL(A,4)*/ * FROM TEST1 A;
800000 rows created.
Elapsed: 00:00:07.79
SQL> INSERT /*+ APPEND*/ INTO TEST1 SELECT /*+ PARALLEL(A,4)*/ * FROM TEST1 A;
1600000 rows created.
Elapsed: 00:00:12.18
SQL> INSERT /*+ APPEND*/ INTO TEST1 SELECT /*+ PARALLEL(A,4)*/ * FROM TEST1 A;
3200000 rows created.
Elapsed: 00:00:22.02
SQL> INSERT /*+ APPEND*/ INTO TEST1 SELECT /*+ PARALLEL(A,4)*/ * FROM TEST1 A;
6400000 rows created.
Elapsed: 00:00:41.80
SQL> INSERT /*+ APPEND*/ INTO TEST1 SELECT /*+ PARALLEL(A,4)*/ * FROM TEST1 A;
12800000 rows created.
Elapsed: 00:01:21.68
这里可以看到在大数据量时插入速度上的差别。
SQL> select count(*) from test;
COUNT(*)
----------
25600000
Elapsed: 00:01:42.87
SQL> select count(*) from test1;
COUNT(*)
----------
25600000
Elapsed: 00:00:58.66
SQL> select /*+ parallel(test,4)*/ count(*) from test;
COUNT(*)
----------
25600000
Elapsed: 00:00:32.53
SQL> select /*+ parallel(test1,4)*/ count(*) from test1;
COUNT(*)
----------
25600000
Elapsed: 00:00:17.13
这里可以看到查询时读上的差别。
虽然此rac使用的是基于asm的裸设备,但是和真正的裸设备速度上还是有差别的,和文件系统的性能差别估计会更明显了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25016/viewspace-980163/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25016/viewspace-980163/