CPU 시간 측정을 위해 wait4 및 cpuacct cgroup 사용

CPU 시간 측정을 위해 wait4 및 cpuacct cgroup 사용

프로세스를 시작하고 프로세스가 종료되기 전에 필요한 CPU 시간(사용자 + 시스템)을 측정하고 싶습니다.

나는 wait4사용자와 시스템 시간을 포함하는 구조를 반환하는 시스템 호출을 사용할 수 있다는 것을 알고 있습니다(나는 두 시간의 합을 사용합니다).

나는 또한 사용할 수 있습니다cpuacctcgroup 서브시스템, 프로세스를 새 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_fncgroup에 새 프로세스를 추가하는 인수를 함수에 전달합니다 (따라서 이는 시스템 호출 사이에 수행됩니다). 시작된 프로세스는 Java VM입니다. 관련성이 없다고 생각하지만 만약을 대비해 이 정보를 제공하고 싶었습니다.Popenforkexec

관련 정보