쓰기 캐시는 속도가 다른 파일 시스템 스패닝 디스크에서 어떻게 작동합니까?


9

다중 디스크와 저속 (HDD) 및 고속 (SSD) 드라이브에 걸쳐있는 소프트웨어 RAID가있는 최신 Linux 시스템에서 파일 시스템에 대한 쓰기는 어떻게 캐시됩니까?

MD-RAID RAID1 배열과 같이 디스크를 구성 할 수 --write-mostly--write-behind그 빠른 디스크에서 수행되는 판독 제안하고 느린 디스크에 쓴다이 뒤떨어져있다. 그러나 커널 수준에서 어떻게 캐시됩니까? 커널이 md-raid 계층 전후에 디스크 쓰기를 캐시합니까? write () 호출이 끝날 때 데이터가 not- --write-behinddisk 중 하나에 기록되도록 보장 됩니까?

A에 대한 btrfsRAID1 방법 같은 상황은 밖으로 재생 것인가? 더 없습니다 --write-behind기능 때문에 장치 수준 또는 파일 시스템 수준에서 계산 더티 페이지는? 어느 시점에서 write ()가 반환됩니까?

어떻게합니까 vm.dirty_*ratio튜너 블은 이러한 설정에 영향을?

답변:


7

--write-mostly, --write-behind에 의해 처리됩니다 md내부적으로 드라이버. md기본적으로 어떤 데이터가 작성되었지만 아직 누락 된 데이터를 기록하는 쓰기 의도 비트 맵 (쓰기 방지 기능의 필수)과 같은 메타 데이터를 유지합니다. 데이터가 쓰기 장치에 아직 도달하지 않은 경우 전원 손실 이벤트가 발생하는 경우에 필요합니다. 이 경우 영향을받는 데이터 영역이 다시 동기화됩니다 (이 경우 SSD에서 읽고 HDD에 씁니다).

그러나 커널 수준에서 어떻게 캐시됩니까?

후기 쓰기의 경우 md 드라이버는 기본적으로 쓰기 요청을 내부적으로 복제합니다. 마스터 쓰기 요청은 기본 드라이브로 가서 상위 계층에 "이미 완료했습니다"라고 알려줍니다. 복사 된 쓰기 요청은 RAID의 가장 뒤에있는 쓰기 쪽을 유지하며 아무 것도 모르게 완료되기까지 더 오래 걸릴 수 있습니다.

그런 다음 레이드 계층은 대기중인 쓰기 대기 요청이 여전히 큐에있는 동안 대부분의 쓰기 장치에서 데이터를 읽지 않도록하기 위해 많은 단계를 수행합니다. 대부분의 쓰기 장치에서 데이터를 읽는 이유는 무엇입니까? 글쎄, SSD가 고장 났기 때문에 남아있는 전부입니다. 복잡하고 write-behind는 몇 가지 경우를 소개합니다.

그렇기 때문에 RAID-1 수준에서만 지원되며 다른 것은 지원하지 않습니다. 이론적으로 SSD를 기본적으로 RAID-0으로, 2 개의 패리티 HDD를 쓰기-비하 모드로 설정하는 것이 의미가있을 수 있지만, 이와 같은 쓰기-비하 인 RAID-6은 지원되지 않습니다. RAID-1 전용이며 거의 사용되지 않습니다.

다른 캐시 설정은 이것에 의해 영향을받지 않습니다. 기본적으로 전체 캐싱 메커니즘은 md드라이버가 내부적으로 구현 한 방식에 대해서는 거의 신경 쓰지 않습니다 . 캐시는 그 일을하고 md는 그 일을합니다. 따라서 파일 시스템 캐시는 md 이상의 파일 시스템과 베어 드라이브의 파일 시스템에 대해 동일하게 작동합니다. (현실은 그보다 더 복잡하지만이 방법으로 생각할 수 있습니다.)


3

MD-RAID RAID1 배열과 같이 디스크를 구성 할 수 --write-mostly--write-behind그 빠른 디스크에서 수행되는 판독 제안하고 느린 디스크에 쓴다이 뒤떨어져있다. 그러나 커널 수준에서 어떻게 캐시됩니까? 커널이 md-raid 계층 전후에 디스크 쓰기를 캐시합니까?

이후이 기능은 md-raid에만 해당되기 때문입니다.

이 md-raid 기능은 캐싱이 아니라 버퍼링으로 생각해야합니다. 다음 mdadm옵션으로 제한됩니다 .

--write-behind =

write-behind 모드가 사용 가능하도록 지정하십시오 (RAID1에만 유효 함). 인수가 지정되면 허용되는 최대 쓰기 수를 설정합니다. 기본값은 256입니다.

나는 그것이 정상적인 커널과 하드웨어 버퍼링에 의해 제한된다고 생각할 수 있습니다 (즉, 더 작은 경우). 일반적인 커널 버퍼링은 nr_requestsand에 의해 제한됩니다 max_hw_sectors_kb. 참조하십시오 /sys/class/block/$write_behind_device/queue/. 하드웨어 버퍼링이란 드라이브의 쓰기 캐시를 의미합니다.

write () 호출이 끝날 때 데이터가 not- --write-behinddisk 중 하나에 기록되도록 보장 됩니까?

물론 write ()가 O_SYNC / O_DSYNC로 열린 파일에 있거나 실제로 write () + fsync ()를 의미한다고 가정합니다. 그렇지 않은 경우 보증이 전혀 적용되지 않습니다.


고맙지 만, 그것은 다른 질문을 제기합니다 : 파일이 O_SYNC로 열린 경우 첫 번째 디스크에 쓰거나이 경우 모든 디스크에 쓰인 후 write ()가 반환됩니까?
Steve

3
받는 서브 - 기록되지 않은 쓰기 뒤에 디스크 첫 번째 완료해야합니다
sourcejedi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.