[20170221]資料檔案與檔案系統快取.txt

lfree發表於2017-02-21

[20170221]資料檔案與檔案系統快取.txt

--昨天探究磁碟之間複製檔案時很慢,發現一個小工具nocache,發現這個可以用來探究資料檔案與檔案系統快取的問題,自己測試看看.

1.環境以及構造測試資料:

--//首先說明我的測試資料庫在安裝在記憶體盤中,使用cachesats看資料庫安裝與否都是快取的.
$ cachestats book/system01.dbf
book/system01.dbf                    pages in cache: 194562/194562 (100.0%)  [filesize=778248.0K, pagesize=4K]

--//透過cp,再ln命令建立連結測試磁碟的情況.

$ cp -ar  /mnt/ramdisk/book /u01/backup/2017021
$ cd /mnt/ramdisk
$ mv book book_ram
$ ln -s /u01/backup/2017021 book
$ ls -l
total 0
lrwxrwxrwx 1 oracle oinstall  19 2017-02-21 10:44:30 book -> /u01/backup/2017021

$ cachedel book/system01.dbf
$ cachestats book/system01.dbf
book/system01.dbf                        pages in cache: 0/194562 (0.0%)  [filesize=778248.0K, pagesize=4K]

--//OK.
--//BTW: 我修改nocache的原始碼,加入前面顯示檔名的功能,很簡單不再貼出.
--//啟動資料庫略

SYS@book> show parameter filesystem
NAME                 TYPE   VALUE
-------------------- ------ ------
filesystemio_options string none

--//官方文件:(注中文部分我加的)

9.1.1.2 FILESYSTEMIO_OPTIONS Initialization Parameter

You can use the FILESYSTEMIO_OPTIONS initialization parameter to enable or disable asynchronous I/O or direct I/O on
file system files. This parameter is platform-specific and has a default value that is best for a particular platform.

FILESYTEMIO_OPTIONS can be set to one of the following values:

ASYNCH: enable asynchronous I/O on file system files, which has no timing requirement for transmission.
        在檔案系統檔案上啟用非同步I/O,在資料傳送上沒有計時要求。
DIRECTIO: enable direct I/O on file system files, which bypasses the buffer cache.
        在檔案系統檔案上啟用直接I/O,繞過buffer cache。
SETALL: enable both asynchronous and direct I/O on file system files.
        在檔案系統檔案上啟用非同步和直接I/O。
NONE: disable both asynchronous and direct I/O on file system files.
      在檔案系統檔案上禁用非同步和直接I/O。
==========================

SCOTT@book> create table t as select rownum id from dual connect by level<=2;
Table created.

SCOTT@book> ALTER TABLE t MINIMIZE RECORDS_PER_BLOCK ;
Table altered.
--//這樣可以實現每塊2條記錄.

SCOTT@book> insert into t select rownum+2 from dual connect by level <=64000-2;
63998 rows created.

SCOTT@book> commit ;
Commit complete.

insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
commit ;

--//分析略.
SCOTT@book> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,HEADER_FILE,HEADER_BLOCK,BYTES,BLOCKS from dba_segments where owner=user and segment_name='T';
OWNER  SEGMENT_NAME         SEGMENT_TYPE       HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS
------ -------------------- ------------------ ----------- ------------ ---------- ----------
SCOTT  T                    TABLE                        4          546 2154823680     263040

--//佔用2154823680/1024/1024=2055M,263040塊

2.測試:(FILESYTEMIO_OPTIONS=NONE)
--//FILESYTEMIO_OPTIONS=NONE
$ cachestats /mnt/ramdisk/book/users01.dbf
/mnt/ramdisk/book/users01.dbf            pages in cache: 546436/547522 (99.8%)  [filesize=2190088.0K, pagesize=4K]

SCOTT@book> set timing on
SCOTT@book> alter session set statistics_level=all;
Session altered.

select count(*) from t;
Plan hash value: 2966233522
----------------------------------------------------------------------------------------------------------------------
| Id  | Operation          | Name | Starts | E-Rows | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |      1 |        | 71094 (100)|          |      1 |00:00:00.64 |     256K|    256K|
|   1 |  SORT AGGREGATE    |      |      1 |      1 |            |          |      1 |00:00:00.64 |     256K|    256K|
|   2 |   TABLE ACCESS FULL| T    |      1 |    512K| 71094   (1)| 00:14:14 |    512K|00:00:00.61 |     256K|    256K|
----------------------------------------------------------------------------------------------------------------------

