[20170221]資料檔案與檔案系統快取.txt
[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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ASM與檔案系統之間copy資料檔案--檔案系統到ASMASM
- 系統快取全解析5:檔案快取依賴快取
- 快取依賴(檔案、資料庫)快取資料庫
- 如何清理Mac系統中殘留的檔案和快取檔案Mac快取
- SQL Server資料庫檔案與Windows系統透明檔案壓縮SQLServer資料庫Windows
- php如何上傳txt檔案,並且讀取txt檔案PHP
- 移動資料檔案從ASM到檔案系統ASM
- 如何遷移ASM資料檔案到檔案系統ASM
- spark直接讀取本地檔案系統的檔案Spark
- win10系統如何更改系統快取檔案路徑Win10快取
- python實現圖書管理系統——通過excel檔案或者TXT檔案存放資料PythonExcel
- Ext2檔案系統佈局,檔案資料塊定址,VFS虛擬檔案系統
- 檔案與資料
- 第十四篇:獲取系統資料檔案資訊
- 20170224測試資料庫塊在檔案系統快取多少資料庫快取
- 檔案和檔案系統
- 檔案系統與資料庫的優缺點資料庫
- win10怎麼清理垃圾與快取_win10清理系統垃圾與快取檔案步驟Win10快取
- Laravel 路由快取檔案清理Laravel路由快取
- FileProvider共享檔案、快取IDE快取
- nginx靜態檔案快取Nginx快取
- linux系統程式設計之檔案與IO(五):stat()系統呼叫獲取檔案資訊Linux程式設計
- 把檔案系統的資料檔案遷移到ASM儲存ASM
- 讀取資料夾檔案
- 移動資料檔案、系統表空間檔案、臨時表空間檔案
- 分散式檔案系統(HDFS)與 linux系統檔案系統 對比分散式Linux
- 查詢系統主要檔案路徑 如IE快取等快取
- 開源大資料檔案系統大資料
- [20210429]檔案頭塊不會快取.txt快取
- 在歸檔下恢復系統資料檔案
- openfiledialog 使用 讀取txt檔案 StreamReader 檢驗資料
- 磁碟管理與檔案系統
- [20160329]表空間與資料檔案.txt
- 移動資料檔案從檔案系統到ASM磁碟組中ASM
- 利用rman遷移裸裝置資料檔案到檔案系統
- 帝國CMS系統資料庫配置檔案是哪個檔案?資料庫
- Javascript寫入txt和讀取txt檔案示例JavaScript
- 根檔案系統簡介與BusyBox構建根檔案系統