肝了这么多夜,总结一下:Linux各项指标监控及问题排查

htop/

肝了这么多夜,总结一下:Linux各项指标监控及问题排查

htop 足以覆盖大多数指标,详细直接查看帮助即可。

sort: by mem/cpu/state. 根据进程状态排序也至关重要,特别在 load average 过高的时候。根据内存以及CPU使用率排序用以定位高资源占用者。

filter

fields

process/ count

CPU 基本信息

中一切皆文件,查看 //cpuinfo 查看信息。另有衍生问题

如何查看 CPU 个数

如何查看 CPU model

如何查看 CPU 主频

cat/proc/cpuinfo
cat/proc/stat

平均负载 (load average)

使用 uptime 和 w 可打印出过去 1, 5, 15 分钟内的平均负载。同时,你可以使用 sar -q 查看动态的平均负载。

$uptime
19:28:49up290days,20:25,1user,loadaverage:2.39,2.64,1.55
$w
19:29:50up290days,20:26,1user,loadaverage:2.58,2.63,1.61
USERTTYFROMLOGIN@IDLEJCPUPCPUWHAT
rootpts/0172.16.0.119:276.00s0.05s0.00stmuxa

在 uptime 的 手册中这么解释平均负载

System load averages is the average number of processes that are either in a runnable or uninterruptable state.

翻译过来就是指系统中处于可运行状态和不可中断状态的平均进程数。

对于 4 核的 CPU,如果平均负载高于 4 就代表负载过高

动态平均负载

$sar-q1100
Linux3.10.0-957.21.3.el7.x86_64(shanyue)10/21/19_x86_64_(2CPU)

16:55:52runq-szplist-szldavg-1ldavg-5ldavg-15blocked
16:55:5304640.070.110.130
16:55:5404640.060.100.130
16:55:5504640.060.100.130
16:55:5604640.060.100.130
16:55:5704640.060.100.130
16:55:5704640.060.100.130
Average:04640.060.100.130

CPU 使用率

可以直接使用 htop/top 命令查看 CPU 使用率,idle 的cpu时间也可以直接通过 top 显示出来

CPU 利用率 = 1 – cpu-idle-time / cpu-time

$top
%Cpu(s):7.4us,2.3sy,0.0ni,90.1id,0.0wa,0.0hi,0.2si,0.0st

user: 用户态,但不包括 nice

system: 内核态

nice: 低优先级用户态,nice 值为 1-19 的 CPU 时间

idle (id)

iowait (wa)

irq (hi)

softirq (si)

steal (st)

系统调用

strace 查看系统调用

-p 指定

-c 统计各项系统调用被调用了多少次以及CPU时间

#用来看一个进程所用到的系统调用
#-p:指定7477号进程
$strace-p7477

#用来查看某命令需要用到的系统调用
$stracecatindex.js

#关于系统调用的统计信息
$strace-p7477-c

内存

free 用以查看系统内存。

如果查看进程内存,使用 pidstat -r 或者 htop

$free-h
totalusedfreesharedbuff/cacheavailable
Mem:3.7G682M398M2.1M2.6G2.7G
Swap:0B0B0B

进程

衍生问题

如何根据命令名找到进程

如何根据参数名找到进程

进程状态有哪些

如何获取进程状态

如何获取进程的CPU占用率

如何获取进程的内存占用

#查看122PID进程
$ps122

#根据命令名(command)找到PID
$pgrep-anode
26464node/code/node_modules/.bin/ts-nodeindex.ts
30549nodeserver.js

#根据命令名以及参数找到PID
$pgrep-afts-node
26464node/code/node_modules/.bin/ts-nodeindex.ts

