많은 IO 시나리오에서 데이터가 디스크에 안전하게 기록되었는지 확인해야 하는 경우가 많습니다. 그러면 시스템이 다운되면 다시 시작됩니다. 그러나 우리 모두는 Linux 시스템의 IO 경로가 여전히 매우 복잡하고 여러 계층으로 나누어져 있다는 것을 알고 있습니다. 각 계층에는 IO 읽기 및 쓰기를 가속화하기 위한 버퍼가 있을 수 있습니다. 동시에 사용자 모드 애플리케이션과 라이브러리 기능에는 자체 버퍼가 있을 수 있으며 이로 인해 IO 경로가 다소 복잡해집니다. 데이터가 디스크에 안전하게 기록되도록 하려면 단순히 쓰기/fwrite를 조정하는 문제가 아니라는 것을 알 수 있습니다.
그럼 어떻게 해야 할까요? 많은 사람들은 O_DIRECT 또는 O_SYNC 플래그를 사용하는 fflush(), fsync(), fdatasync(), sync(), open() 등과 같은 다양한 방법을 생각할 것입니다. 음, 이러한 수단(또는 일부 조합)은 실제로 데이터의 안전한 지속성을 보장할 수 있는데, 이들 수단의 차이점은 무엇입니까? fflush()와 fsync()의 차이점은 무엇입니까? O_DIRECT는 안전한 데이터 지속성을 보장한다는 것이 무엇을 의미합니까? O_DIRECT와 O_SYNC의 차이점은 무엇입니까? O_SYNC와 fsync()는 어떻습니까? fsync가 msync의 기능을 완성할 수 있나요? 이 기사에서는 이러한 개념의 기능과 차이점을 이해하고 설명하려고 노력할 것입니다.
설명하려면 사진 한 장이 천 마디 말보다 낫다고 합니다. 이들 개념의 차이점은 제가 특별히 그림을 그려서 자세히 살펴보면 그 기능과 차이점을 명확히 알 수 있을 것입니다.
여기서는 O_DIRECT 및 O_SYNC에 초점을 맞췄습니다. O_DIRECT는 데이터가 페이지 캐시를 통과하지 않는다는 의미입니다( 일반적으로 사용자 모드 자체에서 사용됨) 관리 버퍼)는 블록 장치 계층에 직접 제출되지만 데이터가 디스크에 안전하게 기록될 때까지 동기적으로 기다리지 않고 반환됩니다(예: 데이터가 여전히 블록에 대기열에 있을 수 있음). 레이어 또는 디스크 자체 캐시에 있음). O_SYNC 플래그의 경우 데이터는 여전히 페이지 캐시에 기록되지만 이때는 write through 전략이 채택되고 데이터가 디스크에 안전하게 기록될 때까지 데이터가 동기적으로 반환됩니다. 따라서 O_DIRECT와 O_SYNC를 동시에 사용하면 데이터가 페이지 캐시를 거치지 않고 데이터가 디스크에 안전하게 기록될 때까지 기다린 후 반환된다는 의미입니다. 물론 IO 성능은 매우 떨어지게 됩니다. 낮은.
O_DIRECT는 페이지 캐시를 우회하므로 다른 프로세스가 일반적인 방법으로 파일을 읽는 경우 데이터 불일치가 발생할 수 있으므로 주의가 필요합니다.
보충 설명을 위해 토론 중에 읽은 정보를 여기에 게시하겠습니다. 첫 번째는 개방형 시스템 호출을 인용하는 것입니다:http://man7.org/linux/man-pages/man2/open.2.html관련 매개변수 설명:
# ## #및 innodb 관련 문서:
https:/ /lwn .net/Articles/457667/fsync와 fdatasync의 차이점:
http://man7. org/linux /man-pages/man2/fsync.2.html# ## # msync:http://man7.org/linux/man-pages/man2/msync.2.html
사실 또 다른 IO 모드가 있는데, 바로 DAX(Direct Access)입니다. O_DIRECT와 비슷해 보이죠? 이 모드는 파일 시스템과 블록 드라이버 모두의 지원이 필요합니다. 일반적으로 비휘발성 메모리에서 사용되며 본질적으로 페이지 캐시를 우회하고 장치를 직접 작동합니다. 이 기사에서는 DAX에 대해 심도있게 다루지 않을 것입니다. 나중에 DAX 모드를 지원하는 램디스크 블록 장치 드라이버를 작성한 다음 이를 ext4 파일 시스템으로 포맷하고 -o dax 모드로 마운트한 다음 DAX의 IO 경로를 연구하겠습니다. 세부 사항.
더 많은 Linux 기사를 보려면Linux 튜토리얼컬럼을 방문하여 알아보세요!
위 내용은 Linux에서 안전한 데이터 전송을 보장하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!