Определение того, что вызывает столько системного времени в моем исполняемом файле с привязкой к пользовательскому пространству в Linux - PullRequest
3 голосов
/ 22 октября 2011

Я работаю над проектом (язык программирования) и начинаю выполнять профилирование. Когда я запускаю время на моем факториальном тесте, я получаю следующее:

burton@smokey:~/repl$ time tests/fact.repl 

real    0m4.451s
user    0m1.820s
sys     0m2.620s

Моя проблема со временем системы. Я не делаю никаких системных вызовов, кроме чтения входных файлов (нет вывода). Это должно быть почти полностью привязанное к пользователю приложение. Я попытался запустить strace -c, чтобы увидеть, есть ли какие-то ошибочные системные вызовы, занимающие много времени, но ничего не нашел. Gprof также не дает мне ответов.

Существуют ли какие-либо другие инструменты для определения того, что занимает столько системного времени в моем приложении? Меня просто обманывает команда времени? Когда я запускаю sbcl, выполняя те же вычисления, системное время составляет около 0,03 секунды и то, на что я надеюсь.

Вот полный вывод strace -c:

burton@smokey:~/repl$ strace -c tests/fact.repl
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0         2           read
  -nan    0.000000           0         3           open
  -nan    0.000000           0         2           close
  -nan    0.000000           0         3           fstat
  -nan    0.000000           0        12           mmap
  -nan    0.000000           0         4           mprotect
  -nan    0.000000           0         1           munmap
  -nan    0.000000           0        16           brk
  -nan    0.000000           0         2           rt_sigaction
  -nan    0.000000           0         4           rt_sigprocmask
  -nan    0.000000           0         1         1 ioctl
  -nan    0.000000           0         3         3 access
  -nan    0.000000           0         1           execve
  -nan    0.000000           0         1           arch_prctl
  -nan    0.000000           0         2           setrlimit
------ ----------- ----------- --------- --------- ----------------
 100.00    0.000000                    57         4 total

Ответы [ 3 ]

2 голосов
/ 23 октября 2011

Время, которое требуется для выделения и страницы в вашей памяти, считается системным временем. Попробуйте /usr/bin/time tests/fact.repl - показывает количество ошибок на странице.

Кстати, «я не делаю никаких системных вызовов, кроме чтения входных файлов» и «я выделяю куски памяти» - противоречивые утверждения.

1 голос
/ 22 октября 2011

Я не делаю системные вызовы

Это кажется маловероятным, учитывая, что time печатает.

Сначала запустите вашу программу под strace -c. Это скажет вам, сколько системных вызовов вы выполнили, и какие из них заняли больше всего времени.

Как только вы узнаете «интересные» системные вызовы, вы можете получить дополнительную информацию с помощью strace -tt -T -e trace=<interesting syscall>. См. Страницу руководства для получения дополнительной информации.

Поскольку strace -c показывает (эффективно) 0 раз, возможно, вы разветвляете подпроцессы или создаете потоки? В этом случае strace -f может дать интересный вывод.

0 голосов
/ 22 октября 2011

У меня нет никаких подсказок, но ваша программа использует несколько потоков и примитивов синхронизации Posix (например, pthread_mutex_lock и т.д ...)?Потому что эти примитивы построены на некоторых системных вызовах (futex).

...