FUSE에서 파일 시스템을 구현한 다음 커널에서 구현하겠습니다. Direct IO를 사용하는 방법을 모르겠습니다. 출처에 따라 상징이 암시하는 다양한 내용이 강조됩니다.
파일 시스템이 O_DIRECT를 무시해도 안전합니까?
- 읽기 및 쓰기 작업은 정상적으로 진행됩니다. Open은 이를 무시하고 실패하지 않습니다.
- 데이터 체크섬은 계속 확인됩니다. 따라서 하드 드라이브가 정상으로 돌아오더라도 체크섬으로 인해 읽기 작업이 실패할 수 있습니다.
- 기록된 데이터는 기록 중 복사 및 지연 할당의 대상이 됩니다.
- 쓰기 작업은 즉시 OK를 반환합니다. 쓰기 저장은 지연된 후에 이루어지며, 정전이 발생한 경우에는 발생하지 않습니다. 내구성은 보장되지 않지만 이는 어쨌든 O_SYNC 의미 체계입니다.
떠오르는 질문은 거의 없습니다.
- 내가 이해한 바로는 버퍼/페이지 캐시에 파일 내용을 캐싱하는 것은 파일 시스템이 아닌 VFS의 책임입니다. VFS도 이 플래그를 해석합니까?
- 답변을 바탕으로, 향후 커널에서는 플래그가 실패할 수 있습니다. 답변 아래의 설명은 Direct IO가 데이터 로그 모드의 반대임을 설명합니다.
답변1
~에 따르면open(2)
매뉴얼 페이지:
O_DIRECT (since Linux 2.4.10)
Try to minimize cache effects of the I/O to and from this
file. In general this will degrade performance, but it is
useful in special situations, such as when applications do
their own caching. File I/O is done directly to/from user-
space buffers. The O_DIRECT flag on its own makes an effort
to transfer data synchronously, but does not give the
guarantees of the O_SYNC flag that data and necessary metadata
are transferred. To guarantee synchronous I/O, O_SYNC must be
used in addition to O_DIRECT. See NOTES below for further
discussion.
댓글 섹션에서:
O_DIRECT support was added under Linux in kernel version 2.4.10.
Older Linux kernels simply ignore this flag. Some filesystems may
not implement the flag and open() will fail with EINVAL if it is
used.
따라서 O_DIRECT는 단순히 무시되었습니다. 그리고LKML에서, 불과 몇 달 전:
데이터가 손상되지 않는 한, 파일 시스템이 O_DIRECT를 어떻게 구현하는지 누가 신경 쓰나요? ext3은 많은 경우에 버퍼링된 IO로 대체되지만 이에 대한 유일한 불만은 성능입니다. IOW, 장기적(사용자가 O_DIRECT에 관심이 있는 경우)성능그런 다음 파일 시스템을 신중하게 선택해야 합니다.
그러나 각 파일 시스템에 O_DIRECT를 지원하는 코드 라인이 5줄만 있는 경우 바르게버퍼링된 IO를 사용하면 도대체 왜 사용자 공간이 공개(O_DIRECT) 실패를 명시적으로 처리하기 위해 난관을 뛰어넘어야 합니까?
특히 그들이 할 수 있는 일은 버퍼링된 IO 자체로 폴백하는 것뿐이라는 점을 고려하면...
나는 이 모든 것에 대해 이의를 제기했지만 더 나은 방법을 생각했습니다. 이전 버전의 커널은 O_DIRECT를 무시했기 때문에 분명히 선례가 있습니다.
이 점을 고려하면 무시해도 무방할 것 같습니다. 핵심 단어는 "데이터 손상 없음"인 것 같습니다.
현재.
또한링크 문제성능상의 이유로 O_DIRECT가 유용하지 않다는 답변이 있습니다. 이것은 완전히 잘못된 것입니다. 페이지 캐시를 통해 데이터 전달아니요페이지 캐시를 통해 전달합니다. 이는 초당 기가바이트를 전송할 수 있는 하드웨어에 중요합니다. 캐싱은 각 데이터 비트를 한 번만 처리하는 경우 사실상 쓸모가 없지만 전체 시스템에 불필요하게 영향을 미칩니다.
Linux 파일 시스템 모듈을 작성한 지 몇 년이 지났습니다. 불행히도 VFS 시스템이 캐싱을 처리하는 방법을 기억하지 못합니다.