Di chuyển 2TB (10 triệu tệp + thư mục), nút cổ chai của tôi là gì?


21

Lý lịch

Tôi chạy ra khỏi không gian trên /home/datavà cần phải chuyển /home/data/repođến /home/data2.

/home/data/repochứa 1M thư mục, mỗi thư mục chứa 11 thư mục và 10 tệp. Tổng cộng là 2TB.

/home/datalà trên ext3 với dir_index được kích hoạt. /home/data2là trên ext4. Chạy CentOS 6.4.

Tôi cho rằng các phương pháp này chậm vì thực tế repo/có 1 triệu thư trực tiếp bên dưới nó.


Nỗ lực 1: mvnhanh nhưng bị gián đoạn

Tôi có thể được thực hiện nếu điều này đã kết thúc:

/home/data> mv repo ../data2

Nhưng nó đã bị gián đoạn sau khi 1,5TB được chuyển. Nó được viết với tốc độ khoảng 1GB / phút.

Cố gắng 2: rsyncthu thập thông tin sau 8 giờ xây dựng danh sách tệp

/home/data> rsync --ignore-existing -rv repo ../data2

Phải mất vài giờ để xây dựng 'danh sách tệp gia tăng' và sau đó nó chuyển với tốc độ 100MB / phút.

Tôi hủy bỏ nó để thử một cách tiếp cận nhanh hơn.

Cố gắng 3a: mvphàn nàn

Kiểm tra nó trên thư mục con:

/home/data/repo> mv -f foobar ../../data2/repo/
mv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory

Tôi không chắc đây là lỗi gì, nhưng có lẽ cptôi có thể bảo lãnh cho tôi ..

Nỗ lực 3b: cpkhông nơi nào sau 8 giờ

/home/data> cp -nr repo ../data2

Nó đọc đĩa trong 8 giờ và tôi quyết định hủy nó và quay lại rsync.

Cố gắng 4: rsyncthu thập thông tin sau 8 giờ xây dựng danh sách tệp

/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2

Tôi đã từng --remove-source-filesnghĩ nó có thể làm cho nó nhanh hơn nếu tôi bắt đầu dọn dẹp ngay bây giờ.

Phải mất ít nhất 6 giờ để xây dựng danh sách tệp sau đó nó chuyển với tốc độ 100-200MB / phút.

Nhưng máy chủ đã bị gánh nặng qua đêm và kết nối của tôi đóng lại.

Nỗ lực 5: CHỈ CÓ 300 GB TRÁCH NHIỆM ĐỂ CHUYỂN ĐỔI TẠI SAO NÀY LÀ RẤT NHIỀU

/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2

Bị gián đoạn một lần nữa. Việc -Wgần như dường như làm cho "gửi danh sách tập tin gia tăng" nhanh hơn, theo tôi hiểu không nên có ý nghĩa. Bất kể, việc chuyển tiền diễn ra chậm khủng khiếp và tôi đang từ bỏ việc này.

Cố gắng 6: tar

/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)

Về cơ bản cố gắng sao chép lại mọi thứ nhưng bỏ qua các tệp hiện có. Nó phải lội qua 1.7TB tệp hiện có nhưng ít nhất là nó đọc với tốc độ 1,2 GB / phút.

Cho đến nay, đây là lệnh duy nhất mang lại sự hài lòng tức thì.

Cập nhật: bị gián đoạn một lần nữa, bằng cách nào đó, ngay cả với nohup ..

Nỗ lực 7: harakiri

Vẫn đang tranh luận cái này

Nỗ lực 8: kịch bản 'hợp nhất' với mv

Các dir đích có khoảng 120k dir trống, vì vậy tôi đã chạy

/home/data2/repo> find . -type d -empty -exec rmdir {} \;

Kịch bản Ruby:

SRC  = "/home/data/repo"
DEST = "/home/data2/repo"

`ls #{SRC}  --color=never > lst1.tmp`
`ls #{DEST} --color=never > lst2.tmp`
`diff lst1.tmp lst2.tmp | grep '<' > /home/data/missing.tmp`

t = `cat /home/data/missing.tmp | wc -l`.to_i
puts "Todo: #{t}"

# Manually `mv` each missing directory
File.open('missing.tmp').each do |line|
  dir = line.strip.gsub('< ', '')
  puts `mv #{SRC}/#{dir} #{DEST}/`
end

LÀM XONG.


Bạn đã đúng, nó phải tìm và liệt kê mỗi thư mục và 1 triệu thư sẽ trở nên đau đớn.
gian mạng

2
Nhìn vào mặt tươi sáng ... nếu đó là Windows, bạn thậm chí không thể có một triệu thư mục con và vẫn có một hệ điều hành hoạt động. :)
Jack

1
@Tim, tại sao bạn không mvmột lần nữa? Về lý thuyết mvsẽ chỉ xóa một tập tin nguồn nếu file đích đã được hoàn toàn sao chép vì thế nên làm việc OK. Ngoài ra, bạn có quyền truy cập vật lý vào máy hay việc này được thực hiện thông qua sshkết nối?
terdon

