데이터를 디스크에 플러시하기 전에 Linux가 특정 블록 장치의 쓰기 캐시에 캐시하는 데이터 양을 제한하는 방법이 있습니까?
내 서버에는 많은 RAM(약 64GB)이 있습니다. 회전하는 미디어(예: 느린 미디어)나 느린 USB 플래시 드라이브에 대용량 파일을 쓸 때마다 Linux 캐시가기가바이트RAM에 쓸 수 있는 데이터의 양입니다. 이는 소량의 데이터만 쓰는 많은 작업에 적합하며 Linux는 결국 캐시를 디스크에 플러시합니다.
그러나 대용량 파일에 대해 대규모 작업을 수행할 때 쓰기 캐시와 그에 따른 새로 고침으로 인해 UI가 매우 고르지 않게 보입니다. pv
대용량 파일을 RAM 디스크에서 쓰기 속도가 느린 USB 플래시 드라이브의 안정적인 저장소로 전송하는 간단한 예를 들어보겠습니다 . 1GB가 넘는 데이터를 엄청난 속도로 읽은 다음 일반 디스크 쓰기 속도로 느려지지만, 쓰기가 완료되면 캐시를 플러시하는 데 1분 이상이 걸립니다.
다른 응용 프로그램은 거의 즉시 여러 번의 쓰기 작업을 수행한 다음 잠시 동안 완전히 중지한 다음 즉시 또 다른 쓰기 작업을 수행한 다음 중지하는 것처럼 보입니다. 회전하는 디스크는 너무 느리기 때문에 때로는 캐시 플러시 지연으로 인해 프로세스가 120초 이상 중단되면서 커널 OOPS가 트리거될 수 있습니다. 이 효과는 ffmpeg를 사용하여 파일을 리믹스하고, VMware 디스크 이미지를 전송하고, 대규모 연속 파일에 유사한 "일괄" 쓰기 작업을 수행하는 등의 작업으로 인해 종종 발생합니다.
나는 Linux에게 "캐시 플러시를 시작하기 전에 /dev/sdX 장치에 최대 64MB의 데이터만 캐시하라"고 말할 수 있기를 원합니다. 이는 위의 예에서 pv
UI에 쓰기가 완료되었음을 표시한 후에 최대 64MB의 데이터만 쓸 수 있음을 의미합니다. sync
명령을 입력하려면 64MB만 플러시해야 합니다. (이제 Linux는 기가바이트의 데이터를 캐시하고 쓰기 속도가 초당 한 자릿수 또는 수십 메가바이트에 불과한 장치로 플러시하기 때문에 a pv
다음에 a를 실행하면 2분 이상 sync
중단될 수 있습니다 . )sync
시스템 전체 쓰기 캐싱을 반드시 제한하고 싶지는 않습니다. 예를 들어 SSD의 부팅 드라이브는 확실히 캐싱의 이점을 얻을 수 있고 매우 작은 쓰기와 관련된 일반적인 작업도 캐싱을 통해 많은 이점을 얻을 수 있기 때문입니다. 큰 파일이 눈에 보이는 곳에 어느 정도 순차적으로 기록되는 경우에만 해당됩니다.
편집: 제가 가장 좋아하는 배포판은 Arch Linux이지만 다른 배포판에 대한 지침을 내 설정에 맞게 조정하는 데 꽤 능숙합니다.