[20170220]快速拷貝檔案在linux磁碟之間

lfree發表於2017-02-20

[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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章