5
Không, nó không thể. mvkhông tha thứ, nếu bạn tiếp tục bị ngắt kết nối, bạn có thể mất dữ liệu và thậm chí không biết điều đó. Như bạn nói bạn đang làm điều này hơn ssh, tôi khuyên bạn nên sử dụng screenvà tách ra. Cho phép đăng nhập và theo dõi theo cách đó. Nếu bạn đang sử dụng verbose, nó sẽ mất nhiều thời gian hơn. Cũng cố gắngiotop
justbrowsing

2
@justbrowsing - Gọi tốt screen. Tôi đã tự hỏi về verbose nhưng tôi đoán bây giờ đã quá muộn để khởi động lại tar. Và iotopđã là tiện ích yêu thích của tôi trong vài ngày qua :)
Tim

Câu trả lời:


6

Bạn đã bao giờ nghe nói về việc chia các nhiệm vụ lớn thành các nhiệm vụ nhỏ hơn chưa?

/ home / data / repo chứa 1M dir, mỗi tệp chứa 11 dir và 10 tệp. Tổng cộng là 2TB.

rsync -a /source/1/ /destination/1/
rsync -a /source/2/ /destination/2/
rsync -a /source/3/ /destination/3/
rsync -a /source/4/ /destination/4/
rsync -a /source/5/ /destination/5/
rsync -a /source/6/ /destination/6/
rsync -a /source/7/ /destination/7/
rsync -a /source/8/ /destination/8/
rsync -a /source/9/ /destination/9/
rsync -a /source/10/ /destination/10/
rsync -a /source/11/ /destination/11/

(...)

Giờ giải lao cà phê.


1
Lợi ích tôi mơ hồ nhấn mạnh là bạn theo dõi tiến trình trong các phần nhỏ theo cách thủ công để tiếp tục thực hiện nhiệm vụ sẽ mất ít thời gian hơn nếu một phần bị hủy bỏ (vì bạn biết bước nào đã được hoàn thành thành công).
Ярослав Рахматуллин

Đây là cơ bản những gì tôi đã làm cuối cùng, ngoại trừ với mv. Đáng tiếc là không có cuộc họp công cụ mvrsyncnửa chừng.
Tim

4

Đây là những gì đang xảy ra:

  • Ban đầu rsync sẽ xây dựng danh sách các tập tin.
  • Xây dựng danh sách này là rất chậm, do sắp xếp ban đầu của danh sách tập tin.
  • Điều này có thể tránh được bằng cách sử dụng ls -f -1 và kết hợp nó với xargs để xây dựng tập hợp các tệp mà rsync sẽ sử dụng hoặc chuyển hướng đầu ra sang một tệp có danh sách tệp.
  • Chuyển danh sách này sang rsync thay vì thư mục, sẽ khiến rsync bắt đầu hoạt động ngay lập tức.
  • Thủ thuật này của ls -f -1 trên các thư mục có hàng triệu tệp được mô tả hoàn hảo trong bài viết này: http://unixetc.co.uk/2012/05/20/large-directory-causes-ls-to-hang/

1
Bạn có thể cho một ví dụ về cách sử dụng ls với rsync không? Tôi có một tình huống tương tự nhưng không giống nhau. Trên máy AI có rsyncd đang chạy và một cây thư mục lớn tôi muốn chuyển sang máy B (thực ra, 90% thư mục đã ở B). Vấn đề là tôi phải làm điều này bằng cách sử dụng kết nối di động không ổn định thường xuyên bị rớt. Dành một giờ để xây dựng danh sách tập tin mỗi khi tôi khởi động lại là không hiệu quả. Ngoài ra, B đứng sau NAT mà tôi không kiểm soát nên khó kết nối A -> B, trong khi B -> A thì dễ.
db

Đồng ý với @db. Nếu một ví dụ có thể được đưa ra, điều đó sẽ làm cho câu trả lời này hữu ích hơn nhiều.
redfox05

1

Ngay cả khi rsync chậm (tại sao nó chậm? Có lẽ -z sẽ giúp) có vẻ như bạn đã chuyển nó đi rất nhiều, vì vậy bạn có thể tiếp tục thử:

Nếu bạn đã sử dụng --remove-source-files, thì bạn có thể theo dõi bằng cách xóa các thư mục trống. --remove-source-files sẽ xóa tất cả các tệp, nhưng sẽ để các thư mục ở đó.

Chỉ cần đảm bảo rằng bạn KHÔNG sử dụng --remove-source-files với --delete để thực hiện nhiều lần.

Ngoài ra để tăng tốc độ bạn có thể sử dụng - tại chỗ

Nếu bạn bị đuổi vì bạn đang cố gắng thực hiện việc này từ xa trên máy chủ, hãy tiếp tục và chạy nó trong phiên 'màn hình'. Ít nhất theo cách đó bạn có thể để nó chạy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.