AI Infra 训练营
总览
  • 总览
  • 完整安装
  • 核心 K8s
  • Cilium 网络
  • Longhorn 存储
  • 监控日志
  • CI / GitOps
  • 安全准入
  • CI/CD 实战(MySQL+Go+Vue)
  • HPA/Ingress/Hubble 实战
  • 面试速查 + 真实踩坑
  • Day 0 · 新手接管 Runbook
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
  • 心智模型
  • 看懂命令输出
  • 容器网络底层
  • K8s 网络深入
  • DNS 全套
  • 故障排查方法论
  • 心智模型
  • 容器挂载完整指南
  • K8s Volumes 大全
  • PV/PVC/CSI 深入
  • NFS 深入
  • 分布式存储概览
  • 故障排查 runbook
命令手册
HiHuo 主站
GitHub
总览
  • 总览
  • 完整安装
  • 核心 K8s
  • Cilium 网络
  • Longhorn 存储
  • 监控日志
  • CI / GitOps
  • 安全准入
  • CI/CD 实战(MySQL+Go+Vue)
  • HPA/Ingress/Hubble 实战
  • 面试速查 + 真实踩坑
  • Day 0 · 新手接管 Runbook
  • Day 1 · 集群起步 + CNI
  • Day 2 · 控制面 + etcd
  • Day 3 · CRD + Operator + Webhook
  • Day 4 · 存储深度
  • Day 5 · 卷扩容 + 安全
  • Day 6 · 调度 + 可观测
  • Day 7 · Harbor + ArgoCD + Mesh
  • Day 8 · AI Infra
  • Day 9 · Triton + GPU
  • Day 10 · MIG + HPA + 量化
  • Day 11 · AI Agent 端到端
  • Day 12 · 灾备
  • Day 13 · Operator + 联邦 + Mesh + RAG
  • Day 14 · CKA / CKS + 总结
  • LLM 训练手册
  • RAG + Agent 手册
  • 推理优化手册
  • 上下文工程手册
  • Agent 开发手册
  • 面试深度复盘
  • 训练 v2 深度手册
  • 心智模型
  • 看懂命令输出
  • 容器网络底层
  • K8s 网络深入
  • DNS 全套
  • 故障排查方法论
  • 心智模型
  • 容器挂载完整指南
  • K8s Volumes 大全
  • PV/PVC/CSI 深入
  • NFS 深入
  • 分布式存储概览
  • 故障排查 runbook
