linux 调优各项监控指标( 二 )

  • Z defunct ("zombie") process, terminated but not reaped by its parent
  • 使用 htop/top 可以查看所有进程的状态信息 , 特别在几种情况下常用
    • 查看过多的僵尸进程
    • 当平均负载过大时
    # 第二行可以统计所有进程的状态信息$ top...Tasks: 214 total,1 running, 210 sleeping,0 stopped,3 zombie...进程内存ps -O rss 指定 rss 可以查看进程的内存 , 另外还有命令 top/htop 与 pidstat -r
    # 查看 2579 PID 的内存# -O rss 代表附加 RSS 信息进行打印$ ps -O rss 2579 PIDRSS S TTYTIME COMMAND实时查看进程内存pidstat -sr
    # 查看 23097 PID 的内存信息 , 每隔一秒打印一次# -r: 查看进程的内存信息# -s: 查看进程的 stack 信息# -p: 指定 PID# 1: 每间隔 1s 打印一次# 5: 共打印 5 组$ pidstat -sr -p 23097 1 5Linux 3.10.0-693.2.2.el7.x86_64 (shanyue)07/18/19_x86_64_(2 CPU)18:56:07UIDPIDminflt/smajflt/sVSZRSS%MEM StkSizeStkRefCommand18:56:080230970.000.00366424959962.4713680node18:56:08UIDPIDminflt/smajflt/sVSZRSS%MEM StkSizeStkRefCommand18:56:090230970.000.00366424959962.4713680node18:56:09UIDPIDminflt/smajflt/sVSZRSS%MEM StkSizeStkRefCommand18:56:100230970.000.00366424959962.4713680node18:56:10UIDPIDminflt/smajflt/sVSZRSS%MEM StkSizeStkRefCommand18:56:110230970.000.00366424959962.4713680node18:56:11UIDPIDminflt/smajflt/sVSZRSS%MEM StkSizeStkRefCommand18:56:120230970.000.00366424959962.4713680nodeAverage:UIDPIDminflt/smajflt/sVSZRSS%MEM StkSizeStkRefCommandAverage:0230970.000.00366424959962.4713680node页表与缺页异常pidstat -s 中 minflt 与 majflt 代表缺页异常
    $ pidstat -s -p 23097 1 5Linux 3.10.0-693.2.2.el7.x86_64 (shanyue)07/18/19_x86_64_(2 CPU)18:56:07UIDPIDminflt/smajflt/sVSZRSS%MEM StkSizeStkRefCommand18:56:080230970.000.00366424959962.4713680node18:56:08UIDPIDminflt/smajflt/sVSZRSS%MEM StkSizeStkRefCommand18:56:090230970.000.00366424959962.4713680node标准输出定位到文件中列出打开的文件lsof, list open files
    # 列出打开的文件$ lsofCOMMANDPIDTIDUSERFDTYPEDEVICESIZE/OFFNODE NAMEsystemd1rootcwdDIR253,140962 /systemd1rootrtdDIR253,140962 /容器中 namespace PID -> global PID 映射换一个问题就是 , 如何找出 Docker 容器中的 pid 在宿主机对应的 pid
    # 容器环境# 已知容器中该进程 PID 为 122# 在容器中找到对应 PID 的信息 , 在 /proc/$pid/sched 中包含宿主机的信息$ cat /proc/122/schednode (7477, #threads: 7)...# 宿主机环境# 7477 就是对应的 global PID , 在宿主机中可以找到# -p 代表指定 PID# -f 代表打印更多信息$ ps -fp 7477UIDPIDPPIDC STIME TTYTIME CMDroot747771610 Jul10 ?00:00:38 node index.jsglobal PID -> namespace PID 映射换一个问题就是 ,  已知宿主机的 PID , 如何找出对应的容器
    常见的场景就是使用 top/htop 定位到占用内存/CPU过高的进程 , 此时需要定位到它所在的容器
    # 通过 docker inspect 查找到对应容器$ docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.ID}}' | grep 22932# 通过 cgroupfs 找到对应容器$ cat /etc/22932/cgroup幸运地是有人已经在 stackoverflow 上总结出来了
    • stackoverflow.com/questions/2…
    SWAP# 查找关于$ vmstat -sinode# -i: 打印 inode number$ ls -lahi网络吞吐量
    • 带宽: 指网络链路的最大传输速率
    • 吞吐量: 代表单位时间内成功传输的数据量 , 单位为 b/s (KB/s, MB/s)
    • PPS: pck/s (Packet Per Second) , 以网络包为单位的传输速率
    # 查看网卡信息$ ifconfig eth0$ sar -n DEV 1 | grep eth0#IFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s16:34:37eth08.002.000.691.900.000.000.0016:34:38eth039.0027.002.9138.110.000.000.0016:34:39eth013.0011.000.9213.970.000.000.0016:34:40eth016.0016.001.2120.860.000.000.0016:34:41eth017.0017.001.5115.270.000.000.00Average:eth018.6014.601.4518.020.000.000.00socket 状态socket 信息推荐使用 ss , 不过 netstat 仍需要掌握 , 在特定条件 (docker 中) 有可能没有 ss 命令 。
    # -t TCP# -a 所有状态# -n 显示数字地址和端口号# -p 显示 pid$ netstat -tanpActive Internet connections (servers and established)Proto Recv-Q Send-Q Local AddressForeign AddressStatePID/Program nametcp00 127.0.0.11:352830.0.0.0:*LISTEN-tcp00 192.168.112.2:37344172.18.0.1:6379ESTABLISHED 78/nodetcp00 :::80:::*LISTEN78/node
    • Recv-Q 与 Send-Q 不为0时 , 表示网络包堆积 , 需要注意
    协议信息# 展示对每个协议的统计信息$ netstat -s# 展示对每个协议的统计信息$ ss -sTotal: 1468 (kernel 1480)TCP:613 (estab 270, closed 315, orphaned 0, synrecv 0, timewait 41/0), ports 0Transport TotalIPIPv6*1480--RAW000UDP30228TCP298145153INET328167161FRAG000# 也可以这样统计 estab socket 的数量$ netstat -tanp | grep ESTAB | wc -l


    推荐阅读