一个关于 Linux 进程的奇怪问题

2021-02-07 17:31:45 +08:00
 zhoudaiyu
是这样的,今天发现 k8s 有 2 台 master 节点 CPU 使用率有尖峰( k8s 1.11 Linux 3.10 1.13.1 ),由于没有当时进程状态快照,只能用 top 每秒抓一次进程扔日志里。果然过了一段时间,发现了几个叫 docker-containerd-current 的进程 cpu 飙升导致 CPU 使用率高达 90%,但是我们通过 ps pgrep 等等手段都查不到这个进程了,所以考虑是不是当时突然启动了这些进程然后又死了,后来想从 /proc 里查有没有啥信息,奇怪的事发生了:ll -arth /proc|grep $PID 通过 pid 号对应文件夹查不到这个进程,但是 cd $PID 居然可以进到进程的文件夹里,然后我不死心,退回到 /proc 里又肉眼看了一遍文件夹,还是没找到。进到 /proc/$PID 内查看了 exe 对应的二进制文件,然后通过 ps -ef|grep $EXE_FILE 发现对应的进程启动时间还是去年。

这里的问题就是 /proc 下面的以 pid 命名的文件夹不应该是正在运行着的进程的么?进程确实死了,通过文件名也查不到了,但是为什么可以进到一个根本不存在的文件夹呢?

重点是图里面圈中的部分。
2651 次点击
所在节点    Linux
24 条回复
howellz
2021-02-07 19:54:11 +08:00
没细看,不过 docker 不就是利用 namespace 来隔离进程和文件系统(包括 proc )的么?
zhoudaiyu
2021-02-07 19:55:39 +08:00
@lcdtyph 学习到了 十分感谢!!
zhoudaiyu
2021-02-08 08:15:50 +08:00
@howellz 但是宿主机上应该都能看到才对
liuxu
2021-02-10 15:08:47 +08:00
@howellz 学到了,多谢大佬,学习了


$ man procfs
/proc/[tid] subdirectories
Each one of these subdirectories contains files and subdirectories exposing information about the thread with the corre‐
sponding thread ID. The contents of these directories are the same as the corresponding /proc/[pid]/task/[tid] directo‐
ries.
The /proc/[tid] subdirectories are not visible when iterating through /proc with getdents(2) (and thus are not visible
when one uses ls(1) to view the contents of /proc).


然后用 sysdig 抓 ls /proc
第一个命令行:$ sudo sysdig proc.name = ls
第二个命令行:$ ls /proc
然后第一个命令行得到:
...
333156 14:54:19.153132412 4 ls (671251) > stat
333159 14:54:19.153141644 4 ls (671251) < stat res=0 path=/proc
333160 14:54:19.153149403 4 ls (671251) > openat
333161 14:54:19.153159898 4 ls (671251) > fstat fd=-82524538700541
333162 14:54:19.153161715 4 ls (671251) < fstat res=0
333164 14:54:19.153169912 4 ls (671251) > getdents64 fd=137455746819
333175 14:54:19.154214139 4 ls (671251) < getdents64 res=11840
333176 14:54:19.154223263 4 ls (671251) > lstat
333177 14:54:19.154232665 4 ls (671251) < lstat res=0 path=/proc/fb
333178 14:54:19.154238761 4 ls (671251) > lstat
333179 14:54:19.154242851 4 ls (671251) < lstat res=0 path=/proc/fs
333180 14:54:19.154247207 4 ls (671251) > lstat
333181 14:54:19.154250957 4 ls (671251) < lstat res=0 path=/proc/bus
333182 14:54:19.154254649 4 ls (671251) > lstat
333183 14:54:19.154257514 4 ls (671251) < lstat res=0 path=/proc/dma
333184 14:54:19.154260911 4 ls (671251) > lstat
333185 14:54:19.154263837 4 ls (671251) < lstat res=0 path=/proc/i8k
...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/752138

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX