Linux各项指标监控及问题排查
Linux各项指标监控及问题排查(二)
实时查看进程内存
pidstat -sr
# 查看 23097 PID 的内存信息,每隔一秒打印一次
# -r: 查看进程的内存信息
# -s: 查看进程的 stack 信息
# -p: 指定 PID
# 1: 每间隔 1s 打印一次
# 5: 共打印 5 组
$ pidstat -sr -p 23097 1 5
Linux 3.10.0-693.2.2.el7.x86_64 (shanyue) 07/18/19 _x86_64_ (2 CPU)
18:56:07 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command
18:56:08 0 23097 0.00 0.00 366424 95996 2.47 136 80 node
18:56:08 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command
18:56:09 0 23097 0.00 0.00 366424 95996 2.47 136 80 node
18:56:09 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command
18:56:10 0 23097 0.00 0.00 366424 95996 2.47 136 80 node
18:56:10 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command
18:56:11 0 23097 0.00 0.00 366424 95996 2.47 136 80 node
18:56:11 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command
18:56:12 0 23097 0.00 0.00 366424 95996 2.47 136 80 node
Average: UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command
Average: 0 23097 0.00 0.00 366424 95996 2.47 136
页表与缺页异常
pidstat -s 中 minflt 与 majflt 代表缺页异常
$ pidstat -s -p 23097 1 5
Linux 3.10.0-693.2.2.el7.x86_64 (shanyue) 07/18/19 _x86_64_ (2 CPU)
18:56:07 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command
18:56:08 0 23097 0.00 0.00 366424 95996 2.47 136 80 node
18:56:08 UID PID minflt/s majflt/s VSZ RSS %MEM StkSize StkRef Command
18:56:09 0 23097 0.00 0.00 366424 95996 2.47 136
标准输出定位到文件中
列出打开的文件
lsof, list open files
# 列出打开的文件
$ lsof
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,1 4096 2 /
systemd 1 root rtd DIR 253,1 4096
容器中 namespace PID -> global PID 映射
换一个问题就是,如何找出 docker 容器中的 pid 在宿主机对应的 pid
# 容器环境
# 已知容器中该进程 PID 为 122
# 在容器中找到对应 PID 的信息,在 /proc/$pid/sched 中包含宿主机的信息
$ cat /proc/122/sched
node (7477, #threads: 7)
...
# 宿主机环境
# 7477 就是对应的 global PID,在宿主机中可以找到
# -p 代表指定 PID
# -f 代表打印更多信息
$ ps -fp 7477
UID PID PPID C STIME TTY TIME CMD
root 7477 7161 0 Jul10 ? 00:00:38 node index.js
global 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
SWAP
# 查找关于
$ vmstat -s
inode
# -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
# IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
16:34:37 eth0 8.00 2.00 0.69 1.90 0.00 0.00 0.00
16:34:38 eth0 39.00 27.00 2.91 38.11 0.00 0.00 0.00
16:34:39 eth0 13.00 11.00 0.92 13.97 0.00 0.00 0.00
16:34:40 eth0 16.00 16.00 1.21 20.86 0.00 0.00 0.00
16:34:41 eth0 17.00 17.00 1.51 15.27 0.00 0.00 0.00
Average: eth0 18.60 14.60 1.45 18.02 0.00 0.00 0.00
socket 状态
socket 信息
推荐使用 ss,不过 netstat 仍需要掌握,在特定条件 (docker 中) 有可能没有 ss 命令。
# -t TCP
# -a 所有状态
# -n 显示数字地址和端口号
# -p 显示 pid
$ netstat -tanp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.11:35283 0.0.0.0:* LISTEN -
tcp 0 0 192.168.112.2:37344 172.18.0.1:6379 ESTABLISHED 78/node
tcp 0 0 :::80 :::* LISTEN 78/node# -t TCP
# -a 所有状态
# -n 显示数字地址和端口号
# -p 显示 pid
$ netstat -tanp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.11:35283 0.0.0.0:* LISTEN -
tcp 0 0 192.168.112.2:37344 172.18.0.1:6379 ESTABLISHED 78/node
tcp 0 0 :::80 :::* LISTEN 78/node
Recv-Q 与 Send-Q 不为0时,表示网络包堆积,需要注意
协议信息
# 展示对每个协议的统计信息
$ netstat -s
# 展示对每个协议的统计信息
$ ss -s
Total: 1468 (kernel 1480)
TCP: 613 (estab 270, closed 315, orphaned 0, synrecv 0, timewait 41/0), ports 0
Transport Total IP IPv6
* 1480 - -
RAW 0 0 0
UDP 30 22 8
TCP 298 145 153
INET 328 167 161
FRAG 0 0 0
# 也可以这样统计 estab socket 的数量
$ netstat -tanp | grep ESTAB | wc -l
PostgresSQL 的最大连接数与当前连接数
-- 最大连接数
show max_connections;
-- 当前连接数
select count(*) from pg_stat_activity;
mysql 的最大连接数与当前连接数
-- 最大连接数
show variables like 'max_connections';
-- 当前连接数
show full processlist;
雷哥开通了抖音(云计算雷哥)和微信视频号,每周一、五、日,晚21点定期直播,其余时间不定期直播,与大家一起聊聊技术、聊聊行业!
推荐阅读
干货 | PXE+kickstart无人值守批量装机(原理与架构)
干货 | PXE+kickstart无人值守批量装机(实战部署)
ifconfig已淘汰,ip登场
40个简单而有效的Shell脚本,想不起来的时候一看就懂(下)
Linux 网络状态工具 ss 命令详解
这次终于搞明白VLAN技术了
领导让我选监控,Zabbix 和 Prometheus 我该选哪个
Linux的TCP连接数量最大不能超过65535?那服务器是如何应对百万千万的并发的?