Linux에서 O_DIRECT 사용


23

이 질문이 너무 프로그래머 중심이라면 알려주세요. Linux 2.6에서 open () 시스템 호출에 대한 O_DIRECT 플래그에 익숙한 사람들이 있는지 궁금합니다. Linus는 그 사용을 혼란스럽게하지만 고성능 파일 작성은 그 사용을 나타내는 것 같습니다. 실제 경험과 권장 사항을 알고 싶습니다.

더 많은 정보 : 내가 사용하고 있음을 응용 프로그램 않는 자신의 캐시를 유지하고, 그렇게에서 5 배 이상의 속도까지의 평균 달성한다. 파일에 쓸 때 캐시의 내용을 파일 시스템 캐시에 써야합니다. 이는 중복되고 성능 문제로 보입니다.

답변:


17

좋아, 당신은 경험을 요구합니다, 이것은 질문을 조금 주관적이고 논쟁 적이면서도 통과 가능하게 만듭니다.

Linus는 사람들이 일반적으로 O_DIRECT를 사용하는 용도를 언급하며 이러한 용도의 경우 IMO Linus가 대부분 정확하다고 말했습니다. 직접 I / O를 수행하더라도 장치와 데이터를 장치간에 직접 전송할 수 없으며, 프로그램 또는 장치에 의해 채워지고 시스템 호출을 통해 다른 쪽 끝으로 전송되는 버퍼가 필요합니다. 또한 효율성을 높이기 위해 다시 필요할 때를 대비하여 방금 읽은 내용을 다시 읽고 싶지 않을 것입니다. 따라서 일종의 캐시가 필요합니다 ... 그리고 페이지 커널 인 O_DIRECT없이 커널이 제공하는 것입니다! 왜 사용하지 않습니까? 또한 더 많은 프로세스가 동일한 파일에 동시에 액세스하려는 경우 이점이 있으며 O_DIRECT를 사용하면 재앙이됩니다.

O_DIRECT는 다음과 같은 용도로 사용됩니다. 어떤 이유로 블록 장치에서 직접 데이터를 가져와야합니다. 성능과 관련이 없습니다.

성능을 위해 O_DIRECT를 사용하는 사람들은 일반적으로 잘못된 페이지 캐시 알고리즘이 있거나 POSIX 조언 메커니즘이 없거나 다른 사람들이 말한 것을 무의식적으로 반복하는 시스템에서 온 사람들입니다. 이러한 문제를 피하기 위해 O_DIRECT가 해결책이었습니다. Linux, OTOH는 실제 근본적인 문제를 해결해야한다는 철학을 가지고 있으며, 근본적인 문제는 페이지 캐싱에서 나쁜 작업을 수행 한 OS였습니다.

기계의 메모리 오류를 찾기 위해 간단한 cat 구현을 위해 O_DIRECT사용했습니다 . 이것은 O_DIRECT에 대한 올바른 사용 중 하나입니다. 그것은 성능과 관련이 없습니다.


정보 주셔서 감사합니다, 감사합니다. 이 질문을 촉발 한 앱의 특정 조건으로 내 질문을 업데이트했습니다. 파일 작성을위한 POSIX 어드바이스 메커니즘에 대한 자세한 내용이 있으면 감사하겠습니다.
casualunixer

4
o_direct는 개발자가 응용 프로그램 계층에서 캐싱 메커니즘을 제공하려는 시스템에서도 유용 할 수 있습니다 (데이터베이스 생각).
Jmoney38

성능과 관련이 없습니다. 특히 IO 속도가 메모리 대역폭에 필적하거나 심지어 메모리 대역폭의 상당 부분을 차지하는 고속 장치에 액세스하는 경우 항상 그런 것은 아닙니다. 이 경우 페이지 캐시와의 추가 사본을 건너 뛰면 성능이 크게 향상 될 수 있습니다.
Andrew Henle

13

실제로 O_DIRECT 는 다음 중 하나를 피해야합니다.

  • 캐시 오염 -때로는 2GiB의 RAM이있을 때 64GiB와 같이 실제로 큰 파일을 처리 할 때 캐싱과 관련하여 오버 헤드가 의미가 없다는 것을 알고 있습니다. 사용자가 확인하기로 결정한 32GiB의 토런트 파일은 캐싱에 적합하지 않은 것으로 보입니다. 자체 오버 헤드가있는 추가 활동 일뿐입니다. 그리고 실제로 유용한 데이터가 캐시에서 정리되도록 할 수 있습니다.
  • 이중 캐싱 -예를 들어 일부 RDBMS (MySQL에서 언급)는 자체 캐시를 정의 할 수 있습니다. 데이터베이스는 SQL 계획 등에 대해 알지 못하는 커널의 가상 메모리보다 캐시하는 방법과 무엇을 더 잘 알고있을 것입니다.

