web-dev-qa-db-ja.com

Ubuntuサーバーでtarが遅い

2つのサーバー(インターネットのSSH経由でアクセス)があり、1つにハイエンドCPUと32GB RAMが搭載されています。ただし、コマンドを使用して多数のファイル(約400,000)をtarしようとすると:

tar cvf archive.tar folder

約2時間かかります。私のコンピューターで同じコマンドを実行すると、仕様は似ていますがRAMが少ないので、ファイルの同様のバッチをtarするのに約5分かかります。

誰にもアイデアや選択肢がありますか?コマンドラインは、すべてのファイルのリストを出力します。これが問題を引き起こすかどうかはわかりません。

2
Kohjah Breese

ディスクの断片化。大きなファイルの場合、filefragを使用して個々のファイルがどのように断片化されているかを確認できますが、多くの小さなファイルで発生する傾向がある別の種類の断片化があります:ディレクトリに表示される名前の順序はiノードがディスクに表示される順序とはまったく異なり、その順序はディスク上のデータブロックの順序とはまったく異なる場合があります。つまり、ディレクトリに名前が表示される順序ですべてのファイルを開くと、ディスクは多くのシークを行わなければならず、速度が低下します。次のpythonスクリプトを一度書いて、名前、inode、および現在のディレクトリ内のすべてのファイルの最初のデータブロック間の相関を計算して、これを測定できるようにします。

#!/usr/bin/python

import os
from stat import *
import fcntl
import array

names = os.listdir('.')
lastino = 0
name_to_ino_in = 0
name_to_ino_out = 0
lastblock = 0
name_to_block_in = 0
name_to_block_out = 0
iblocks = list()
inode_to_block_in = 0
inode_to_block_out = 0

for file in names :
    try :
        st = os.stat(file)
    except OSError:
        continue
    if not S_ISREG(st.st_mode) :
        continue
    if st.st_ino > lastino :
        name_to_ino_in += 1
    else : name_to_ino_out += 1
    lastino = st.st_ino    
    f = open(file)
    buf = array.array('I', [0])
    err = fcntl.ioctl(f.fileno(), 1, buf)
    if err != 0 :
        print "ioctl failed on " + f
    block = buf[0]
    if block != 0 :
        if block > lastblock :
            name_to_block_in += 1
        else : name_to_block_out += 1
        lastblock = block
        iblocks.append((st.st_ino,block))
print "Name to inode correlation: " + str(float(name_to_ino_in) / float((name_to_ino_in + name_to_ino_out)))
print "Name to block correlation: " + str(float(name_to_block_in) / float((name_to_block_in + name_to_block_out)))
iblocks.sort()
lastblock = 0
for i in iblocks:
    if i[1] > lastblock:
        inode_to_block_in += 1
    else: inode_to_block_out += 1
    lastblock = i[1]
print "Inode to block correlation: " + str(float(inode_to_block_in) / float((inode_to_block_in + inode_to_block_out)))

長い時間にわたって多くの小さなファイルが追加された古いファイルシステムは、悪い形になる傾向があります。単にディレクトリ全体をコピーすると、コピー先がはるかに良くなる場合があります。その後、元のファイルを削除して、コピーで置き換えることができます。これに寄与する2番目の問題は、ext4のhtreeインデックスディレクトリ機能です。この機能は、個々のファイル名をはるかに高速に検索するために多くのファイルが含まれるディレクトリで使用されますが、基本的に名前の順序を完全にランダム化します。ディレクトリがlsattr -dでhtreeを使用しているかどうかを確認し、I属性を探します。

dumpの代わりにtarを使用してバックアップすることを好む理由の1つは、名前の表示順序に関係なくすべてのファイルをinode順序で読み取るため、この問題の影響を受けないことです。ディレクトリ。ただし、断片化をブロックするには、iノードと競合する必要があります。 e2defragのコピーまたはパスがそれを助けます。

3
psusi