파일 시스템 간에 대용량 파일(파일당 1~2GB)을 복사할 때 대상 파일 시스템이 거의 가득 차면 파일 조각화가 발생할 수 있습니다.
우리의 C++ 응용 프로그램 코드는 fallocate()
데이터 파일을 생성하고 쓸 때 미리 할당된 공간을 사용하지만 Linux 복사 명령이 이를 어떻게 처리하는지 알고 싶습니다 /bin/cp
.
cp
루프에서 바이트 또는 데이터 덩어리를 복사합니까(그리고 파일 시스템이 이를 처리하도록 합니까) ? 아니면 cp
먼저 전화를 걸 fallocate()
거나 posix_fallocate()
소스 파일의 크기를 지정하시겠습니까?
인터넷에서 검색해 본 결과 이 주제에 대해서는 아무 것도 찾을 수 없었습니다.
파일 시스템은 ext3, ext4 또는 xfs일 수 있습니다.
Centos 8.1, 커널 4.18.0-147.el8.x86_64 #1 SMP
나를 편집하다
배경으로 실제 애플리케이션은 일정한 비트 전송률의 네트워크 스트림을 읽고 파일 내용의 N초를 사전 할당합니다. 실제 비트 전송률이 높을수록 파일은 자연스럽게 커집니다. ftruncate()
파일이 닫힐 때 호출되어 실제 비트 전송률이 더 낮은지 여부를 처리합니다. cp
파일 시스템 간에 이러한 파일을 이동하는 경우에만 내 질문입니다.
그 이유는 분열을 피하기 위함이다. 파일 시스템이 없으면 fallocate
시간이 지남에 따라 점점 더 조각화됩니다. ( fallocate()
물론 문제를 완전히 예방할 수는 없지만 확실히 완화할 수 있습니다)
~에 따르면초기화되지 않은 블록 및 예상치 못한 플래그, fallocate()
연속 블록이 "효율적으로" 할당됩니다(대부분의 파일 시스템에서).
Fallocate() 시스템 호출은 애플리케이션이 파일에 대한 유효한 블록 할당을 요청하는 방법입니다. fallocate()를 사용하면 프로세스에서 필요한 디스크 공간을 사용할 수 있는지 확인할 수 있으므로 파일 시스템이 단일 연속 그룹에 모든 공간을 할당하고 블록별 할당의 오버헤드를 방지하는 데 도움이 됩니다.
그래서 크고 심하게 조각난 파일을 복사하면 대상에서 연속적으로 끝나는지 아니면 조각화되는 것인지 궁금합니다. 공간을 미리 할당하는 cp
데 사용되지 않으므로 대답 은 "아마도 그렇습니다"인 것 같습니다.fallocate()
답변1
cp
GNU coreutils에서 제공되는 버전사용하세요fallocate
, 복사 대상을 위한 공간을 미리 할당하는 대신 파일에 구멍을 뚫을 뿐입니다.
이에 대한 지원 추가에 대한 언급이 몇 번 있었기 fallocate
때문에 어느 시점에서는 적어도 그렇게 할 계획이 막연하게 있었던 것 같습니다.