emc cx500上的基於linux的3節點rac上的裸裝置的使用和效能測試

zhang41082發表於2019-06-20

一直以來只是聽說裸裝置如果能提高效能,如果沒有檔案系統管理方便等等,昨天看了一篇文章後,終於明白什麼叫裸裝置了,下面的例子是在一個3節點的rac環境下的一個節點測試的,盯著一個節點做是為了避免過多的cache fusion而影響效能測試。
環境如下:
儲存:emc cx500
主機:dell 1950
OS:redhat as4u4 64bit
DB:oracle 10.2.0.2

[@more@]

在儲存上劃出一塊空間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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章