여러 병렬 프로세스의 누적 최대 메모리 사용량 측정

여러 병렬 프로세스의 누적 최대 메모리 사용량 측정

xargs를 사용하여 여러 프로세스를 병렬로 실행하고 있으며 누적 최대 메모리 사용량을 측정하고 싶다고 상상해 보세요. Linux에서 이 작업을 어떻게 수행할 수 있나요? GNU 시간은 내가 실행 중인 단일 프로세스에 대한 최고 RSS만을 측정합니다. 즉, 각 프로세스가 M GB의 메모리를 소비하고 그 중 N개를 실행하면 결과는 GNU 시간에서 제공하는 M이 아니라 N*M GB로 표시될 것으로 예상됩니다.

답변1

각 프로세스의 최대 메모리 사용량 합계에 관심이 있습니까, 아니면 프로세스의 최대 메모리 사용량 합계에 관심이 있습니까?

예를 들어 시스템에서 가장 큰 소비자 상위 5명의 최대 상주 메모리 사용량을 얻으려면 다음을 수행할 수 있습니다.

$ printf "PID\tPeak RSS usage (kB)\n"; grep VmHWM: /proc/*/status | sort -rnk2 | head -n 5 | perl -npe 's#^/proc/(\d+)/\S+\s+(\d+) kB$#$1\t$2#'
PID Peak RSS usage (kB)
19799   8515140
28243   930620
1357    911612
19833   766020
17926   734952

그러면 프로세스 기록에서 RAM 사용량이 가장 많은 5개 프로세스가 나열됩니다. 그러나 이러한 프로세스는 동일한 순간에 피크가 발생하지 않는 것이 일반적이므로 이러한 프로세스의 피크의 합은 모든 프로세스의 피크의 합보다 훨씬 낮을 수 있습니다.

여러 프로세스에 대한 프로세스 메모리 사용량의 최대 합계를 계산하는 신뢰할 수 있는 유일한 방법은 해당 프로세스 모음을 별도의 메모리에서 실행하는 것입니다 cgroup. 이론적으로는 프로그램을 실행 systemd-run --pipe --user --pty ...하고 해당 메모리의 최대 메모리 사용량을 모니터링 할 수 있습니다 cgroup. 그러나 내 경험상 임시 사용자 모드 그룹은 올바르게 구현할 수 없으므로 측정하려는 그룹을 포함하는 systemd-run별도의 시스템 수준을 만든 다음 해당 그룹에서 프로세스 트리를 시작해야 합니다. cgroup내가 시도한 것보다 더 새로운 배포판을 실행하고 있다면 systemd-run해킹 없이도 작동할 수 있습니다. 바라보다https://stackoverflow.com/a/61916151/334451더 알아보기. cgroup일반적으로 아래 어딘가에 설치되는 메모리 마운트를 보면 결과를 확인할 수 있습니다 /sys/fs/cgroup. 가능한 위치에는 하위 디렉터리 memory또는 가 포함 됩니다 unified. mount | grep cgroup귀하의 결과는 그럴 수도 있지만 memory.max_usage_in_bytes실제 상주 RAM 사용량이 아니라 커밋된 사용량이라고 생각합니다. 찾고 있는 항목을 지정하지 않았습니다. 자세한 통계는 memory.stat메모리 내부를 참조하세요 .cgroup

sleep임시 메모리 cgroup을 사용하는 경우 프로세스 트리가 완료된 후 cgroup을 삭제하기 전에 최대 메모리 사용량을 읽을 수 있는 충분한 시간을 확보하기 위해 긴 명령을 마지막 프로세스로 실행할 수 있습니다 .

관련 정보