내가 사용자로서 , 및 와 같은 명령을 사용하여 cp
파일 mv
시스템 과 mkdir
상호 작용하는 데 시간을 보낸다고 가정해 보겠습니다 rm
. fsync
정상 작동 중에는 이러한 명령이 호출되지 않습니다.
fsync 없이 파일 시스템을 무기한 실행할 수 있습니까? 이로 인해 내 데이터가 위험에 빠지나요? 마지막 fsync 이후 얼마나 많은 시간이 경과했는지 확인해야 합니까?
답변1
짧은 대답은 다음과 같습니다. 예, 예, 그리고 아니오입니다.
예, 파일 시스템은 애플리케이션 호출 없이 무기한 실행될 수 있습니다 fsync
. 파일 시스템은 데이터가 (결국) 디스크에 저장되는지 확인하기 위해 파일 시스템에 의존하지 않으며 다른 메커니즘이 있습니다. 호출이 없으면 fsync
데이터가 약간 위험해질 수 있습니다. 예를 들어, 파일을 복사하고 원본 파일을 삭제했는데 시스템 전원이 꺼지면 삭제로 인해 해당 파일이 디스크에 저장될 가능성이 높지만 복사본은 불완전하게 됩니다.
일반적으로 운영 체제가 디스크에 데이터를 저장하려고 시도하는 속도를 제어하기 위해 변경할 수 있는 일부 구성 설정이 있으며 sync
, 이로 인해 미해결 데이터가 기록됩니다. (모든 경우에 운영 체제는 데이터가 디스크 컨트롤러에 도달하는지 확인만 할 수 있으며 디스크에 버퍼 플러시를 요청할 수 있습니다. 데이터가 실제로 디스크에 저장된다는 절대적인 보장은 없습니다.)
Linux에서 조정할 수 있는 설정은 /proc/sys/vm
해당 문서에 있습니다.admin-guide/sysctl/vm.rst
- 찾다 dirty_
. 다양한 설정을 통해 운영 체제가 디스크에 데이터 쓰기를 시작하기 전에 쓸 데이터의 양이나 대기 시간을 지정할 수 있습니다. 여기에 개입할 수 있는 두 가지 메커니즘이 있습니다. 백그라운드 스레드가 보류 중인 데이터를 디스크에 쓰도록 하고( dirty_background_...
), 프로세스가 너무 많은 데이터를 생성하기 시작하면 운영 체제에서 쓰기 내용을 디스크에 플러시합니다(효과적으로 와 같은 기능 도입 fsync
). 두 가지 메커니즘이 있는 이유는 운영 체제가 I/O 성능과 처리 성능 사이의 균형을 유지하려고 하기 때문입니다. 실행 중인 프로세스가 너무 빠르게 데이터를 쓰지 않는 한 백그라운드 스레드는 일단 시작되면 이를 처리합니다. 쓰기 디스크가 따라잡을 수 없을 정도로 너무 많은 데이터가 들어오면 속도가 느려지며, 이는 시스템이 기록 중인 보류 중인 데이터를 따라잡는 데 도움이 되고 너무 많은 데이터를 쓰는 것을 방지합니다.
데이터가 걱정된다면 fsync
호출되었는지 확인하지 말고 를 실행하세요 sync
.
(그건 무시하세요 /proc/sys/vm/dirtytime_expire_seconds
. 그것은 완전히 다른 이야기입니다.)