데비안에게 USB 디스크 쓰기를 보다 적극적으로 버퍼링하도록 지시하려면 어떻게 해야 합니까?

데비안에게 USB 디스크 쓰기를 보다 적극적으로 버퍼링하도록 지시하려면 어떻게 해야 합니까?

저는 데비안 시스템에서 USB 스틱의 IO 전송 속도를 높이는 방법을 찾으려고 노력하고 있습니다. 아마도 캐싱을 사용할 수도 있습니다.

debootstrap배경: 나는 데비안 시스템을 디스크에 설치하는 스크립트를 작성했습니다 . 주로 USB 스틱으로 사용하고 싶습니다. 하지만 매우 느립니다(이유는 모르겠지만 이는 다른 주제입니다). 나는 이를 훨씬 더 빠르게 만드는 방법을 찾았습니다. 즉, 하드 드라이브의 일부 임시 이미지 파일이 지원되는 루프 장치에서 프로세스를 실행하는 것입니다. 그런 다음 dd이미지를 USB 드라이브에 복사합니다.

내 질문: 하드 드라이브에 임시 이미지 파일 없이도 이 속도만큼(또는 더 빠르게) 만들 수 있나요? 그 규모를 가늠하는 것은 쉬운 일이 아니다. 나에게는 그것이 생각보다 더 복잡하게 느껴진다. 그리고 필요 이상으로 느립니다. RAM도 넉넉하고 스왑 공간도 많습니다. USB 스틱에서 직접 프로세스를 실행할 때 커널에 모든 것을 보다 적극적으로 캐시하도록 지시할 수 있습니까? 실제로 이 모든 작업은 RAM에서 수행되며 내 프로그램을 차단하지 않고 백그라운드에서 가능한 한 빨리 메모리 스틱에 기록합니다. 결국 나는 달려가서 기다렸다가 sync막대기를 꺼냈다.

이상적으로는 비침습적이어야 합니다. 사용자 정의 커널은 옵션이 아니며 문제가 있는 방식으로 전역 시스템 설정을 재구성하지 않을 것입니다(이것은 나의 주요 워크스테이션이며 안정성이 떨어지는 것을 원하지 않습니다).

답변1

루프 장치가 ATA 캐시 플러시/ sync요청을 삭제했을 수 있습니다.매우일반 USB 스틱에서는 매우 느립니다. USB 디스크 수준에서 플러시를 비활성화하거나(를 실행하여 echo "write through" > /sys/block/$device/queue/write_cache) USB 스틱을 마운트하는 옵션(ext3/4 파일 시스템의 경우)을 사용하여 nobarrier유사한 결과를 얻을 수 있습니다 .

답변2

데비안 패키지 관리 도구는 업데이트 중에 시스템이 충돌하는 경우 일관된 상태가 되도록 fsync1을 호출하는 경우가 많습니다. 동기 호출은 장치가 쓰기를 완료할 때까지 기다려야 하며 이때 시스템이 충돌하더라도 데이터가 여전히 존재하는지 확인해야 합니다. USB 드라이브에서는 속도가 매우 느립니다(플래시 유형 메모리는 읽기는 빠르지만 쓰기는 느립니다).

설치하다eatmydata그리고 사용eatmydata주문하다달리기 debootstrap. 이렇게 하면 fsync호출이 아무 작업도 수행되지 않으므로 쓰기 속도가 훨씬 빨라집니다. 실행 중이 아닌 명령 eatmydata은 영향을 받지 않습니다. 설치 중에 시스템이 충돌하면 debootstrap 명령으로 작성된 내용이 작동하지 않을 수 있습니다. 이는 이것이 기본 시스템인 경우에는 문제가 되지만 USB 스틱인 경우에는 문제가 되지 않으며 처음부터 다시 시도할 수 있습니다.

이는 권한 상승 중에는 지속되지 않습니다. 예를 들어 대신 eatmydata실행해야 합니다 .sudo eatmydata debootstrap …eatmydata sudo debootstrap …

1 및/또는 fdatasync

관련 정보