宿主机 TCP 连接高排查

k8s 节点宿主机上,TCP 连接数过高时,会导致节点负载升高,影响 Pod 正常运行。本文介绍如何排查宿主机 TCP 连接数过高的问题。

# 1. 查看当前 TCP 连接数
# alloc 数量 = TCP4 inuse + TCP6 inuse + closed - tw
cat /proc/net/sockstat  && echo "----------------" && cat /proc/net/sockstat6 && echo "----------------" && ss -s

# 2. 获取 tcp socket 过多的进程
for pid in $(ls /proc/ | grep '[0-9]'); do
    tcp_count=$(ls /proc/$pid/fd | wc -l );
    echo "$pid $tcp_count";
done | sort -k2,2n | tail -n 10

# 3. 查看进程对应 pod
# 根据 pid 获取 container id
cat /proc/<pid>/mountinfo | grep 'etc-hosts'

### container 运行时下
# 根据 container id 获取 pod 信息
crictl ps -o json | jq '.[][].labels | select (.["io.kubernetes.pod.uid"]=="<pod-uid>") | .["io.kubernetes.pod.namespace", "io.kubernetes.pod.name"]' |sort |uniq

### docker 运行时下
# 根据 pid 获取 container id
docker inspect $(docker ps -q) | jq -r --arg PID "<pod-pid>" ' .[] | select(.State.Pid ==($PID|tonumber)) | "\(.Config.Labels."io.kubernetes.pod.namespace") \(.Config.Labels."io.kubernetes.pod.name") \(.Config.Labels."io.kubernetes.container.name")" '