为什么 strace 和 /proc/pid/stat 显示进程不占用 CPU 时间,尽管该进程正在工作?

为什么 strace 和 /proc/pid/stat 显示进程不占用 CPU 时间,尽管该进程正在工作?

有一个长期存在的进程(几个月),正在处理大量连接并完成工作,但大多数统计数据显示它的工作量为零。这是一个 strace 输出,显示了一堆系统调用,但 CPU 时间为 0:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0     66376           write
  0.00    0.000000           0     27579           close
  0.00    0.000000           0        77           stat
  0.00    0.000000           0        46           socket
  0.00    0.000000           0        46           connect
  0.00    0.000000           0     21360       347 accept
  0.00    0.000000           0    140039           sendto
  0.00    0.000000           0    169718     21567 recvfrom
  0.00    0.000000           0     21013           getsockname
  0.00    0.000000           0     21013           getpeername
  0.00    0.000000           0     42026           setsockopt
  0.00    0.000000           0        46           getsockopt
  0.00    0.000000           0     63177           fcntl
  0.00    0.000000           0     68858           gettimeofday
  0.00    0.000000           0      1861           clock_gettime
  0.00    0.000000           0       620           epoll_wait
  0.00    0.000000           0     96667           epoll_ctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                740522     21914 total

utime此过程的和字段stime非零,但完全静态,并且不接近我认识到的任何 int 溢出限制:

$ awk '{print "utime:" $14, "ctime:" $15}' /proc/128618/stat
utime:78891786 ctime:403631467

奇怪的是,我在其他几个盒子上看到了完全相同的症状,并且过程相同。这些都运行在内核 3.13.0 上。这个过程是单线程的,并且没有做任何花哨的事情(pgbouncer)。

为什么一个流程可以继续工作而没有任何这些统计数据反映该工作正在发生?

答案1

这是由 Linux 内核中的错误引起的。

相关内容