//實際上每次測試256K讀.而且執行計劃採用直接路徑讀,這樣資料讀取繞過了資料庫快取.

$ cat /tmp/nocache.txt
host cachedel /mnt/ramdisk/book/users01.dbf
select count(*) from t;

--//測試每次清除檔案系統快取的情況.
SCOTT@book> @  /tmp/nocache.txt
  COUNT(*)
----------
    512000
Elapsed: 00:00:03.72

--//執行多次,可以發現在沒有快取的情況下,執行需要3.7X秒.下面測試快取的情況:

$ cachestats /mnt/ramdisk/book/users01.dbf
/mnt/ramdisk/book/users01.dbf            pages in cache: 552970/554242 (99.8%)  [filesize=2216968.0K, pagesize=4K]

--//取消執行cachedel的情況
$ cat /tmp/cache.txt
--host cachedel /mnt/ramdisk/book/users01.dbf
select count(*) from t;

SCOTT@book> @ /tmp/cache.txt
  COUNT(*)
----------
    512000

Elapsed: 00:00:00.61
--//執行多次,可以發現在檔案系統快取的情況下,執行需要0.61秒. 我的磁碟很快,從這裡還是可以看出檔案系統快取對資料檔案大量讀
--//取的影響.

3.測試:(FILESYTEMIO_OPTIONS=DIRECTIO).
SCOTT@book> alter system set filesystemio_options=DIRECTIO scope=spfile;
System altered.

--//重啟資料庫略.

$ find /mnt/ramdisk/book/*.*  -exec cachedel {} \;
$ find /mnt/ramdisk/book/*.*  -exec cachestats {} \;           */
/mnt/ramdisk/book/control01.ctl          pages in cache: 0/2612 (0.0%)  [filesize=10448.0K, pagesize=4K]
/mnt/ramdisk/book/control02.ctl          pages in cache: 0/2612 (0.0%)  [filesize=10448.0K, pagesize=4K]
/mnt/ramdisk/book/example01.dbf          pages in cache: 0/88642 (0.0%)  [filesize=354568.0K, pagesize=4K]
/mnt/ramdisk/book/redo01.log             pages in cache: 0/12801 (0.0%)  [filesize=51200.5K, pagesize=4K]
/mnt/ramdisk/book/redo02.log             pages in cache: 0/12801 (0.0%)  [filesize=51200.5K, pagesize=4K]
/mnt/ramdisk/book/redo03.log             pages in cache: 0/12801 (0.0%)  [filesize=51200.5K, pagesize=4K]
/mnt/ramdisk/book/redostb01.log          pages in cache: 0/12801 (0.0%)  [filesize=51200.5K, pagesize=4K]
/mnt/ramdisk/book/redostb02.log          pages in cache: 0/12801 (0.0%)  [filesize=51200.5K, pagesize=4K]
/mnt/ramdisk/book/redostb03.log          pages in cache: 0/12801 (0.0%)  [filesize=51200.5K, pagesize=4K]
/mnt/ramdisk/book/redostb04.log          pages in cache: 0/12801 (0.0%)  [filesize=51200.5K, pagesize=4K]
/mnt/ramdisk/book/sysaux01.dbf           pages in cache: 0/240642 (0.0%)  [filesize=962568.0K, pagesize=4K]
/mnt/ramdisk/book/system01.dbf           pages in cache: 2/194562 (0.0%)  [filesize=778248.0K, pagesize=4K]
/mnt/ramdisk/book/tea01.dbf              pages in cache: 0/10242 (0.0%)  [filesize=40968.0K, pagesize=4K]
/mnt/ramdisk/book/temp01.dbf             pages in cache: 0/105986 (0.0%)  [filesize=423944.0K, pagesize=4K]
/mnt/ramdisk/book/undotbs01.dbf          pages in cache: 0/221442 (0.0%)  [filesize=885768.0K, pagesize=4K]
/mnt/ramdisk/book/users01.dbf            pages in cache: 8/554242 (0.0%)  [filesize=2216968.0K, pagesize=4K]
--//首先清除檔案系統快取.

