Làm thế nào để giới hạn đĩa i / o trong quá trình sao lưu?


14

Tôi có một cron về cơ bản làm một "tar zcf" đơn giản trong đêm.

Máy chủ có:

  • 8 lõi - CPU Intel (R) Xeon (R) E5606 @ 2.13GHz
  • RAM 25GB
  • Ubuntu 12.04.2 LTS
  • Phần cứng RAID 1 (LSI Logic / Symbios Logic MegaRAID SAS SMC2108) với hai ổ cứng 2.728TB

Như bạn có thể thấy trên màn hình giám sát:

http://clip2net.com/s/57YRKP

Trong hầu hết thời gian của tar, I / O của đĩa đạt> 90% và làm cho tất cả các ứng dụng khác (mysql, apache) bị chậm đi rất nhiều.

2 câu hỏi:

  • Có bình thường khi có I / O đĩa quá cao trong quá trình sao lưu không?
  • Có cách nào để giới hạn I / O đĩa để ứng dụng khác có thể tiếp tục hoạt động chính xác không?

Cảm ơn bạn!

Câu trả lời:


11

Bên cạnh cách tiếp cận khá chung chung còn ionicecó một mục tiêu ánh xạ thiết bị (ioband) đẹp cho phép kiểm soát chính xác băng thông đến một thiết bị khối (DM). Thật không may, nó không phải là một phần của kernel tiêu chuẩn.

Hơn nữa, bạn có thể tăng tốc tar bằng cách

  1. Đọc tên tệp vào bộ đệm đĩa: find /source/path -printf ""
  2. Đọc các nút vào bộ đệm đĩa: find /source/path -perm 777 -printf ""
  3. Tạo tar đọc và ghi các khối lớn hơn từ và vào đĩa bằng cách sử dụng một đường ống có mbuffer hoặc bộ đệm (với ít nhất 100 MiB RAM): tar ... | mbuffer -m 256M -P 100 -p 1 ...

Tại sao việc đọc tên / inodes vào bộ đệm lại làm giảm IO đĩa trong khi tar? Tôi hy vọng nó sẽ tăng IO trung bình trong khi giảm tổng thời gian chỉ một chút.
scai

3
@scai Điều này không giúp ích gì cho SSD; đề nghị của tôi đề cập đến chỉ harddisks quay. Những gì giết chết hiệu suất với những người là phong trào đầu. Tên tệp được lưu trữ trong các khối liên tục, các nút được lưu trữ trong các khối liên tục và nội dung tệp được lưu trữ trong các khối liên tục. Nếu bạn thực hiện theo cách tar thì bạn đọc tên tệp (và thư mục con) của một thư mục, truy cập vào nút cho một tệp, sau đó là tệp, sau đó là nút cho tệp tiếp theo, rồi tệp tiếp theo ... gây ra chuyển động đầu nhiều hơn đọc tất cả các tên và inodes nhau.
Hauke ​​Laging

@scai Tác động hiệu suất phụ thuộc vào những gì bạn làm. Nó khá nhỏ đối với các bản sao lưu đầy đủ (có thể phụ thuộc vào kích thước tệp) nhưng tôi nhận thấy một sự khác biệt lớn đối với các bản sao lưu vi sai (mặc dù không phải vì tar, vì tôi không sử dụng nhưng đây sẽ là một hiệu ứng chung).
Hauke ​​Laging

Chỉ để chắc chắn tôi hiểu chính xác. Đối với 1. và 2., chúng ta chỉ cần gọi lệnh find và Linux sẽ tự động lưu trữ nó?
acemtp

