确定什么是在Linux上的用户空间绑定的可执行文件中造成太多系统时间

我正在做一个项目(编程语言),我开始做一些分析。 当我运用我的因子testing时,我得到以下结果:

burton@smokey:~/repl$ time tests/fact.repl real 0m4.451s user 0m1.820s sys 0m2.620s 

我的问题是与系统时间。 除了读取input文件之外,我没有进行系统调用(没有输出)。 这应该是一个几乎完全用户时间限制的应用程序。 我已经尝试运行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 

在内存中分配和分页所花费的时间计为系统时间。 尝试/usr/bin/time tests/fact.repl – 它显示页面错误的数量。

顺便说一下,“除了读取输入文件之外,我没有进行任何系统调用”,“我正在分配内存”是矛盾的说法。

我没有做系统调用

考虑到什么time打印,这似乎不太可能

首先,在strace -c下运行你的程序。 这会告诉你你已经执行了多少个系统调用,以及哪个系统调用了大部分时间。

一旦你知道了“有趣的”系统调用,你可以用strace -tt -T -e trace=<interesting syscall>获得更多的细节。 有关更多信息,请参阅strace手册页 。

由于strace -c显示(有效)0时间,也许你正在分支子进程或创建线程? 在这种情况下, strace -f可能会提供有趣的输出。

我没有任何线索,但是你的程序使用多个线程和Posix同步原语(例如pthread_mutex_lock等)? 因为这些原语是建立在一些系统调用(futex)上的。