ext4로 파일 시스템 쓰기를 얼마나 오래 캐시 할 수 있습니까?


14

얼마 전, 언 스트 언 마운트 해제 후 빈 파일을 남길 가능성이있는 ext4에 대한 논의 가이 기사에서 잘 요약되어 있습니다. 기본적으로 할당 지연으로 인해 쓰기가 ext 저널의 기본 커밋 간격 (5 초)보다 훨씬 오래 쓰기 캐시에 보관 될 수 있습니다.

특정 상황에서 블록 할당을 강제하는 패치에서 문제가 해결 된 것으로 보이며, 기본적으로 최대 5 초 후에 데이터를 디스크에 저장합니다.

응용 프로그램이 파일 자체를 자르거나 추가하지 않고 파일의 기존 부분을 덮어 쓸 때 어떤 일이 발생하는지 궁금합니다. 5 초 안에 디스크에 강제로 저장됩니까?

파일에 추가하는 것과 다른 상황 인 것 같습니다. 추가 할 때 파일 크기가 변경됩니다. 이는 메타 데이터 변경입니다. 따라서 5 초 이내에 저널 커밋이 필요하며 data = ordered로 인해 보안 문제로 인해 데이터를 작성해야합니다 (그렇지 않으면 다른 사용자의 삭제 된 파일의 일부가 추가 된 소유자에게 표시 될 수 있음) 파일).

파일 데이터를 덮어 쓰는 경우 이전 데이터가 새 데이터와 동일한 사용자에 속하기 때문에 메타 데이터 저널 커밋 전에 데이터 쓰기가 발생해야하는 이유가 없습니다. 커밋 전에 쓰기가 발생합니까, 아니면 저널 커밋 간격보다 오래 지연 될 수 있습니까? 그렇다면 얼마나 걸립니까?

업데이트 : 올바른 일을 할 때, 즉 fsync ()를 사용하면이 모든 것이 관련이 없다는 것을 알고 있습니다. (이것은 ext4 및 데이터 손실에 대한 모든 토론의 주된 이유였습니다. 문제는 fsync ()가 아닌 응용 프로그램에만 해당되거나 적절한 순간에 관련되지 않았습니다.) 내 자신의 응용 프로그램을 작성하지 않고 있습니다. 모든 응용 프로그램이 올바르게 작동하는지 여부를 알지 못하며 이러한 "위험한"쓰기에 대한 대략적인 시간을 알고 싶습니다. 질문하는 이유는 내 그래픽 드라이버가 정기적으로 커널 패닉을 유발하기 때문에 지난 5 초 이상의 데이터 쓰기에 대해 걱정해야하는지 알고 싶습니다.

답변:


16

커밋 간격을 32 비트 부호없는 정수 초만큼 높을 수있는 사용자 정의 값으로 설정할 수 있습니다. 약 40 억 초, 즉 136 년입니다. 이것은 commit마운트 옵션을 통해 사용할 수 있으며 다음과 같이 적용 할 수 있습니다 (이것은 단지 예일뿐입니다.에서 설정할 수도 있습니다 fstab).

mount /dev/sda1 -t ext4 -o rw,data=writeback,nobh,commit=12345678

커밋 간격은 데이터가 추가되는지 또는 기존 데이터를 덮어 쓰는지 여부와 같은 조건 유형을 기반으로하지 않습니다. commit(모든의 마운트 옵션을 제공하지 않는 경우 오초 기본값) 마운트 옵션을 bash 쉘에서이 같은 일을하는 것과 같습니다

#!/bin/bash
while :
do
    echo "Syncing all uncommitted data and journal to disk"
    sync
    sleep 5
done

