동일한 인스턴스를 여러 번 실행하는(5.15.0-72-generic - 20.04.1-Ubuntu - x86_64) OSv 프로젝트에 대한 테스트베드가 있습니다. 단일 실행 스크립트를 실행하는 것은 매우 간단하며 다음과 같습니다.
while [ $x -le $t ]
do
./scripts/capstan_run.sh "$delay"
now="$(date +'%d%m%Y-%H%M%S')"
./scripts/stats.sh > stats/"$x"_"$delay"_stats_"$now".txt & PID=$!
sleep "$delay" #sleep delay mills for the execution
kill $PID ; wait $PID 2>/dev/null
echo "Delay $delay before fetches"
sleep "$delay" #sleep delay mills before fetch files
./scripts/fetch_files.sh "$delay"
./scripts/shutdown_vm.sh
((x++))
done
capstun_run.sh
QEMU 가상화 계층에서 수행되는 컨테이너 시작 에뮬레이션을 사용합니다. 그런 다음 절전 모드로 전환하고 인스턴스에서 파일을 검색합니다. 이 shutdown.sh
스크립트는 QEMU를 종료합니다.
killall qemu-system-x86_64
실행 사이에 메모리 사용량이 증가하는 것을 관찰했습니다. 그것은 일정하며 결코 감소하지 않습니다.서버에는 126G RAM과 24개의 CPU가 있습니다.
예를 들어, 사용된 메모리는 8%에서 시작하여 0.1%씩 12%까지 증가하는 것을 관찰할 수 있습니다.
Date Memory Disk CPU
...
07/04/2023-163242 12.03% 27% 15.00%
07/04/2023-163247 12.03% 27% 16.00%
07/04/2023-163252 12.03% 27% 16.00%
07/04/2023-163257 12.03% 27% 16.00%
07/04/2023-163303 12.03% 27% 16.00%
07/04/2023-163308 12.04% 27% 16.00%
07/04/2023-163313 12.03% 27% 16.00%
07/04/2023-163318 12.04% 27% 15.00%
07/04/2023-163323 12.04% 27% 16.00%
07/04/2023-163328 12.04% 27% 16.00%
07/04/2023-163334 12.04% 27% 16.00%
07/04/2023-163339 12.04% 27% 16.00%
07/04/2023-163344 12.06% 27% 16.00%
07/04/2023-163349 12.08% 27% 16.00%
07/04/2023-163354 12.09% 27% 16.00%
07/04/2023-163359 12.09% 27% 15.00%
07/04/2023-163405 12.09% 27% 15.00%
07/04/2023-163410 12.09% 27% 15.00%
07/04/2023-163415 12.09% 27% 15.00%
QEMU에 메모리 누수가 있나요?
===업데이트===
stats.sh는 다음과 같이 사용된 % mem을 계산합니다.
free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }
그래서 "used/total*100"에 캐시가 포함되어 있지 않기 때문에 버그가 있다고 생각합니다.
내 평가가 맞나요?
답변1
QEMU 프로세스가 종료되면 커널은 사용 중이던 모든 메모리를 해제한 것입니다. 자체 주소 공간 내의 메모리 누수는 프로세스 자체가 종료된 후에도 유지되지 않습니다. 캐싱에 메모리가 사용되는 것을 볼 가능성이 더 높습니다. 이 메모리는 성능을 향상시키는 데 사용되며 필요할 때 언제든지 회수할 수 있습니다. 캐싱에 사용되는 메모리는 일반적으로 메모리 부족을 증가시키지 않습니다.
가능성은 낮지만 QEMU가 tmpfs와 같은 가상 주소 공간 외부에 메모리를 할당할 가능성이 있습니다(캐시 메모리로 간주되지만 삭제할 수는 없음). 프로세스가 자동으로 해제되지 않는 리소스를 사용할 수 있는 방법은 여러 가지가 있습니다.다른프로세스에서 리소스가 누출됩니다.파일 설명자를 닫을 수 없습니다.. QEMU가 어떻게 사용되는지 자세히 알지 못하면 이것이 사실인지 알 수 없지만 그럴 가능성은 없습니다.
free
'사용 가능' 필드 가 아닌 '사용 가능' 필드를 사용해야 합니다 . 후자가 캐싱을 줄이는 반면, 캐시된 메모리로 간주되는 일부 메모리는 회수할 수 없습니다. 한때 있었던 들판,2014년에 추가됨는 실제로 사용 가능한 메모리를 보다 정확하게 표현한 것입니다.
많은 로드 밸런싱 및 작업 부하 배치 프로그램은 /proc/meminfo를 확인하여 사용 가능한 메모리 양을 추정합니다. 일반적으로 "무료"와 "캐시"를 추가하여 이 작업을 수행하는데, 이는 10년 전에는 괜찮았지만 오늘날에는 거의 확실히 잘못된 것입니다.
Cached에는 공유 메모리 세그먼트, tmpfs 및 ramfs와 같이 페이지 캐시로 해제할 수 없는 메모리가 포함되어 있고 대부분의 유휴 시스템에서 대부분의 메모리를 차지할 수 있는 회수 가능한 슬랩 메모리가 포함되어 있지 않기 때문에 이는 잘못된 것입니다. 시스템 메모리의 파일.
awk
줄을 다음으로 바꿔야 합니다 .
awk '$1 == "MemTotal:" {total=$2} $1 == "MemAvailable:" {avail=$2} END {printf "%.2f%%\t\t", (avail/total)*100}' < /proc/meminfo
계산에 사용 가능한 메모리를 사용하는 것 외에도 안정적인(예측 가능한) 형식을 가지며 기계에서 읽을 수 있는 를 대신 사용 /proc/meminfo
합니다 free
.