#查看122PID进程的信息
$cat/proc/122/status
$cat/proc/122/*

#打印父进程树
#-s--show-parents:显示父进程
#-a--arguments:显示参数,如echohello中hello为参数
$pstree122-sap

进程的状态

D uninterruptible sleep (usually IO)

R running or runnable (on run queue)

S interruptible sleep (waiting for an event to complete)

T stopped by job control signal

t stopped by debugger during the tracing

W paging (not valid since the 2.6.xx kernel)

X dead (should never be seen)

Z defunct (“zombie”) process, terminated but not reaped by its parent

使用 htop/top 可以查看所有进程的状态信息,特别在几种情况下常用

查看过多的僵尸进程

当平均负载过大时

#第二行可以统计所有进程的状态信息
$top
...
Tasks:214total,1running,210sleeping,0stopped,3zombie
...

进程内存

ps -O rss 指定 rss 可以查看进程的内存,另外还有命令 top/htop 与 pidstat -r

#查看2579PID的内存
#-Orss代表附加RSS信息进行打印
$ps-Orss2579
PIDRSSSTTYTIMECOMMAND
257919876Spts/1000:00:03nodeindex.js

实时查看进程内存

pidstat -sr

#查看23097PID的内存信息,每隔一秒打印一次
#-r:查看进程的内存信息
#-s:查看进程的信息
#-p:指定PID
#1:每间隔1s打印一次
#5:共打印5组
$pidstat-sr-p2309715
Linux3.10.0-693.2.2.el7.x86_64(shanyue)07/18/19_x86_64_(2CPU)

18:56:07UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand
18:56:080230970.000.00366424959962.4713680node

18:56:08UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand
18:56:090230970.000.00366424959962.4713680node

18:56:09UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand
18:56:100230970.000.00366424959962.4713680node

18:56:10UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand
18:56:110230970.000.00366424959962.4713680node

18:56:11UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand
18:56:120230970.000.00366424959962.4713680node

Average:UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand
Average:0230970.000.00366424959962.4713680node

页表与缺页异常

pidstat -s 中 minflt 与 majflt 代表缺页异常

$pidstat-s-p2309715
Linux3.10.0-693.2.2.el7.x86_64(shanyue)07/18/19_x86_64_(2CPU)

18:56:07UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand
18:56:080230970.000.00366424959962.4713680node

18:56:08UIDPIDminflt/smajflt/sVSZRSS%MEMStkSizeStkRefCommand
18:56:090230970.000.00366424959962.4713680node

标准输出定位到文件中

列出打开的文件

, list open files

#列出打开的文件
$lsof
COMMANDPIDTIDUSERFDTYPEDEVICESIZE/OFFNODENAME
systemd1rootcwdDIR253,140962/
systemd1rootrtdDIR253,140962/

容器中 namespace PID -> global PID 映射

换一个问题就是,如何找出 docker 容器中的 pid 在宿主机对应的 pid

#容器环境

#已知容器中该进程PID为122
#在容器中找到对应PID的信息,在/proc/$pid/sched中包含宿主机的信息
$cat/proc/122/sched
node(7477,#threads:7)
...
#宿主机环境

#7477就是对应的globalPID,在宿主机中可以找到
#-p代表指定PID
#-f代表打印更多信息
$ps-fp7477
UIDPIDPPIDCSTIMETTYTIMECMD
root747771610Jul10?00:00:38nodeindex.js

global PID -> namespace PID 映射

换一个问题就是,已知宿主机的 PID,如何找出对应的容器

常见的场景就是使用 top/htop 定位到占用内存/CPU过高的进程,此时需要定位到它所在的容器

#通过dockerinspect查找到对应容器
$dockerps-q|xargsdockerinspect--format'{{.State.Pid}},{{.ID}}'|grep22932

#通过cgroupfs找到对应容器
$cat/etc/22932/cgroup

SWAP

#查找关于
$vmstat-s

inode

#-i:打印inodenumber
$ls-lahi

吞吐量

带宽: 指网络链路的最大传输速率

吞吐量: 代表单位时间内成功传输的数据量,单位为 b/s (KB/s, MB/s)

PPS: pck/s (Packet Per Second),以网络包为单位的传输速率

#查看信息
$ifconfigeth0

$sar-nDEV1|grepeth0
#IFACErxpck/stxpck/srxkB/stxkB/srxcmp/stxcmp/srxmcst/s
16:34:37eth08.002.000.691.900.000.000.00
16:34:38eth039.0027.002.9138.110.000.000.00
16:34:39eth013.0011.000.9213.970.000.000.00
16:34:40eth016.0016.001.2120.860.000.000.00
16:34:41eth017.0017.001.5115.270.000.000.00
Average:eth018.6014.601.4518.020.000.000.00

socket 状态

socket 信息

推荐使用 ss,不过 netstat 仍需要掌握,在特定条件 (docker 中) 有可能没有 ss 命令。

#-tTCP
#-a所有状态
#-n显示数字地址和端口号
#-p显示pid
$netstat-tanp
ActiveInternetconnections(serversandestablished)
ProtoRecv-QSend-QLocalAddressForeignAddressStatePID/Programname
tcp00127.0.0.11:352830.0.0.0:*LISTEN-
tcp00192.168.112.2:37344172.18.0.1:6379ESTABLISHED78/node
tcp00:::80:::*LISTEN78/node

Recv-Q 与 Send-Q 不为0时,表示网络包堆积,需要注意

协议信息

#展示对每个协议的统计信息
$netstat-s

#展示对每个协议的统计信息
$ss-s
Total:1468(kernel1480)
TCP:613(estab270,closed315,orphaned0,synrecv0,timewait41/0),ports0

TransportTotalIPIPv6
*1480--
RAW000
UDP30228
TCP298145153
INET328167161
FRAG000

#也可以这样统计estabsocket的数量
$netstat-tanp|grepESTAB|wc-l

PostgresSQL 的最大连接数与当前连接数

--最大连接数
showmax_connections;

--当前连接数
selectcount(*)frompg_stat_activity;

mysql 的最大连接数与当前连接数

--最大连接数
showvariableslike'max_connections';

--当前连接数
showfullprocesslist;

链接:https://zhuanlan.zhihu.com/p/90303333

给TA打赏
共{{data.count}}人
人已打赏
运维笔记

抓住 Linux 黄金 60 秒

2023-10-10 18:32:20

运维笔记

一行 Python 代码实现并行

2023-10-10 18:32:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索