命令手册
HiHuo 主站
GitHub
  • 命令手册总览
  • SSH 与远程执行

    • ssh —— 远程登录与远程执行
    • ssh-config —— ~/.ssh/config 客户端配置文件
    • ssh-keygen —— 密钥对生成与 known_hosts 维护
    • sshd —— SSH 服务端守护进程与硬化
    • sshpass —— 密码登录自动化(仅限"首次推 key"场景)
    • scp / rsync —— 远程文件拷贝
    • nsenter —— 进入 Linux namespace 的"传送门"
  • 系统状态与诊断

    • systemd-detect-virt —— 探测当前运行环境的虚拟化类型
    • systemctl —— systemd 服务管理的总入口
    • journalctl —— systemd 日志查询
    • hostnamectl / timedatectl —— 改主机名与时区
    • ss —— socket statistics(替代 netstat)
    • lsblk / df / du —— 三个被混淆的"看磁盘"命令
  • 进程与资源

    • ps —— 看进程
    • top / htop —— 实时进程资源监控
    • lsof —— 列出打开的文件(list open files)
    • strace —— 系统调用追踪
    • dmesg —— 看内核环形缓冲日志
    • iostat —— 磁盘 I/O 性能分析
    • iotop —— 进程级 I/O 实时监控
  • 文本与文件批处理

    • grep —— 文本搜索
    • sed —— 流编辑器
    • awk —— 按字段处理文本
    • jq —— JSON 命令行处理器
    • find —— 按各种条件找文件
    • xargs —— 把 stdin 喂给下一个命令
    • tee —— 一边输出、一边写文件
  • 磁盘与存储

    • mount / umount —— 挂载文件系统
    • mkfs —— 格式化文件系统
    • /etc/fstab —— 持久化挂载配置
    • parted / fdisk —— 分区表管理
    • LVM —— pvcreate / vgcreate / lvcreate 三件套
    • findmnt —— 现代化的"看挂载"命令
    • nfsstat / showmount —— NFS 状态与性能
    • smartctl —— 盘健康检查与坏盘预警
  • 网络诊断

    • curl —— HTTP 客户端的瑞士军刀
    • ip —— 现代 Linux 网络配置工具(替代 ifconfig / route)
    • iptables —— Linux 内核包过滤 / NAT 规则
    • tcpdump —— 命令行抓包
    • dig —— DNS 查询工具
    • mtr —— traceroute + ping 合体
    • iperf3 —— 网络带宽测试
    • nc (netcat) —— 网络瑞士军刀
    • ethtool —— 物理网卡参数 / 速率 / offload
  • 内核 / 包管理 / 时间

    • modprobe / lsmod —— 内核模块加载
    • sysctl —— 内核运行时参数
    • apt / apt-get / dpkg —— Debian / Ubuntu 包管理
    • chrony / chronyc —— NTP 时间同步
  • K8s / 容器工具链

    • kubectl —— K8s 的瑞士军刀
    • kubeadm —— K8s 集群引导工具
    • helm —— K8s 应用包管理器
    • crictl —— 容器运行时命令行(CRI 层)
    • etcdctl —— 直连 K8s 元数据存储
    • docker —— 单机容器(构建和本地开发)
  • 监控 / GitOps / 备份

    • argocd —— GitOps CLI
    • velero —— K8s 集群备份恢复
    • prometheus / promtool —— 监控数据查询和工具
    • cilium / cilium-cli / hubble —— eBPF CNI 排错
    • grafana / grafana-cli —— 可视化平台运维
    • alertmanager / amtool —— 告警分组、抑制、路由
  • 开发 / 构建 / 终端

    • git —— 版本控制 + GitOps 的底座
    • make / Makefile —— 任务编排
    • openssl —— 证书 / 密钥 / TLS 调试工具箱
    • tmux —— 终端复用 / 长跑任务防掉线
    • vim —— 远程编辑必备最小集
    • cron / crontab —— 定时任务

ss —— socket statistics(替代 netstat)

一句话定义

ss 是现代化的 netstat 替代品,用来看本机的网络套接字(socket):谁在监听哪个端口、谁连到了谁、连接状态是什么。比 netstat 快几个数量级(直接读内核 netlink 而不是 /proc)。

典型场景

  • 装机后:ss -lntp 看监听端口,确认只有 sshd 在监听(22)+ systemd-resolved(53),没有意料之外的服务
  • 排查"端口被占用":ss -lntp | grep :8080 找谁占着 8080
  • 看 K8s 节点和 control plane 的连接:ss -tnp | grep 6443
  • 看 kube-proxy 创建的连接:ss -tn | head -100

netstat 在 Ubuntu 22 / RHEL 8+ 默认已经不预装。先学 ss、忘了 netstat 也没事。


5 个核心 flag(90% 够用)

ss -lntp                         # 看 TCP 监听
ss -tn                           # 看所有 TCP 连接(含已建立的)
ss -tunap                        # TCP + UDP,全部,所有状态,含进程
ss -s                            # 概览统计
ss -t state established          # 按状态过滤
flag含义备注
-llistening 只看监听不加 -l 会列已建立的连接
-nnumeric 不解析名字关键:不加这个会做 DNS 反解,慢且会卡住
-tTCP
-uUDP
-pprocess 显示哪个进程占用需要 root(看别人进程要 root)
-aall 含 listening + established
-4 / -6只 IPv4 / 只 IPv6
-ssummary 概览统计

