저속(HDD) 및 고속(SSD) 드라이브에 걸쳐 여러 디스크와 소프트웨어 RAID가 있는 최신 Linux 시스템에서 파일 시스템에 쓰기를 캐시하는 방법은 무엇입니까?
md-raid RAID1을 사용하면 어레이를 및 로 구성할 수 있습니다 --write-mostly
. --write-behind
즉, 더 빠른 디스크에서 읽기가 수행되는 반면 느린 디스크에 쓰기는 지연될 수 있습니다. 하지만 커널 수준에서는 어떻게 캐시됩니까? 커널 캐시 디스크는 md-raid 계층 이전 또는 이후에 기록합니까? write() 호출이 끝날 때 디스크가 아닌 디스크 중 하나에 데이터가 기록되도록 보장됩니까 --write-behind
?
RAID1 에서도 btrfs
같은 상황이 어떻게 발생합니까 ? 기능 이 없으므로 --write-behind
더티 페이지는 장치 수준이나 파일 시스템 수준에서 계산됩니까? write()는 언제 반환되나요?
vm.dirty_*ratio
조정 가능한 매개변수는 이러한 설정에 어떤 영향을 미치나요 ?
답변1
--write-mostly
, 드라이버에 의해 내부적으로 처리됩니다 --write-behind
. 기본적으로 어떤 데이터가 기록되었고 어떤 데이터가 아직 손실되었는지 기록하는 쓰기 의도 비트맵(뒤에 쓰기 기능에 필요함)과 같은 메타데이터를 보존합니다. 이는 데이터가 기본 쓰기 장치에 아직 도달하지 않은 상태에서 정전이 발생한 경우에 필요합니다. 이 경우 영향을 받은 데이터 영역이 다시 동기화됩니다(귀하의 경우 SSD에서 읽기, HDD에 쓰기).md
md
하지만 커널 수준에서는 어떻게 캐시됩니까?
write-behind의 경우 md 드라이버는 기본적으로 쓰기 요청을 내부적으로 복제합니다. 기본 쓰기 요청은 기본 드라이브로 전송되고 상위 계층에 "확인, 완료되었습니다"라고 알립니다. 그런 다음 복제된 쓰기 요청은 RAID의 후면 쓰기 측면에 유지되며 완료하는 데 더 오랜 시간이 걸릴 수 있습니다. 한 통의 통지가 도착합니다.
그런 다음 RAID 계층은 큐에 보류 중인 쓰기 요청이 있는 동안 쓰기 우선 장치에서 데이터를 읽지 않도록 여러 단계를 수행합니다. 쓰기 지향 장치에서 데이터를 읽는 이유는 무엇입니까? 글쎄요, SSD가 고장났을 수도 있으니 남은 건 그게 전부입니다. 복잡하고 write-behind로 인해 일부 특수 사례가 발생합니다.
이것이 아마도 RAID-1 레벨만 지원하고 다른 레벨은 지원하지 않는 이유일 것입니다. 이론적으로는 본질적으로 SSD를 RAID-0으로 사용하고 write-behind 모드에서 두 개의 패리티 HDD를 사용하는 것이 합리적일 수 있지만 이와 같은 write-behind RAID-6은 지원되지 않습니다. RAID-1 전용이며 그곳에서도 거의 사용되지 않습니다.
md
다른 캐시 설정은 이에 영향을 받지 않습니다. 기본적으로 전체 캐싱 메커니즘은 드라이버가 내부적으로 어떻게 구현하는지 전혀 신경 쓰지 않습니다 . 캐시가 그 일을 하고, md가 그 일을 합니다. 따라서 파일 시스템 캐시는 베어 드라이브와 마찬가지로 md 위에 있는 파일 시스템에서도 동일하게 작동합니다. (좀 더 복잡하지만 이렇게 생각하시면 됩니다.)
답변2
md-raid RAID1을 사용하면 어레이를 및 로 구성할 수 있습니다
--write-mostly
.--write-behind
즉, 더 빠른 디스크에서 읽기가 수행되는 반면 느린 디스크에 쓰기는 지연될 수 있습니다. 하지만 커널 수준에서는 어떻게 캐시됩니까? 커널 캐시 디스크는 md-raid 계층 이전 또는 이후에 기록합니까?
그 이후에는 이 기능이 md-raid에만 해당됩니다.
이 md-raid 기능은 캐싱이 아닌 버퍼링으로 생각해야 합니다. mdadm
다음 옵션으로 제한 됩니다 .
--뒤에 쓰기=
write-behind 모드를 활성화해야 함을 지정합니다(RAID1에만 유효). 매개변수가 지정되면 허용되는 미해결 쓰기의 최대 수가 설정됩니다. 기본값은 256입니다.
나는 그것이 일반적인 커널과 하드웨어 버퍼링(즉, 더 작은 경우)에 의해서도 제한된다고 가정할 수 있습니다. 일반적인 커널 버퍼링은 nr_requests
. max_hw_sectors_kb
보다 /sys/class/block/$write_behind_device/queue/
. 하드웨어 버퍼링은 드라이브의 쓰기 캐시를 나타냅니다.
write() 호출이 끝날 때 디스크가 아닌 디스크 중 하나에 데이터가 기록되도록 보장됩니까
--write-behind
?
물론 이는 O_SYNC/O_DSYNC로 열린 파일에 대한 write()를 의미하거나 실제로 write()+fsync()를 의미한다고 가정합니다. 그렇지 않은 경우 전혀 보장이 없습니다.