Linux 커널 5.8 이상으로 업그레이드한 이후로 RAM 부족으로 인해 시스템이 정지되고 있으며 이러한 문제는 페이지 캐시에서 발생합니다.
OpenStreetMapplanet_latest.osm.pbf 파일의 데이터를 내가 사용하기에 더 효율적인 구조로 재구성하는 프로그램이 있습니다. 그러나 파일이 내 시스템의 RAM 용량(60GB 파일, 48GB RAM)보다 크기 때문에 페이지 캐시가 가득 찼습니다. 커널 5.8 이전에는 캐시가 꽉 차서 계속 작동했습니다(디스크 스래싱 증가). 5.8부터 페이지 캐시에서 페이지를 자동으로 해제하지 않기 때문에 시스템이 정지됩니다(예: Planet_latest.osm.pbf 파일을 순차적으로 읽을 때 30GB가 해제됨). 시스템을 정지시키기 위해 재구성자를 사용할 필요가 없습니다. 이를 수행하기 위해 다음과 같은 권한 없는 명령을 찾았습니다.
catPlanet_latest.osm.pbf>/dev/null
나는 fadvise64() 시스템 서비스를 사용하여 내가 전달한 행성 파일의 페이지를 수동으로 강제 해제하려고 했습니다. 도움이 되었지만 프로그램이 생성한 다양한 출력 파일의 문제를 완전히 해결하지는 못했습니다(특히 이러한 임시 출력 파일이 무작위로 다시 읽을 때 약간).
그렇다면 시스템 RAM이 부족해지면 어떻게 5.8~5.10 Linux 커널이 페이지 캐시에서 이전 페이지를 자동으로 해제하게 할 수 있습니까?
이 문제를 해결하기 위해 저는 캐시 크기를 모니터링하고 캐시가 너무 커지면 /proc/sys/vm/drop_caches에 쓰는 스크립트를 사용해 왔습니다. 물론 현재 사용하고 있는 새 페이지도 확보할 수 있습니다. 오래된 페이지.
while true ; do
H=`free | head -2 | tail -1 | awk '{print $6}'`
if [ $H -gt 35000000 ]; then
echo -n $H " @ " ; date
echo 1 >/proc/sys/vm/drop_caches
sensors | grep '°C'
H=`free | head -2 | tail -1 | awk '{print $6}'`
echo -n $H " @ "; date
fi
sleep 30
done
(센서의 목적은 디스크 집약적인 단계가 아닌 내 프로그램의 멀티스레드 CPU 집약적인 단계에서 CPU 과열을 감시하는 것입니다.)
kernel.org에 버그 보고서를 제출했지만 아직 검토하지 않았습니다.