多くの接続を処理し、作業を完了する長寿命のプロセス(数ヶ月)がありますが、ほとんどの統計によると、作業はまったく行われていないことがわかりました。以下は多くのシステムコールを示していますが、CPU時間はゼロのstrace出力です。
% 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カーネルのバグが原因で発生します。
- 問題を解決すると約束します。https://github.com/torvalds/linux/commit/9d7fb04276481c59610983362d8e023d262b58ca
- メーリングリストに関する議論:https://lkml.org/lkml/2015/6/12/223