프로세스의 세분화된 메모리 로깅을 위해 top을 사용하면 해당 프로세스가 느려집니다.

프로세스의 세분화된 메모리 로깅을 위해 top을 사용하면 해당 프로세스가 느려집니다.

내 R 코드에서 메모리 소비 급증을 기록하려고 하는데 R 프로파일러 중 어느 것도 컴파일된 모듈의 메모리 소비를 측정할 수 없습니다. 그래서 저는 대안으로 top을 사용해왔는데 이것만으로도 제가 원하는 정보를 얻기에 충분했습니다. 문제는 짧은 메모리 급증을 포착하기 위해 지연을 매우 낮게 설정해야 하므로 top이 실행될 때 R 프로세스가 상당히 느리게 실행된다는 것입니다. top이 사용된 메모리를 읽는 방법을 완전히 이해하지 못하지만 이러한 속도 저하를 방지하기 위해 top 또는 다른 도구를 사용하는 방법이 있습니까?

내 bash 스크립트는 실제로 다음과 같습니다.

top -b -d 0.1 -p $1 | awk -v OFS="," -v metavar=$2 '@load "time"; $1+0>0 { printf metavar "%.3f,",gettimeofday(); print $10; fflush() }' >> ./other/bench.csv

코드 조각을 벤치마킹해야 할 때 R을 사용하여 새 프로세스를 생성하고 이 스크립트를 실행하여 나중에 csv 파일(여러 관련 벤치마크가 포함되어 있음)을 분할할 수 있도록 R의 PID와 몇 가지 추가 정보를 전달합니다. 그런 다음 벤치마킹 중인 코드의 실행이 완료되면 R은 최상위 실행 프로세스를 종료합니다.

편집: 이 글을 게시한 지 10분 후에 저는 스크립트의 다른 부분(awk 및 데이터를 파일로 출력)을 속도 저하의 원인으로 배제하려고 시도한 적이 없다는 것을 깨달았습니다. 출력을 null로 리디렉션하거나 삭제하면

>> ./other/bench.csv

그러면 감속이 사라질 것입니다. 이제 질문은 속도를 늦추지 않고 이 데이터를 저장하는 방법으로 옮겨진 것 같습니다.

답변1

내 질문에 대한 Sotto Voce의 의견 응답(R이 디스크 사용량에 민감할 수 있음을 시사함)에서 영감을 받아 tmpfs(메모리 내)를 사용하여 저장된 csv 파일에 로그 정보를 출력하려고 시도했는데 속도 저하가 완전히 사라졌습니다. 이는 벤치마크를 실행할 때 R이 파일 시스템을 사용하려고 한다는 것을 나타냅니다. 내 코드 중 어느 것도 파일에 명시적으로 액세스하지 않기 때문에 예상하지 못했던 결과입니다. 이제 테스트 데이터를 구축하는 데 사용하는 라이브러리 중 하나가 RAM 사용량을 줄이기 위한 방법으로 데이터를 저장하기 위해 뒤에서 디스크 저장소를 사용하고 있다고 의심됩니다(이것은 파일에서 데이터를 명시적으로 로드하기 위한 문서화된 기능이지만 분명히 코드에서 데이터가 동적으로 생성되는 경우에는 잘 문서화되어 있지 않습니다.

간단히 말해서, bash 스크립트의 top, awk 또는 기타 항목에는 문제가 없습니다. 디스크 액세스에 대한 예상치 못한 경합입니다.

관련 정보