[20170220]快速拷貝檔案在linux磁碟之間
[20170220]快速拷貝檔案在linux磁碟之間.txt
--上個星期五要將1.3T的檔案(每個都很大)從1個磁碟移到另外的磁碟,測試發現cp 根本無法忍受.幾乎要8個小時問題感覺出在檔案系統
--的cache上,google看了一些連線:
1.首先cp慢的主要原因我感覺應該出現在檔案系統快取上,這個時候使用快取沒有必要,因為僅僅拷貝一次,使用快取有點多餘.
如果通過dstat觀察可以發現如下,開始一段很好,讀寫可以達到200M,寫入更快到400M.但是一般15秒上下就停滯下來.等待4x秒,
有開始加快.
通過free觀察free記憶體越來越少.最後基本保持不動.
2.我看了許多這方面的文件:
--//一個最簡單的方法就是dd 在引數iflag=direct,oflag=direct引數,繞過快取,但是這樣的缺點就是要程式設計,實際上也不是很麻煩.
--//注有一些文件提供nocache引數:
http://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html
'nocache'
Request to discard the system data cache for a file. When count=0 all cached data for the file is specified, otherwise
the cache is dropped for the processed portion of the file. Also when count=0, failure to discard the cache is diagnosed
and reflected in the exit status.
Note data that is not already persisted to storage will not be discarded from cache, so note the use of the "sync"
options in the examples below, which are used to maximize the effectiveness of the 'nocache' flag.
Here are some usage examples:
# Advise to drop cache for whole file
dd if=ifile iflag=nocache count=0
# Ensure drop cache for the whole file
dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
# Drop cache for part of file
dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
# Stream data using just the read-ahead cache.
# See also the 'direct' flag.
dd if=ifile of=ofile iflag=nocache oflag=nocache,sync
--//不過我使用的dd版本沒有nocache引數.
--//在google的過程中,發現這個連結https://github.com/Feh/nocache:
nocache - minimize filesystem caching effects
The nocache tool tries to minimize the effect an application has on the Linux file system cache. This is done by
intercepting the open and close system calls and calling posix_fadvise with the POSIX_FADV_DONTNEED parameter. Because
the library remembers which pages (ie., 4K-blocks of the file) were already in file system cache when the file was
opened, these will not be marked as "don't need", because other applications might need that, although they are not
actively used (think: hot standby).
Use case: backup processes that should not interfere with the present state of the cache.
--//決定在自己的測試環境先測試看看.而且debian已經整合了這個包,感覺應該很可靠.
3.下載安裝很簡單,就是一般安裝的3步曲:
解壓=>make=>make install ( 注有一些要先執行./configure,這裡不需要.)
4.測試:
--首先清除該檔案快取
# cachedel datafile/system01.bdf
# cachedel /u01/system01.bdf
# time /bin/cp system01.bdf /u01/system01.bdf
real 0m51.536s
user 0m0.272s
sys 0m18.136s
# cachestats datafile/system01.bdf
pages in cache: 1024002/1024002 (100.0%) [filesize=4096008.0K, pagesize=4K]
--//可以發現拷貝的檔案快取100%,備份出來的檔案也一樣. 大約4096/52=78M/秒.
--完成後free的顯示:
# free
total used free shared buffers cached
Mem: 132261196 131797060 464136 0 591348 123554608
-/+ buffers/cache: 7651104 124610092
Swap: 31455264 780220 30675044
--//可以發現free記憶體剩餘很小.如果你再重複上面的命令/bin/cp system01.bdf /u01/system01.bdf,可以發現飛快,因為檔案已經緩
--//存了.
5.測試使用nocache:
# cachedel datafile/system01.bdf
# cachedel /u01/system01.bdf
# time nocache /bin/cp system01.bdf /u01/system01.bdf
real 0m50.444s
user 0m0.217s
sys 0m18.698s
--//時間相差不大.對比上面,因為檔案沒有快取.
--//在拷貝的過程中執行:
# cachestats datafile/system01.bdf
pages in cache: 172291/1024002 (16.8%) [filesize=4096008.0K, pagesize=4K]
# cachestats datafile/system01.bdf
pages in cache: 190499/1024002 (18.6%) [filesize=4096008.0K, pagesize=4K]
....
# cachestats datafile/system01.bdf
pages in cache: 340483/1024002 (33.3%) [filesize=4096008.0K, pagesize=4K]
# cachestats datafile/system01.bdf
pages in cache: 365411/1024002 (35.7%) [filesize=4096008.0K, pagesize=4K]
...
# cachestats datafile/system01.bdf
pages in cache: 24/1024002 (0.0%) [filesize=4096008.0K, pagesize=4K]
--//可以發現cache不斷增加,到結束時清除cache.觀察備份的檔案也一樣.
--//也可以看出nocache的作用實際上就是結束後清除快取.
# cachestats /u01/system01.bdf
pages in cache: 6/1024002 (0.0%) [filesize=4096008.0K, pagesize=4K]
--完成後free的顯示:
# free
total used free shared buffers cached
Mem: 132261196 121362884 10898312 0 597632 113115280
-/+ buffers/cache: 7649972 124611224
Swap: 31455264 780220 30675044
--//可以發現free依舊保持很多記憶體.
6.最好測試使用dd看看:
# cachedel datafile/system01.bdf
# cachedel /u01/system01.bdf
--//注有些訪問提到iflag=nocache oflag=nocache引數,我這個版本不支援這個引數.感覺好像使用這個引數會快一些.
# time dd if=system01.bdf of=/u01/system01.bdf bs=1024M iflag=direct oflag=direct
3+1 records in
3+1 records out
4194312192 bytes (4.2 GB) copied, 80.2868 seconds, 52.2 MB/s
real 1m20.603s
user 0m0.000s
sys 1m2.941s
--//這個有一點慢.
# cachestats /u01/system01.bdf
pages in cache: 0/1024002 (0.0%) [filesize=4096008.0K, pagesize=4K]
# cachestats datafile/system01.bdf
pages in cache: 18/1024002 (0.0%) [filesize=4096008.0K, pagesize=4K]
--//可以發現沒有快取.
# free
total used free shared buffers cached
Mem: 132261196 120296788 11964408 0 586588 112113960
-/+ buffers/cache: 7596240 124664956
Swap: 31455264 786416 30668848
7.一些補充:
--//googel還可以發現rsync有引數,好像官方的版本不支援這個引數.
--drop-cache that works local
--remote-drop-cache that works on remote
--//網上也可以找到tar的方式,我的測試效果一樣,檔案也會快取.
# tar cf - . | ( cd dest ; tar xvf - )
# tar cf - datafile | tar xvf - -C /mnt
8.再補充網路拷貝:
--我一般藉助tar+ssh+pigz模式,例子:
#tar cf - oracle -I pigz | ssh oracle@ip_address tar xvf - -I pigz -C /u01/app/
--//如果不支援-I引數,使用--use-compress-program ,pigz要另外安裝,另外有文章提高lz4壓縮工具,有機會另行測試.
--//感覺這個使用nocache也可以獲得好的效果,不再測試,有機會再測試吧^_^.
--//相關討論:
http://intermediatesql.com/linux/scrap-the-scp-how-to-copy-data-fast-using-pigz-and-nc/
http://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html
後記:最後確定是儲存設定有問題,以交給同事解決,具體細節以後有機會寫出來.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2133939/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在不同主機的ASM之間拷貝檔案ASM
- 使用RMAN在ASM和檔案系統之間拷貝資料ASM
- [java IO流]之檔案拷貝Java
- linux 帶路徑拷貝檔案Linux
- IOCP 檔案拷貝
- linux parallel rsync 拷貝N多檔案LinuxParallel
- 11g中節點間拷貝檔案
- IO流-檔案拷貝
- 檔案內容拷貝
- Java IO 流之拷貝(複製)檔案Java
- 在ASM磁碟組之間移動檔案ASM
- 在Linux下ssh 環境的登入 和 檔案拷貝Linux
- linux採用scp命令拷貝檔案到本地,拷貝本地檔案到遠端伺服器Linux伺服器
- Golang命令列拷貝檔案Golang命令列
- asm拷貝檔案到檔案系統ASM
- Linux使用expect實現遠端拷貝檔案Linux
- jquery之物件拷貝深拷貝淺拷貝案例講解jQuery物件
- JavaScript之深拷貝和淺拷貝JavaScript
- js之淺拷貝和深拷貝JS
- React之淺拷貝與深拷貝React
- c語言拷貝檔案程式C語言
- Python基礎 - 檔案拷貝Python
- 二進位制檔案拷貝
- 間歇性筆記——淺拷貝與深拷貝筆記
- 檔案操作(二進位制拷貝)
- 使用expect指令碼SCP拷貝檔案指令碼
- 類庫間無專案引用時,在編譯時拷貝DLL編譯
- 資料檔案拷貝檔案頭驗證錯誤
- 定時拷貝加時間維的檔案和定時刪除過期檔案
- 零拷貝讀取檔案成 Go 物件Go物件
- 使用UltraEdit 拷貝二進位制檔案
- linux下拷貝命令中的檔案過濾操作記錄Linux
- 在js中如何區分深拷貝與淺拷貝?JS
- Linux 拷貝命令之高階拷貝scp命令詳解Linux
- Linux 下拷貝目錄及打包壓縮拷貝Linux
- 使用rman在oracle ASM磁碟組之間移動資料檔案OracleASM
- python深拷貝和淺拷貝之簡單分析Python
- IOS學習之淺析深拷貝與淺拷貝iOS