SCOTT@book> @ /tmp/nocache.txt
  COUNT(*)
----------
    512000
Elapsed: 00:00:04.17

--//執行多次,可以發現在沒有快取的情況下,執行需要4.1X秒.而且每次執行完成,使用cachestats看:
$ cachestats /mnt/ramdisk/book/users01.dbf
/mnt/ramdisk/book/users01.dbf            pages in cache: 8/554242 (0.0%)  [filesize=2216968.0K, pagesize=4K]

--//這也是DIRECTIO的含義: enable direct I/O on file system files, which bypasses the buffer cache.

SCOTT@book> @ /tmp/cache.txt
  COUNT(*)
----------
    512000
Elapsed: 00:00:04.08

--//在檔案系統沒有快取的情況下,FILESYTEMIO_OPTIONS=DIRECTIO的情況下資料塊的訪問採用直接讀取資料檔案的方式.
--//如果FILESYTEMIO_OPTIONS=DIRECTIO情況資料檔案快取呢?

$ dd if=/mnt/ramdisk/book/users01.dbf of=/dev/zero bs=1024M ;
2+1 records in
2+1 records out
2270175232 bytes (2.3 GB) copied, 3.81141 seconds, 596 MB/s

$ cachestats /mnt/ramdisk/book/users01.dbf
/mnt/ramdisk/book/users01.dbf            pages in cache: 554242/554242 (100.0%)  [filesize=2216968.0K, pagesize=4K]

SCOTT@book> @ /tmp/cache.txt
  COUNT(*)
----------
    512000
Elapsed: 00:00:04.15

$ cachestats /mnt/ramdisk/book/users01.dbf
/mnt/ramdisk/book/users01.dbf            pages in cache: 554242/554242 (100.0%)  [filesize=2216968.0K, pagesize=4K]

--//執行多次,你可以發現並不會因為檔案系統快取而縮短執行時間.
--//換一種方式講如果你採用這樣方式FILESYTEMIO_OPTIONS=DIRECTIO,可以適當設定大一點sga*引數.

4.測試:(FILESYTEMIO_OPTIONS=ASYNCH).
--//ASYNCH: enable asynchronous I/O on file system files, which has no timing requirement for transmission.

SCOTT@book> alter system set filesystemio_options=ASYNCH scope=spfile;
System altered.

--//重啟資料庫略.
$ find /mnt/ramdisk/book/*.*  -exec cachedel {} \;
$ find /mnt/ramdisk/book/*.*  -exec cachestats {} \;           */
$ find /mnt/ramdisk/book/users01.dbf  -exec cachestats {} \;
/mnt/ramdisk/book/users01.dbf            pages in cache: 8/554242 (0.0%)  [filesize=2216968.0K, pagesize=4K]

alter session set statistics_level=all;
set timing on

SCOTT@book> @ /tmp/nocache.txt
COUNT(*)
----------
    512000
Elapsed: 00:00:03.52

$ find /mnt/ramdisk/book/users01.dbf  -exec cachestats {} \;
/mnt/ramdisk/book/users01.dbf            pages in cache: 553150/554242 (99.8%)  [filesize=2216968.0K, pagesize=4K]
--//可以發現執行後檔案系統會快取資料檔案.

SCOTT@book> @ /tmp/cache.txt
  COUNT(*)
----------
    512000
Elapsed: 00:00:00.67
--//再次執行快取的影響.

5.測試:(FILESYTEMIO_OPTIONS=SETALL).
--//SETALL: enable both asynchronous and direct I/O on file system files.
SCOTT@book> alter system set filesystemio_options=SETALL scope=spfile;
System altered.

--//重啟資料庫略.
$ find /mnt/ramdisk/book/*.*  -exec cachedel {} \;
$ find /mnt/ramdisk/book/*.*  -exec cachestats {} \;           */
find /mnt/ramdisk/book/users01.dbf  -exec cachestats {} \;
/mnt/ramdisk/book/users01.dbf            pages in cache: 0/554242 (0.0%)  [filesize=2216968.0K, pagesize=4K]

