Tensorflow-gpu를 기반으로 인공지능 추론 프로그램을 실행하고 있습니다.
을 실행하면 /usr/bin/strace -c -f /usr/bin/time ./program
다음과 같은 결과가 출력됩니다.
<my program's output>
367.91user 1032.14system 26:43.41elapsed 87%CPU (0avgtext+0avgdata 4158812maxresident)k <----OUTPUT OF TIME
1760inputs+24outputs (0major+4259846minor)pagefaults 0swaps
% time seconds usecs/call calls errors syscall <----OUTPUT OF STRACE
------ ----------- ----------- --------- --------- ----------------
88.45 34105.209840 7166 4759375 217371 futex
8.71 3356.854321 49032 68462 poll
2.68 1032.625515 2044803 505 wait4
0.05 21.006854 119 177269 clock_gettime
<..and some other syscalls that didn't took very long...>
------ ----------- ----------- --------- --------- ----------------
100.00 38559.038652 5385548 247845 total
내 프로그램만으로도 34105
몇 초가 걸렸다는 것을 알 수 있습니다 futex
.20배 더 길어짐경과된 시간 26:43.41
보다
strace
전체 코어에 대한 전체 시스템 호출 시간을 기록하는 것이라고 생각하여 taskset
코어 하나만 활성화(사용)한 상태에서 다시 실험해 보았으나 문제가 지속됩니다.
편집하다:
저는 작업 세트와 --all-tasks
옵션을 사용했습니다.
/usr/bin/taskset --all-tasks --cpu-list 0 /usr/bin/strace -c -f /usr/bin/time ./program
답변1
나를 보면 man strace
다음과 같습니다.
-c --summary-only ... If -c is used with -f, only aggregate totals for all traced processes are kept. -f --follow-forks Trace child processes as they are created by currently traced processes as a result of the fork(2), vfork(2) and clone(2) system calls. ...
여기서는 -c
및 를 지정합니다 -f
. 프로세스가 포크되거나 멀티스레드되는 경우 결과는 프로세스 전체에 걸쳐 집계됩니다. 예를 들어 여러 스레드가 모두 차단된 경우 futex()
현재 나타나는 동작을 볼 수 있습니다.
관찰한 비정상적으로 긴 시스템 호출 futex
은 차단 호출이므로 CPU 시간을 적극적으로 차지하지 않습니다. 여러 스레드가 모두 동일한 CPU에 고정되어 있더라도 동시에 호출을 차단할 수 있습니다.