파일 캐시를 사용하지 않고 대용량 파일을 더 빨리 복사 할 수 있습니까?


19

preload패키지를 추가 한 후 응용 프로그램의 속도가 향상되는 것처럼 보이지만 큰 파일을 복사하면 파일 캐시가 파일 크기의 두 배 이상 커집니다.

단일 3-4GB 가상 상자 이미지 또는 비디오 파일을 외장 드라이브로 전송함으로써이 거대한 캐시는 미리로드 된 모든 응용 프로그램을 메모리에서 제거하여로드 시간이 증가하고 일반적인 성능 저하로 이어집니다.

대용량 멀티 기가 바이트 파일 캐싱 하지 않고 복사 할 수있는 방법이 있습니까 (예 : 파일 캐시 무시)? 또는 특정 폴더가 캐시되지 않도록 허용하거나 차단하는 방법은 무엇입니까?

답변:


19

and nocache같은 명령 앞에 붙일 수 있는 유틸리티가 있습니다 . 플래그 와 함께 열려있는 모든 호출에 추가하는 라이브러리를 미리로드하여 작동 합니다.ioniceniceposix_fadvisePOSIX_FADV_DONTNEED

간단히 말해서 커널은 특정 파일에 캐싱이 필요하지 않다고 조언 합니다. 커널은 일반적으로 파일을 캐시하지 않습니다. 기술적 세부 사항 은 여기 를 참조 하십시오 .

예를 들어, 실행중인 시스템에 미치는 영향을 최소화하면서 백그라운드에서 멀티 테라 바이트 디스크를 백업하려는 경우 엄청난 복사 작업이 필요합니다 nice -n19 ionice -c3 nocache cp -a /vol /vol2.

패키지는 Ubuntu 13.10 이상에서 사용할 수 있습니다. 이전 릴리스 인 경우 13.10 패키지 를 설치 하거나 François Marier 의이 12.04 백 포트 를 선택할 수 있습니다 .


GUI를 통해 수행 할 수있는 작업과 단순히 '캐시 없음'폴더를 블랙리스트에 올리는 방법을 원했지만 지금은 그렇게해야합니다.
Veazer

12

단일 대형 파일의 경우 직접 I / O dd와 함께 사용 하여 파일 캐시를 무시하십시오.

하나 (또는 ​​몇 개의) 큰 멀티 기가 바이트 파일을 전송하려는 경우 다음을 수행하는 것이 쉽습니다 dd.

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • direct플래그는 말할 dd커널의 직접 I / O 옵션을 (사용 O_DIRECT하여 완전히 파일 캐시를 우회, 읽기, 쓰기 동안).
  • bs물리적 디스크 작업의 수를 최소화 할 수 있기 때문에 블록 크기 옵션이 상당히 큰 값으로 설정해야합니다 dd수행해야합니다를 읽고 있기 때문에, / 쓰기는 더 이상 캐시되지 않으며 너무 많은 작은 직접 작업은 심각한 경기 침체가 발생할 수 있습니다.
    • 1에서 32MB 사이의 값으로 자유롭게 실험하십시오. 위의 설정은 4MB ( 4M)입니다.

다중 / 재귀 디렉토리 복사본의 경우 불행히도 쉽게 사용할 수있는 도구가 없습니다. 일반적인 cp 직접 I / O를 지원 하지 않습니다 .

/ e iflags & oflags가 올바른 iflag & oflag로 변경되었습니다.


1
zsh**연산자로 재귀를 수행 할 수 있습니다 . zshrepos에서 수동으로 설치해야합니다.
Monica Monica 복원-ζ--

1
사실은 아닙니다. dd의 이상한 구문은 ** oprtator를 파울합니다. 당신은 여전히 (일반적으로 인수를 가지고 쉘 스크립트 사용할 수있는 dd.sh in.file out.file파일 이름에 **와)과에 파일 이름을 준 dd사용 $1, $2DD의 이상한 구문에 의해 반칙해서는 안 등,,.
Monica Monica 복원-ζ--

1
Direct make는 매우 느리다. AFAIK는 또한 readahead 캐시를 비활성화합니다. 이는 아마도 원하는 것이 아니며 벤치마킹 시나리오에서도 현실적이지 않습니다. 대신 "iflag = nocache oflag = nocache"를 사용하십시오. 이는 파일 내 또는 외부 파일 캐시가 필요하지 않음을 OS에 정확하게 알려줍니다.
stolsvik

1

and 를 dd사용하여 디렉토리를 재귀 적으로 복사 할 수 있습니다.findmkdir

두 가지 문제를 해결해야합니다.

  1. dd 디렉토리로 무엇을 해야할지 모르겠다
  2. dd 한 번에 하나의 파일 만 복사 할 수 있습니다

먼저 입력 및 출력 디렉토리를 정의하겠습니다.

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

이제 cd소스 디렉토리로 들어가서 find쉽게 조작 할 수있는 상대 디렉토리를보고하겠습니다.

cd "$SOURCE"

에서 디렉토리 트리 복제 $SOURCE에를$TARGET

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

쓰기 캐시 $SOURCE$TARGET생략 하기 위해 파일을 복제합니다 (그러나 읽기 캐시 활용).

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

파일 수정 시간, 소유권 및 기타 속성은 유지되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.