— 그것은 좋지 않습니다. 그리고 O_DIRECT더 빠르다는 의미 는 아니며 종종 그렇지 않습니다 .


10
posix_fadvise캐시 오염 문제를 처리 할 수 ​​있습니다.
psusi

가상 메모리는 가상 메모리와 관련이 있다고 생각하지 않으며 단순히 메모리 주소를 매핑합니다. 버퍼 캐시 / 페이지 캐시가 의미합니다.
ArekBulski

캐시 / 캐싱은 제가 알 수있는 한, UNIX에서 VM 서브 시스템의 일부이므로이 용어를 사용했습니다. 편집 해 주셔서 감사합니다. :)
poige

6

O_DIRECT최신 파일 시스템 을 사용 하는 최신 커널 에서는 사용 이 실패 할 수 있습니다. 예를 들어이 버그 보고서 를 참조하십시오 . 따라서 사용이 종종 모호 할뿐만 아니라 다음 세대 Linux 배포판에서는 전혀 작동하지 않을 것입니다. 따라서 코드의 이점을 입증 할 수 있다고하더라도 내 코드의 성능에 내기를 걸지 않을 것입니다.


1
버그 보고서는 실제로 journal = data 옵션이 설정된 파일 시스템 사용에 대해 설명합니다. 이 옵션은 O_DIRECT 플래그와 직접적으로 반대입니다. 대부분의 ext3 및 ext4 파일 시스템에는이 플래그가 설정되어 있지 않으면 끄면 O_DIRECT로 파일을 열 수 있습니다.
casualunixer

3

성능과 관련이 있습니다.

흥미로운 예는 mmap 엔진을 사용하는 mongodb입니다. O_DIRECT는 다른 사람들이 언급했듯이 데이터를 한동안 읽을 수없는 곳에서 가장 잘 사용됩니다. mongodb에서 데이터베이스 저널은 O_DIRECT를 사용하여 작성되지만 데이터 및 인덱스 쓰기는 페이지 캐시 메커니즘 (pdflush)에 의해 처리됩니다. O_DIRECT는 더 적은 대역폭을 제공하지만 대기 시간이 줄어들 기 때문에 데이터 손실이 줄어 듭니다. 예기치 않은 중단 (커널 패닉, 디스크 또는 정전). O_DIRECT 쓰기가 비 휘발성 저장소에 커밋되기 전에 버퍼링이 여전히 남아 있으므로 데이터 손실이 줄어 듭니다.

O_DIRECT의 또 다른 중요한 기능 은 쓰기 순서 를 보다 강력하게 제어 할 수 있다는 것 입니다. 다시 말해 쓰기 순서를 보장하지는 않습니다 (비 휘발성 캐싱 디스크 컨트롤러가없고 fifo 스케줄러를 사용하지 않는 한 자체 문제가 있음). 따라서 mysql은 데이터 / 인덱스 및 저널링에 O_DIRECT를 사용하지만 후자는 일반적으로 먼저 커밋 될 것으로 예상 할 수 있습니다.

그러나 O_DIRECT는 자원 할당의 공정성을 깨뜨린다는 점을 기억해야합니다. 응용 프로그램 속도가 빨라지는 이유 중 하나는 응용 프로그램 속도가 느려지기 때문입니다.


성능과 관련이 있다고 말하지만 대기 시간을 줄이거 나 주문 쓰기에 사용되는 예제를 제공합니다. 그러나 성능에 영향을 미친다는 데 동의합니다. 공정성에 대한 공정한 포인트.
ArekBulski

불공평 할 때 설명하는 추가 자료를 제공 할 수 있습니까?
ACyclic

3

@Juliano가 이미 말한 것과 관련이 있습니다.

posix_fadvise실제 문제가 기본 파일 시스템의 캐시 알고리즘의 오작동 인 경우 체크 아웃 하여 파일 시스템 사용 방법에 대한 조언을 제공 할 수 있습니다. 제대로 구현 된 fs의 경우 성능이 향상됩니다. (여기에 비슷한 고려 사항을 다루는 다른 주제에 대한 링크가 있습니다 /programming//a/3755818/544721 )


1
posix_fadvise가 커널에서 사용하는 미리 읽기 알고리즘을 변경하는 것처럼 보입니다. 문제의 코드에서 중요한 요소는 쓰기 성능입니다. 문제는 버퍼를 작성하는 것이 먼저 Linux 캐시를 채우고 메모리가 부족할 때 커널이 덤프해야한다는 것입니다. 이것은 노력의 낭비이며,이 경우 출력은 디스크로가는 도중 최소로 버퍼링되어야합니다.
casualunixer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.