【问题标题】:Why do pids jump in a container?为什么 pid 会在容器中跳转?
【发布时间】:2023-04-07 12:16:01
【问题描述】:

进入容器(例如docker rundocker exec)会使下一个创建的进程的PID向前跳,这是为什么呢?

例如,在下图中,容器中的第二个进程 (ps) 分配了 PID 10,而不是 PID 2:

根据这个answer,Linux 似乎是按顺序分配 PID,不是总是这样吗?

【问题讨论】:

  • 是否存在您的应用程序代码实际上依赖于这种行为的情况?您能否从您的问题中删除图像并将其替换为 minimal reproducible example,以文本形式显示您正在运行的代码及其产生的输出?

标签: linux docker containers pid


【解决方案1】:

曾与 runc 的维护者 Aleksa Sarai 交谈过,他解释了为什么会发生这种情况。

按照设计,golang 运行时会产生多个线程来管理一个进程。 runc 是用 golang 编写的,当构建/执行到容器中时,runc 进程在容器内运行的时间很短(在执行用户请求的可执行文件之前,例如 docker exec bash 中的 bash)。在 Linux 中,线程和进程都使用来自同一个池的 id 进行标识,因此 go 运行时线程被计入容器 pid 命名空间,从而导致了我描述的 pid 跳转。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多