쓰기 캐시에 사용 가능한 메모리를 사용하고 싶습니다. Linux는 자동으로 이를 수행하지만 사용에 맞게 조정하고 싶은 이상한 플러시 알고리즘이 있습니다.
ddrescue
최근에 디스크를 복사하는 데 사용했습니다 . 블록을 읽고 해당 블록을 디스크에 씁니다.
내가 원하는 것은 더 이상 여유 공간이 없을 때까지 읽기를 가능한 한 많이 읽은 다음 일부 공간이 비워질 때까지 차단하는 동시에 쓰기는 메모리를 확보하기 위해 가능한 한 빨리 쓰는 것입니다.
따라서 쓰기 디스크가 읽기 디스크보다 빠르면 메모리가 사용되지 않으며, 쓰기 디스크가 읽기 디스크보다 느리면 복사가 완료될 때까지 모든 메모리가 사용됩니다.
두 시나리오 모두에서 메모리 사용량은 일정하게 유지됩니다(다른 프로그램이 사용 가능한 메모리의 일부를 차지하지 않는 한).
그러나 내가 보는 것은 이것이다:
읽기는 캐시를 채우고(쓰기가 거의 또는 전혀 수행되지 않는 동안) 캐시가 한계에 도달하면(또는 일정 시간이 지난 후) 읽기가 차단됩니다.모두캐시가 디스크에 기록됩니다. 그것은 마치 트롤이 가끔씩 '동기화'를 실행하는 것과 같습니다.
나는 /proc/sys/vm/dirty_*를 아무 소용이 없도록 변경해 보았습니다. 내가 유발할 수 있었던 유일한 변화는 상단의 높이입니다. 따라서 /proc/sys/vm/dirty_*를 언급하는 답변은 톱니 그래프를 측정 가능하게 평탄화하는 테스트된 값을 제공해야 합니다.
Linux에 최대한 빨리 쓰기를 시작하되 여유 공간이 있으면 읽기 또는 쓰기를 차단하지 않도록 조정하는 것이 내 목적에 가장 적합할 것입니다.
와 같은 도구를 알고 있습니다 mbuffer
. 그래프를 평평하게 만들지만 동적이지 않고(예: 사용 가능한 메모리가 낮을 때 메모리 해제) 검색을 허용하지 않으므로 ddrescue
(앞뒤로 검색해야 하는) 같은 프로그램에서는 작동하지 않습니다.