Jak ograniczyć I / O dysku podczas tworzenia kopii zapasowej?

14

Mam crona, który w zasadzie robi prostą „tar zcf” w nocy.

Serwer ma:

  • 8 rdzeni - procesor Intel (R) Xeon (E) E5606 @ 2,13 GHz
  • 25 GB pamięci RAM
  • Ubuntu 12.04.2 LTS
  • Sprzętowa macierz RAID 1 (LSI Logic / Symbios Logic MegaRAID SAS SMC2108) z dwoma dyskami twardymi o pojemności 2,728 TB

Jak widać na ekranie hosta monitorowania:

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

Przez prawie cały czas tar tar I / O przechodzi do> 90% i powoduje, że wszystkie inne aplikacje (mysql, apache) znacznie się spowalniają.

2 pytania:

  • Czy to normalne, że podczas tworzenia kopii zapasowej jest tak duża liczba operacji we / wy dysku?
  • Czy istnieje sposób ograniczenia wejścia / wyjścia płyty, aby inna aplikacja mogła nadal działać poprawnie?

Dziękuję Ci!

acemtp
źródło

Odpowiedzi:

11

Oprócz dość ogólnego podejścia z ioniceprzyjemnym celem mapowania urządzeń (ioband), który umożliwia precyzyjną kontrolę przepustowości dla urządzenia blokowego (DM). Niestety nie jest częścią standardowego jądra.

Ponadto prawdopodobnie możesz przyspieszyć tar

  1. Odczytywanie nazw plików do pamięci podręcznej dysku: find /source/path -printf ""
  2. Odczytywanie i-węzłów do pamięci podręcznej dysku: find /source/path -perm 777 -printf ""
  3. Sprawianie, by tar odczytywał i zapisywał większe bloki zi na dysk, np. Używając potoku z mbufferem lub buforem (z co najmniej 100 MB pamięci RAM): tar ... | mbuffer -m 256M -P 100 -p 1 ...
Hauke ​​Laging
źródło
Dlaczego wczytywanie nazw plików / i-węzłów do pamięci podręcznej zmniejsza IO dysku podczas tarowania? Spodziewałbym się, że zwiększy to średnie IO, jednocześnie nieznacznie skracając całkowity czas.
scai
3
@scai To nie pomaga w przypadku dysków SSD; moja rekomendacja odnosi się tylko do spinningowych dysków twardych. Tym, co zabija wydajność, jest ruch głowy. Nazwy plików są przechowywane w ciągłych blokach, i-węzły są przechowywane w ciągłych blokach, a zawartość pliku jest przechowywana w ciągłych blokach. Jeśli robisz to w sposób tar, to czytasz nazwy pliku (i podkatalogu) jednego katalogu, uzyskujesz dostęp do i-węzła dla jednego pliku, potem samego pliku, potem i-węzła dla następnego pliku, a następnie samego pliku ... powoduje większy ruch głowy niż czytanie wszystkich nazw i i-węzłów po sobie.
Hauke ​​Laging
@scai Wpływ na wydajność zależy od tego, co robisz. Jest raczej mały w przypadku pełnych kopii zapasowych (prawdopodobnie zależy od rozmiarów plików), ale zauważyłem dużą różnicę w przypadku różnicowych kopii zapasowych (nie dotyczy to jednak tar, ponieważ nie używam tego, ale powinien to być ogólny efekt).
Hauke ​​Laging
Tylko dla pewności, że zrozumiałem poprawnie. W przypadku 1. i 2. musimy tylko wywołać polecenie find, a Linux automatycznie je buforuje?
acemtp
@acemtp To prawda. findbez (np.) -permnie uzyska dostępu do i-węzła pliku. Ale pozwala to na optymalizację użycia dwóch findpołączeń. Jeśli wykonasz to samo findpołączenie dwa razy (z niewielkim czasem między nimi), drugie zwykle kończy się w ciągu kilku sekund (lub krócej). W zależności od ilości wolnej pamięci i ilości danych buforowanych w pewnym momencie dane są wyrzucane z pamięci podręcznej. Zbyt duże czytanie może więc po prostu spowolnić operację. Jeśli możesz nakarmić program do tworzenia kopii zapasowych nazwami plików przez stdin, możesz temu zapobiec, czytając bloki np. 100 plików.
Hauke ​​Laging
13

Oczekuje się, że podczas tworzenia kopii zapasowych zobaczysz wysoki poziom I / O, ponieważ są one generalnie tworzone na dużych drzewach plików z dużymi plikami. Można użyć ionicedo priorytetyzacji zadań we / wy w systemie Linux za pomocą klas i poziomów. IIRC, klasa 2, poziom 7 to najniższy, nie głodny poziom, który sprawi, że będzie praktycznie niewidoczny dla innych obciążeń I / O i użytkowników. Zobacz man ionicedla użycia i szczegółów.

bayindirh
źródło
1

Polecam porzucenie tar i skorzystanie z rsync (jak wspomniano w Dogsbody). Używam BackupPC do tworzenia kopii zapasowych plików w moich systemach Windows i Linux i obsługuje zarówno tar, jak i rsync i automatycznie dba o twarde linkowanie, a także zapewnia przyjemny interfejs sieciowy.

http://backuppc.sourceforge.net/

Atari911
źródło
0

Jak odpowiedzieli inni, tak, jest to normalne i ionicejest to dobry ogólny sposób, aby nie wpływać na twój system.

Wiele razy widziałem ludzi tar , kiedy nie musieli tego robić. Jeśli jakikolwiek procent danych, które kopiujesz, nie zmienił się od czasu ostatniej kopii, sugeruję rsyncwypróbowanie.

Spowoduje to zmniejszenie liczby operacji wejścia / wyjścia przez kopiowanie tylko plików, które zmieniły się od czasu ostatniej kopii. nie będziesz w stanie zmniejszyć IO o więcej niż połowę, ponieważ wszystkie dane nadal będą musiały zostać odczytane, ale znacznie zmniejszysz ilość zapisywanych danych (co w zależności od twojego sprzętu może być wolniejsze).

Jeśli chcesz mieć oddzielne kopie / kopie zapasowe za każdym razem, gdy jest uruchamiana, najpotężniejszą opcją jest –link-dest, która pozwala na stałe połączyć niezmienione pliki z poprzednią kopią zapasową. Oszczędza to OGROMNE ilości miejsca na serwerze kopii zapasowych. np. wykonuję kopię zapasową komputera (Fred), Fred ma 20 GB HD i wykonuję kopię zapasową / kopiuję cały dysk z wyłączeniem / proc i / dev. Mam teraz katalog 20 GB na moim serwerze kopii zapasowych. Następnego dnia wykonuję kopię zapasową Freda i - link-dest do wczorajszej kopii zapasowej. Rsync porównuje pliki zdalne z lokalną kopią i jeśli dokładnie to samo nie będzie kłopotać się z ich przesyłaniem, ale utrwali połączenie nowego pliku z plikiem wczorajszym. Wszystkie zmienione pliki są kopiowane na nowo (lub częściowo kopiowane przy użyciu wczorajszej kopii zapasowej, jeśli to możliwe). Jeśli tylko 100 MB plików zmieniło się od wczoraj, teraz mam dwa katalogi, oba z 20 GB plików, ale zajmujące tylko 20.

Mam nadzieję, że to pomoże i nadal odpowiada na twoje pytanie.

Dogsbody
źródło