쓰기 캐시에 여유 메모리를 사용하고 싶습니다. Linux에서는 이 작업을 자동으로 수행하지만 사용하기 위해 조정하고 싶은 이상한 새로 고침 알고리즘이 있습니다.
최근에 디스크를 복사하는 데 사용했습니다 ddrescue
. 블록을 읽고 해당 블록을 디스크에 씁니다.
내가 원하는 것은 더 이상 사용 가능한 공간이 없을 때까지 읽기를 최대한 많이 읽은 다음 일부 공간이 해제될 때까지 차단하는 동시에 쓰기는 가능한 한 빨리 쓰기를 통해 메모리를 확보하는 것입니다.
따라서 디스크에 쓰는 것이 디스크에서 읽는 것보다 빠르면 메모리가 사용되지 않으며, 디스크에 쓰는 것이 디스크에서 읽는 것보다 느린 경우 복사가 완료될 때까지 모든 메모리가 계속 사용됩니다.
두 경우 모두 메모리 사용량은 동일하게 유지됩니다(다른 프로그램이 사용 가능한 메모리의 일부를 차지하지 않는 한).
그러나 내가 보는 것은 이것이다:
읽기는 캐시를 채우고(쓰기가 거의 없음) 캐시가 한계에 도달하면(또는 일정 시간이 지나면) 읽기가 차단됩니다.모두캐시가 디스크에 기록됩니다. 때때로 "동기화"를 실행하는 트롤과 거의 같습니다.
/proc/sys/vm/dirty_*를 변경해 보았지만 아무 소용이 없었습니다. 제가 할 수 있었던 유일한 변경은 상단의 높이였습니다. 따라서 /proc/sys/vm/dirty_*를 언급하는 답변은 들쭉날쭉한 패턴을 측정 가능하게 평탄화하는 테스트 값을 제공해야 합니다.
Linux에게 가능한 한 빨리 쓰기를 시작하되 사용 가능한 공간이 있는 경우 읽기 또는 쓰기를 차단하지 않도록 지시하는 조정은 아마도 내 목적에 적합할 것입니다.
나는 mbuffer
그래프를 평면화하지만 동적이 아니며(예: 사용 가능한 메모리가 낮을 때 여유 메모리) 조회를 허용하지 않으므로 유사한 프로그램에서 사용할 수 없습니다 ddrescue
(뒤로 살펴봐야 함).