"必加 -n" —— 不加的话 ss 会反向解析 IP 和端口号成主机名/服务名,慢、可能卡住、且对运维没用。养成 ss -lntp 这个肌肉记忆,不要 ss -ltp。


看监听端口(最常用)

$ ss -lntp
State    Recv-Q    Send-Q    Local Address:Port    Peer Address:Port    Process
LISTEN   0         128             0.0.0.0:22              0.0.0.0:*    users:(("sshd",pid=1234,fd=3))
LISTEN   0         128       127.0.0.53%lo:53              0.0.0.0:*    users:(("systemd-resolve",pid=890,fd=14))
LISTEN   0         128                [::]:22                 [::]:*    users:(("sshd",pid=1234,fd=4))

读法:

  • LISTEN —— 这个 socket 在监听
  • Local Address:Port —— 监听在哪
    • 0.0.0.0:22 —— 所有 IPv4 地址的 22 端口
    • 127.0.0.1:9100 —— 只监听本机
    • [::]:22 —— 所有 IPv6 地址
    • 192.168.1.5:80 —— 只监听这个具体 IP
  • Recv-Q / Send-Q —— 队列长度,对 LISTEN socket 是 backlog 上限
  • Process —— 哪个进程在监听(需要 root 看完整)

装机健康检查

ss -lntp
# 干净的 Ubuntu 22 应该只看到:
#   :22         sshd
#   127.0.0.53:53   systemd-resolve
# 如果还有别的(agent / xrdp / mysqld 等),先查清楚是什么再决定

Day0 §1 用这个命令排除 IDC 预装的乱七八糟的"agent"。


找谁占了某个端口

ss -lntp | grep :8080
ss -lntp '( sport = :8080 )'     # 更精准的 ss 自身过滤语法

grep :8080 简单粗暴;但如果想精确(避免匹配到 :80800、:18080),用 ss 自带的过滤语法:

ss -lntp sport = :8080

注意 sport(source port)对应监听端口,对端连接的话用 dport。


看已建立的连接

ss -tn                           # 不加 -l,显示已建立 + 各种状态
ss -tn state established         # 只看 ESTABLISHED
ss -tn state time-wait           # 看 TIME_WAIT(防止连接耗尽用)

输出:

State        Recv-Q  Send-Q  Local Address:Port    Peer Address:Port
ESTAB        0       0       10.0.24.28:43210      10.0.24.29:6443
ESTAB        0       0       10.0.24.28:48772      10.0.24.30:2379

K8s 节点上 :6443 是 apiserver、:2379 是 etcd。可以快速看出节点都连到了哪些控制面组件。

TCP 状态速查

状态含义
LISTEN监听中
ESTAB (ESTABLISHED)连接建立、数据可流
TIME-WAIT主动关闭方等待 2*MSL,避免连接错乱
CLOSE-WAIT对端发了 FIN、本端还没 close —— 数量大说明应用有 bug
FIN-WAIT-1 / FIN-WAIT-2关闭过程中
SYN-SENT等服务端响应 SYN-ACK
SYN-RECV服务端收到 SYN 等 ACK

CLOSE-WAIT 堆积是经典 bug 信号 —— 应用代码没正确关 socket。netstat -tn | grep CLOSE-WAIT | wc -l 数一下,几百以上要查。


进程视角:某进程开了哪些 socket

ss -tnp | grep "pid=1234,"        # 按 PID 找
ss -tnp | grep '"nginx"'          # 按进程名找

或者结合 lsof:

lsof -nP -iTCP -p 1234

概览统计

$ ss -s
Total: 234
TCP:   45 (estab 12, closed 18, orphaned 0, timewait 12)

Transport Total     IP        IPv6
RAW       0         0         0
UDP       8         5         3
TCP       45        38        7
INET      53        43        10
FRAG      0         0         0