SCOTT@book> @ /tmp/nocache.txt
COUNT(*)
----------
    512000
Elapsed: 00:00:03.73

SCOTT@book> @ /tmp/cache.txt
  COUNT(*)
----------
    512000
Elapsed: 00:00:03.73

$  find /mnt/ramdisk/book/users01.dbf  -exec cachestats {} \;
/mnt/ramdisk/book/users01.dbf            pages in cache: 0/554242 (0.0%)  [filesize=2216968.0K, pagesize=4K]
--//可以發現執行後檔案系統不會快取資料檔案.

--//如果FILESYTEMIO_OPTIONS=SETALL情況資料檔案快取呢?
$ dd if=/mnt/ramdisk/book/users01.dbf of=/dev/zero bs=1024M ;
2+1 records in
2+1 records out
2270175232 bytes (2.3 GB) copied, 3.96247 seconds, 573 MB/s
$  find /mnt/ramdisk/book/users01.dbf  -exec cachestats {} \;
/mnt/ramdisk/book/users01.dbf            pages in cache: 554242/554242 (100.0%)  [filesize=2216968.0K, pagesize=4K]

SCOTT@book> @ /tmp/cache.txt
  COUNT(*)
----------
    512000

Elapsed: 00:00:03.76
--//執行多次,你可以發現並不會因為檔案系統快取而縮短執行時間.
--//換一種方式講如果你採用這樣方式FILESYTEMIO_OPTIONS=SETALL,可以適當設定大一點sga*引數.

6.畫一個表格並總結:
----------------------------------------------------
FILESYTEMIO_OPTIONS      nocache(秒)    cache(秒)
----------------------------------------------------
NONE                     3.62           0.61
DIRECTIO                 4.17           4.08
ASYNCH                   3.52           0.67
SETALL                   3.73           3.73
----------------------------------------------------

--//說明: 這裡的nocache與cache並不是指資料或者檔案系統是否快取,而是指執行前是否清除OS的檔案系統快取.

--//這表格看FILESYTEMIO_OPTIONS設定NONE,ASYNCH都不錯,nocache的情況下相差很小.對於大量讀盤操作都能從檔案快取中獲得好的性
--//能.但是以消耗OS記憶體為代價.
--//DIRECTIO相對較差.
--//SETALL居中.但是DIRECTIO,SETALL都不會建立檔案系統快取,如果採用這種模式,可以適當設定大一點SGA引數.

--//透過這個測試,很容易聯想到ASM,asm無法利用檔案系統快取,雖然採用非同步IO,我感覺估計效能更接近FILESYTEMIO_OPTIONS=SETALL選
--//項.也不要把ASM吹上天,實際上小資料系統使用檔案系統還是有優勢的,另外注意的問題就是檔案系統快取,它可能掩蓋IO存在的問題,
--//這點要特別注意.

--//推薦的設定FILESYTEMIO_OPTIONS=ASYNCH,實際上不設定問題也不大,從NONE與ASYNC在nocache的情況下差別很小.大約塊5%.
--//如果你磁碟IO很快的情況可以設定,FILESYTEMIO_OPTIONS=SETALL,而且因為這時不使用檔案系統快取,可以適當設定大的sga.

FILESYTEMIO_OPTIONS can be set to one of the following values:

ASYNCH: enable asynchronous I/O on file system files, which has no timing requirement for transmission.
        在檔案系統檔案上啟用非同步I/O,在資料傳送上沒有計時要求。
DIRECTIO: enable direct I/O on file system files, which bypasses the buffer cache.
        在檔案系統檔案上啟用直接I/O,繞過buffer cache。
SETALL: enable both asynchronous and direct I/O on file system files.
        在檔案系統檔案上啟用非同步和直接I/O。
NONE: disable both asynchronous and direct I/O on file system files.
      在檔案系統檔案上禁用非同步和直接I/O。

--補充一點:我以前遇到FILESYTEMIO_OPTIONS=SETALL,如果恢復的rman的檔案放在cifs恢復出問題.
--另外像我前面的使用記憶體ram盤做測試,也不能設定為DIRECTIO,SETALL(很久以前測試的,當時沒記錄)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2134041/,如需轉載,請註明出處,否則將追究法律責任。

相關文章