有一个长期存在的进程(几个月),正在处理大量连接并完成工作,但大多数统计数据显示它的工作量为零。这是一个 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 内核中的错误引起的。