우리는 프로세스를 분기할 때 운영 체제가 쓰기 중 복사 최적화를 수행하는 것을 보았습니다. 그 이유는 대부분의 경우 exec가 포크 앞에 오기 때문에 불필요한 페이지 할당 및 호출자의 주소 공간에서 데이터 복사 비용이 발생하는 것을 원하지 않기 때문입니다.
그렇다면 ext4 또는 xfs(저널링) 파일 시스템을 사용하여 Linux에서 CP를 수행할 때도 이런 일이 발생합니까? 만약 그런 일이 일어나지 않는다면, 왜 안 될까요?
답변1
답변2
검색할 키워드는 입니다 reflink
. 최근 XFS에서 구현되었습니다.
편집: XFS 구현은 원래 실험적인 것으로 표시되었습니다. 위 내용을 작성한 지 몇 달 후, 이 경고는 커널 버전 4.16에서 제거되었습니다 :-).
답변3
Linux에는 사용자 공간 프로세스가 파일을 쓸 때 파일의 복사본을 만들도록 커널에 지시할 수 있는 시스템 호출이 있습니다. FICLONERANGE 및 FICLONE은 쓰는 동안 파일과 파일 내의 범위를 복사할 수 있도록 하는 ioctl 옵션으로 사용됩니다.
cp --reflink 이를 사용하여 파일 시스템 기반 복사본을 만듭니다.
답변4
시스템 호출을 도입하지 않는 한 (또는 최소한 블록을 복사하지 않는 한) 운영 체제 는 프로그램이 쓰고 있는 데이터가 다른 블록에서 방금 읽은 데이터와 동일한지 cp
판단하기 어렵습니다 . cp
게다가 "동일한 블록을 공유하는 여러 파일" 시나리오를 관리하려면 추가 오버헤드가 필요합니다. 단지 몇 개의 블록만 다른 크고 유사한 파일은 거의 발생하지 않습니다. 따라서 전반적으로 이러한 청크를 복사한 다음 관리 오버헤드를모두문서.
이제 BTRFS에 파일 시스템의 또 다른 복제본/스냅샷을 추가하여 파일(많은 파일)을 "복사"하면 상황이 달라집니다. 이제 "복사"되었습니다.모두파일 시스템의 파일과 해당 파일에 대한 모든 변경 사항은 쓰기 시 복사됩니다. 이것은 존재하지만 ext4에는 없습니다.
"일기"는 완전히 독립적인 개념으로, 중요한 것은 파일의 관리 구조입니다.