@acemtp Đúng vậy. mặc dù findkhông có (ví dụ) -permsẽ không truy cập vào tệp inode. Nhưng điều đó cho phép tối ưu hóa để sử dụng hai findcuộc gọi. Nếu bạn thực hiện cùng một findcuộc gọi hai lần (với ít thời gian ở giữa), cuộc gọi thứ hai thường sẽ kết thúc trong vòng vài giây (hoặc ít hơn). Tùy thuộc vào dung lượng bộ nhớ trống và lượng dữ liệu được lưu trong bộ nhớ cache tại một thời điểm nhất định, dữ liệu sẽ bị xóa khỏi bộ đệm. Đọc quá nhiều có thể chỉ làm chậm hoạt động. Nếu bạn có thể cung cấp chương trình sao lưu với tên tệp qua stdin thì bạn có thể ngăn chặn điều này bằng cách đọc các khối ví dụ 100 tệp.
Hauke ​​Laging

13

Dự kiến ​​sẽ thấy I / O cao trong quá trình sao lưu vì chúng thường được tạo trên các cây tệp lớn với các tệp lớn. Bạn có thể sử dụng ioniceđể ưu tiên các công việc I / O trong Linux với các lớp và cấp độ. IIRC, lớp 2, cấp 7 là mức thấp nhất, không bị đói sẽ khiến nó thực sự vô hình đối với các tải và người dùng khác. Xem man ioniceđể sử dụng và chi tiết.


1

Tôi sẽ khuyên bạn nên bỏ tar và đi với rsync (như được đề cập bởi Dogsbody). Tôi sử dụng BackupPC để sao lưu các tệp trên hệ thống Windows và Linux của mình và nó hỗ trợ sử dụng tar cũng như rsync và tự động chăm sóc liên kết cứng cho bạn cũng như cung cấp giao diện web đẹp.

http://backuppc.sourceforge.net/


0

Như những người khác đã trả lời, vâng, điều này là bình thường và ionicelà một cách chung chung không để nó ảnh hưởng đến hệ thống của bạn.

Một số lần tôi đã thấy mọi người làm mọi tarthứ khi họ không cần. Nếu bất kỳ tỷ lệ phần trăm dữ liệu bạn đang sao chép không thay đổi kể từ lần sao chép cuối cùng thì tôi khuyên bạn rsyncnên thử.

Điều này sẽ giảm IO bằng cách chỉ sao chép các tệp đã thay đổi kể từ lần sao chép trước. bạn sẽ không thể giảm IO hơn một nửa vì tất cả dữ liệu vẫn cần phải đọc nhưng bạn sẽ giảm đáng kể lượng dữ liệu được ghi (tùy thuộc vào phần cứng của bạn cũng có thể hoạt động chậm hơn).

Nếu bạn muốn sao chép / sao lưu riêng biệt mỗi lần nó chạy thì tùy chọn mạnh nhất là siêu liên kết cho phép bạn liên kết cứng các tệp không thay đổi với bản sao lưu trước đó. Điều này giúp tiết kiệm dung lượng lớn trên máy chủ dự phòng. ví dụ: tôi sao lưu máy (Fred), Fred có 20GB HD và tôi sao lưu / sao chép toàn bộ ổ đĩa không bao gồm / Proc và / dev. Bây giờ tôi có một thư mục 20 GB trên máy chủ sao lưu của mình. Ngày hôm sau tôi sao lưu Fred một lần nữa và saolinklink-Dest để sao lưu vào thứ năm. Rsync so sánh các tệp từ xa với bản sao cục bộ và nếu chính xác như vậy sẽ không làm phiền việc chuyển chúng nhưng sẽ liên kết cứng tệp mới với tệp hôm nay. Bất kỳ tệp nào đã thay đổi đều được sao chép xuống một bản sao mới (hoặc được sao chép một phần bằng cách sử dụng bản sao lưu thứ năm nếu có thể). Nếu chỉ có 100 MB tệp thay đổi kể từ ngày hôm qua, thì bây giờ tôi có hai thư mục với 20GB tệp nhưng chỉ chiếm 20.

Tôi hy vọng điều đó sẽ giúp và vẫn trả lời câu hỏi của bạn.

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.