혼동하지 마십시오. data=ordered이 전역 파일 시스템 동기화 간격 ( "커밋 간격"은 명령 줄 프로그램의 기능을 이해하는 사람들에게는 덜 의미있는 용어 sync일 수 있습니다.이 경우 "동기 간격"이라고 더 잘 지정 될 수 있습니다). 데이터 및 메타 데이터가 업데이트되는 순서data=ordered관한 것 입니다 ( "안전하지 않음 / 빠름"및 "보다 안전함 / 느림"). 파일 시스템 드라이버 자체가 모든 더티 데이터 / 저널 / 메타 데이터 / 물리적 미디어에 대한 전체 동기화를 강제로 수행하는 빈도에 관한 것입니다. 그리고 당신은 가장 확실하게 당신이 원하는 경우 1백36년로 설정하고 마운트 할 수 및 호출하지 않는 프로그램 이나 에 대한 RAM에 앉아 더러운 페이지가있는 것입니다 ...data=writebackdata=journalcommit=12345678data=writeback,nobhfsync()sync()

업데이트 : 질문 편집의 맥락에 따라 그래픽 드라이버 커널 패닉을 해결할 수있을 때까지 마운트 옵션 data=journal,commit=1또는 마운트 옵션을 사용하여 파일 시스템을 실행해야한다고 말하고 싶습니다 sync. 이렇게하면 최대 데이터 무결성은 유지되지만 성능은 저하됩니다. 잃어 버릴 여유가없는 데이터를 디스크에 자주 쓰는 경우 특히이 방법을 원할 것 fsync()입니다. 적절하게 사용하기 위해 사용하는 앱을 "신뢰"하지 않으면 매우 중요합니다 .

출처 : 여기 와 개인적인 경험


1
감사합니다. "모든 더티 데이터"부분은 제가 걱정했던 부분이었습니다! 지연된 할당 (커밋 간격 후에도 새 데이터가 쓰기 캐시에 남아있을 수 있음) 외에 더 많은 예외가 있을까 걱정이되었습니다.
lxgr

1
지연 된 할당은 호출 할 때 sync(또는 커밋 간격 타이머가 실행될 때와 완전히 관련이 없음) 확신합니다 . sync완료 시점 에는 더티 데이터, 메타 데이터 또는 저널 페이지가 전혀 없습니다. 동기식 데이터 전송 중 파일 시스템에 대한 모든 변경 사항은 완료 될 때까지 차단됩니다.
allquixotic

1
정말? 에서 bugs.launchpad.net/ubuntu/+source/linux/+bug/317781/comments/45 이 특별히 할당되지 않은 페이지가 커밋의 디스크에 기록되지 않습니다 언급되어있다 (하지만, fsync를 코스에의 ()). 패치는 할당을 강요하여 해당 동작에 문제가있는 일반적인 경우를 수정합니다. 그러나 데이터 덮어 쓰기에 대한 언급은 없습니다.
lxgr

1
아, 그래서 commit=...sync해당되지 않습니다? 아니면 tytso도 sync할당되지 않은 페이지를 커밋 하지 않는다는 것을 암시 합니까? POSIX 사양을 위반하기 때문에 그러한 경우라고 생각할 수 없습니다. 어쩌면 당신은 더 나은 데이터 안전성을 위해 내가 제공 한 bash 스크립트를 사용할 수 있습니다 : P
allquixotic

1
나는 그가 전자를 의미한다고 확신한다. 후자는 리눅스에서 ext4를 사용하기에 매우 위험한 파일 시스템으로 만들 것이다. 나는 그것을 시도하고 아마도 strace를 사용하여 가장 중요한 어플리케이션을 평가할 것이다. 아마도 그것들은 모두 fsync ()를 사용하고 있고 너무 걱정하고있다 ....
lxgr

1

귀하의 질문에 대한 답이 무엇이든 상관 없습니다.

보장 노출 에서 ext4 파일 시스템의 동작은 "데이터가 성공한 후 디스크에있을 것입니다 sync/ fsync전화". 따라서이 질문을하는 응용 프로그램이있는 경우 데이터 무결성을 보장해야하는 중요한 지점에 동기화 호출을 삽입해야합니다. 동일한 문제가 걱정되는 사용자는 sync명령 행 유틸리티를 호출하여 위험한 동작으로 인해 시스템이 비정상적으로 종료 될 수 있습니다.


fsync ()에 대해 알고 있습니다. 사용하거나 사용하지 않을 수있는 응용 프로그램 사용자로 요청하고 있습니다. 내 질문을 업데이트했습니다.
lxgr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.