프로세스를 시작하고 프로세스가 종료되기 전에 필요한 CPU 시간(사용자 + 시스템)을 측정하고 싶습니다.
나는 wait4
사용자와 시스템 시간을 포함하는 구조를 반환하는 시스템 호출을 사용할 수 있다는 것을 알고 있습니다(나는 두 시간의 합을 사용합니다).
나는 또한 사용할 수 있습니다cpuacct
cgroup 서브시스템, 프로세스를 새 cgroup에 넣고 cpuacct.usage
파일(사용자 시간과 시스템 시간의 조합이 포함되어 있음)을 읽습니다.
프로세스가 하위 프로세스를 생성할 때 전자에 문제가 있다는 것을 알고 있습니다(때때로 시간이 계산되지 않음). 그러나 단일 프로세스의 경우 두 측정값이 거의 동일해야 한다고 생각합니다. cgroup이 생성된 후에만 프로세스를 cgroup에 넣을 수 있기 때문에 cpuacct 값이 조금 더 작을 것으로 예상했습니다(그러나 포크 직후에 이 작업을 수행하므로 차이는 작아야 합니다).
이제 몇 초 정도 소요되는 프로세스에 대해 예상되는 결과가 표시됩니다.
예:
wait4: 8.292518s
cpuacct: 8.299105444s
wait4: 13.788861s
cpuacct: 13.796484557s
wait4: 24.229514s
cpuacct: 24.234132965s
wait4: 84.101255s
cpuacct: 84.104336222s
그러나 시간이 오래 걸리는 프로세스의 경우 다른 결과가 나타납니다.
wait4: 155.309706s
cpuacct: 155.306291274s
wait4: 505.547594s
cpuacct: 505.526723631s
wait4: 897.180069s
cpuacct: 897.131232685s
이제 cpuacct 값은 전혀 예상하지 못한 수준으로 약간 낮습니다. 왜 이런 일이 일어나는지 아는 사람이 있나요?
나는 0.1초의 정확도에 관심이 없고, 더 높은 차이를 경험한 적이 없습니다. 그 차이가 항상 그렇게 작을 것이라고 확신합니까? 아니면 그 차이가 더 클 수도 있나요?
문서에는 cpuacct
이 값이 두 가지 경우에 부정확할 수 있다고 명시되어 있습니다. 그러나 이러한 시나리오 중 어느 것도 적용되지 않습니다. 왜냐하면 저는 64비트 컴퓨터를 사용하고 있고 프로세스가 완료된 후 임의의 시간을 기다릴 수 있으며 cpuacct.usage
읽은 값은 동일하게 유지될 것이기 때문입니다. 오래된 값).
정확한 설정:
내 시작 프로세스는 Python 프로세스입니다. 나는 subprocess.Popen()
작업을 생성하고 os.wait4()
시간을 얻는 데 익숙합니다. cgroup을 사용하려면 preexec_fn
cgroup에 새 프로세스를 추가하는 인수를 함수에 전달합니다 (따라서 이는 시스템 호출 사이에 수행됩니다). 시작된 프로세스는 Java VM입니다. 관련성이 없다고 생각하지만 만약을 대비해 이 정보를 제공하고 싶었습니다.Popen
fork
exec