Czy mogę szybciej kopiować duże pliki bez użycia pamięci podręcznej plików?

19

Po dodaniu preloadpakietu moje aplikacje wydają się przyspieszać, ale jeśli skopiuję duży plik, pamięć podręczna pliku powiększy się ponad dwukrotnie.

Po przeniesieniu jednego obrazu wirtualnego pudełka lub pliku wideo o pojemności 3-4 GB na dysk zewnętrzny ta ogromna pamięć podręczna wydaje się usuwać wszystkie wstępnie załadowane aplikacje z pamięci, co prowadzi do wydłużenia czasu ładowania i ogólnego spadku wydajności.

Czy istnieje sposób kopiowania dużych, wielobajtowych plików bez buforowania ich (tj. Z pominięciem pamięci podręcznej plików)? A może sposób na buforowanie określonych folderów na białej liście lub czarnej liście?

Veazer
źródło

Odpowiedzi:

19

Istnieje nocachenarzędzie, które może być poprzedzone poleceniem takim jak ionicei nice. Działa poprzez wstępne ładowanie biblioteki, która dodaje posix_fadvisez POSIX_FADV_DONTNEEDflagą do wszystkich otwartych połączeń.

Mówiąc najprościej, informuje jądro, że buforowanie nie jest potrzebne dla tego konkretnego pliku; jądro zwykle nie buforuje pliku. Zobacz tutaj szczegóły techniczne.

Robi cuda w przypadku wszelkich dużych zadań kopiowania, np. Jeśli chcesz wykonać kopię zapasową dysku o pojemności wielu terabajtów w tle przy minimalnym możliwym wpływie na działający system, możesz coś zrobić razem nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Pakiet będzie dostępny w wersji Ubuntu 13.10 i nowszych. Jeśli korzystasz z poprzedniej wersji, możesz zainstalować pakiet 13.10 lub wybrać ten backport 12.04 autorstwa François Mariera.

Gunther Piez
źródło
Miałem nadzieję na coś, co można zrobić za pomocą GUI, a także sposób, aby po prostu umieścić na czarnej liście foldery „bez pamięci podręcznej”, ale na razie to będzie musiało wystarczyć.
Veazer
12

Dla pojedynczych dużych plików, korzystanie ddz bezpośrednim I / O obejście bufora pliku:

Jeśli chcesz przenieść jeden (lub kilka) dużych plików o pojemności wielu gigabajtów, możesz to łatwo zrobić z dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • Te directflagi powiedzieć ddużyć bezpośredniego opcję I / O (jądra O_DIRECT) podczas czytania i pisania, a tym samym całkowicie z pominięciem pamięci podręcznej plików.
  • bsOpcja blocksize musi być ustawiona na stosunkowo dużą wartość, ponieważ w celu zminimalizowania liczby fizycznych operacji dyskowych ddmusi wykonać, ponieważ odczytu / zapisu nie są już buforowane i zbyt wiele małych bezpośrednie operacje mogą spowodować poważne spowolnienie.
    • Możesz eksperymentować z wartościami od 1 do 32 MB; powyższe ustawienie wynosi 4 MB ( 4M).

Niestety w przypadku wielu / rekurencyjnych kopii katalogu nie ma łatwo dostępnych narzędzi; zwykłe cpitp. nie obsługują bezpośredniego wejścia / wyjścia.

/ e iflag i oflag zmieniono na poprawne iflag i oflag

ish
źródło
1
Rekurencyjne można zrobić z zsh„s **operatora. zshmusi być zainstalowany ręcznie z repozytoriów.
Przywróć Monikę - ζ--
1
Właściwie nie. ddDziwna składnia fauluje ** oprtatora. Nadal przydałby się skrypt, który dostał argumenty normalnie ( dd.sh in.file out.filez ** w nazwach) i dał nazwy plików do ddkorzystania $1, $2itp, które nie powinny być zanieczyszczone przez składni dziwne DD.
Przywróć Monikę - ζ--
1
Bezpośrednie tworzenie jest bardzo wolne, ponieważ AFAIK wyłącza również pamięci podręczne readahead, co prawdopodobnie nie jest tym, czego chcesz, i nie jest realistyczne w scenariuszu testowym. Zamiast tego użyj „iflag = nocache oflag = nocache”, co dokładnie mówi systemowi operacyjnemu, że nie potrzebujesz buforowanego pliku wejściowego ani wyjściowego.
Stolsvik,
1

Możesz skopiować katalog rekurencyjnie za ddpomocą findimkdir

Musimy obejść dwa problemy:

  1. dd nie wie, co zrobić z katalogami
  2. dd można skopiować tylko jeden plik na raz

Najpierw zdefiniujmy katalogi wejściowe i wyjściowe:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Przejdźmy teraz cddo katalogu źródłowego, aby findzgłosić katalogi względne, którymi możemy łatwo manipulować:

cd "$SOURCE"

Zduplikuj drzewo katalogów od $SOURCEdo$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

Zduplikowane pliki $SOURCEdo $TARGETpominięcia zapisu pamięci podręcznej (cache ale wykorzystując odczytu!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Pamiętaj, że nie zachowa to czasu modyfikacji pliku, własności i innych atrybutów.

unfa
źródło