【问题标题】:How can i get host pid for a process running in a container?如何获取在容器中运行的进程的主机 pid?
【发布时间】:2020-04-27 07:54:13
【问题描述】:

我的容器在 kubernetes 中运行,我从 kubernetes 节点日志中看到了很多 OOM。 所有日志都只有进程 ID 信息。很难挖掘出什么容器OOM。 我不知道如何通过主机进程Id找到容器ID。

有什么方法可以在容器中获取主机进程 ID,以便我可以获取映射。

这是节点日志

2020-04-28 09:27:15.530 HKT
I0428 01:27:15.530763 1627 log_monitor.go:115] New status generated: &{Source:kernel-monitor Events:[{Severity:warn Timestamp:2020-04-28 01:27:08.060896434 +0000 UTC m=+89600.088785273 Reason:OOMKilling Message:Memory cgroup out of memory: Kill process 2493556 (node) score 1432 or sacrifice child

2020-04-28 09:29:15.000 HKT
Memory cgroup out of memory: Kill process 2493562 (node) score 1529 or sacrifice child Killed process 2493562 (node) total-vm:14009952kB, anon-rss:3146688kB, file-rss:28720kB, shmem-rss:0kB

2020-04-28 09:29:15.000 HKT
Memory cgroup out of memory: Kill process 2496433 (node) score 1275 or sacrifice child Killed process 2496433 (node) total-vm:7183684kB, anon-rss:1833580kB, file-rss:28804kB, shmem-rss:0kB

2020-04-28 09:29:15.309 HKT
I0428 01:29:15.309829 1627 log_monitor.go:115] New status generated: &{Source:kernel-monitor Events:[{Severity:warn Timestamp:2020-04-28 01:29:07.829961434 +0000 UTC m=+89719.857850273 Reason:OOMKilling Message:Memory cgroup out of memory: Kill process 2493562 (node) score 1529 or sacrifice child

2020-04-28 09:29:15.330 HKT
I0428 01:29:15.329925 1627 log_monitor.go:115] New status generated: &{Source:kernel-monitor Events:[{Severity:warn Timestamp:2020-04-28 01:29:07.849907434 +0000 UTC m=+89719.877796273 Reason:OOMKilling Message:Memory cgroup out of memory: Kill process 2496433 (node) score 1275 or sacrifice child

2020-04-28 09:48:29.000 HKT
Memory cgroup out of memory: Kill process 3086395 (monitor) score 237 or sacrifice child Killed process 3086395 (monitor) total-vm:130128kB, anon-rss:9204kB, file-rss:15488kB, shmem-rss:0kB

【问题讨论】:

  • 您是否在一个容器中运行多个进程?
  • 您在哪里看到这些日志?在节点本身还是在 pod 中?您可以编辑您的问题并添加您的日志吗?
  • @GiorgioCerruti 是的,容器中有多个进程
  • @mWatney 添加了日志

标签: docker kubernetes containers out-of-memory cgroups


【解决方案1】:

如何通过宿主进程Id查找pod名称?

nsenter -t $PID -u 主机名

我想你可以很容易地找到容器ID。

【讨论】:

    【解决方案2】:

    好吧,在我看来这是一个设计错误。我建议使用 1 个容器 - 1 个进程并让该进程成为主进程(PID 1)。这种设计会告诉你哪个 pod 有问题,因为 Kubernetes 会在进程达到内存限制后立即重启 pod。 无论如何,使用 Kubernetes,您应该看到哪个 pod 已经使用 kubectl get pods 重新启动,并看到错误启动的 pod 或重新启动计数器增加。 如果您只想使用节点日志,我不鼓励您使用它,您可能会发现此解决方案可以帮助您CoreOS - get docker container name by PID?

    【讨论】:

    • 很难确定只有 1 个进程 1 个容器。在容器内可能有很多子进程。最后,发现使用容器 ID 映射主机 pid 是没有意义的,因为子进程可能存在问题,例如子进程 OOM。而且父进程pid和OOM完全没有关系。所以最后我选择在节点中按时运行“ps aux --forest”,然后在那里获取进程的快照
    • 我看了一下“CoreOS - get docker container name by PID?”。它不符合我的需要。容器运行时,我需要在容器中获取主机 pid。该 docker 命令必须在主机内执行。仍然感谢@Giorgio 感谢您的回复
    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多