快速判断"是不是连接太多了"。一台正常工作的 K8s 节点 TCP 数百到几千是正常的。


ss 自带的强大过滤语法

netstat 时代靠 grep 拼,ss 内置了表达式:

ss -tn dst 10.0.24.0/24                    # 目的地址在某网段
ss -tn dport = :6443                       # 目的端口 6443
ss -tn '( sport = :22 )'                   # 源端口 22
ss -tn 'sport = :22 or dport = :22'         # 复合条件
ss -tn 'src 10.0.24.28 and dport :2379'    # 复合

不过 90% 场景用 grep 就够。表达式语法记不住就别强求。


看 unix socket(K8s 排错常用)

ss -x                            # unix sockets
ss -xa | grep docker
ss -xa | grep crio

K8s + containerd / docker 大量靠 unix socket 通信(/var/run/docker.sock、/run/containerd/containerd.sock、kubelet 的 socket)。排查"kubelet 连不上 containerd" 这种问题:

ss -xan | grep containerd
ls -l /run/containerd/containerd.sock

ss vs netstat 对应关系

如果你以前用 netstat 的肌肉记忆:

netstatss
netstat -tnlpss -tnlp
netstat -tnpss -tnp
netstat -an | grep :80ss -an | grep :80 或 ss -an sport = :80
netstat -sss -s(但 ss 简单很多,看完整协议栈用 nstat -a)

ss 还能做的(netstat 不能):

  • 按地址段、端口范围过滤
  • -K 干掉一个 socket(运维硬手段)

常见踩坑

坑 1:忘加 -n,ss 卡住

ss -ltp                          # 卡半天

不加 -n 会做 DNS 反解 / /etc/services 服务名解析。万一你的网络反向 DNS 慢、或者 /etc/services 巨大,ss 会卡。

永远加 -n。

坑 2:看不到进程名

ss -lntp
# Process 列是空的

非 root 跑的话只能看到自己进程的信息。sudo ss -lntp 或者 ssh root@... 'ss -lntp'。

坑 3:把"看监听"和"看连接"搞混

ss -lntp                         # 加 -l 只看 listening
ss -ntp                          # 不加 -l 看所有已建立连接
ss -lntp + ss -ntp 不会有重复     # listening 不是 established

混淆点:很多人记着 -a(all),但 -a 是"含 listening"的意思,不是默认行为。ss -tn 默认就是非 listening 的所有状态。

坑 4:端口看起来没人监听,但程序说被占用

ss -lntp | grep :8080            # 啥也没有
# 但 nc -lk 8080 报 Address already in use

可能:

  1. 监听在 IPv6 但你只查了 IPv4(去掉 -4、或加 -6 看看)
  2. socket 在 TIME_WAIT,端口暂时占用(SO_REUSEADDR 一般能复用)
  3. 监听的是 unix socket,不是 TCP(用 ss -x 查)

坑 5:Recv-Q 持续涨

LISTEN 状态下 Recv-Q 是已建立但未被 accept 的连接数。如果持续大,说明应用 accept 不过来 —— 应用没启动、卡死、或者 accept 线程数不够。

ESTABLISHED 状态下 Recv-Q 是收到但应用没 read 的字节数;Send-Q 是要发但对端没 ACK 的字节数。两个都堆积 → 排查应用消费速度或网络丢包。


关联命令

  • lsof -i :8080 —— 另一种"找占端口的进程",更详细但更慢
  • netstat —— 老的等价物,可能没装
  • nstat —— 协议栈级统计
  • iftop —— 看哪些连接在跑流量
  • tcpdump —— 抓包看具体内容
  • systemctl —— 停掉占端口的服务
在 GitHub 上编辑此页
Prev
hostnamectl / timedatectl —— 改主机名与时区
Next
lsblk / df / du —— 三个被混淆的"看磁盘"命令