首页 > 系统相关 >Linux各监控指标及问题排查

Linux各监控指标及问题排查

时间:2023-05-01 10:33:56浏览次数:64  
标签:node 18 0.00 56 PID 排查 监控 Linux CPU

htop/top

Linux各监控指标及问题排查_Linux运维

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

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

filter

fields

process/ count

...

CPU 基本信息

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

如何查看 CPU 个数

如何查看 CPU model

如何查看 CPU 主频

cat /proc/cpuinfo
cat /proc/stat

平均负载 (load average)

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

$ uptime
 19:28:49 up 290 days, 20:25,  1 user,  load average: 2.39, 2.64, 1.55
$ w
 19:29:50 up 290 days, 20:26,  1 user,  load average: 2.58, 2.63, 1.61
USER     TTY      FROM          LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    172.16.0.1    19:27    6.00s  0.05s  0.00s tmux a

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

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

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

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

动态平均负载

$ sar -q 1 100
Linux 3.10.0-957.21.3.el7.x86_64 (shanyue)      10/21/19        _x86_64_        (2 CPU)

16:55:52      runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
16:55:53            0       464      0.07      0.11      0.13         0
16:55:54            0       464      0.06      0.10      0.13         0
16:55:55            0       464      0.06      0.10      0.13         0
16:55:56            0       464      0.06      0.10      0.13         0
16:55:57            0       464      0.06      0.10      0.13         0
16:55:57            0       464      0.06      0.10      0.13         0
Average:            0       464      0.06      0.10      0.13         0

CPU 使用率

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

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

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

user: 用户态,但不包括 nice

system: 内核态

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

idle (id)

iowait (wa)

irq (hi)

softirq (si)

steal (st)

系统调用

strace 查看系统调用

-p 指定pid

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

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

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

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

内存

free 用以查看系统内存。

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

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        682M        398M        2.1M        2.6G        2.7G
Swap:            0B          0B          0B

进程

衍生问题

如何根据命令名找到进程

如何根据参数名找到进程

进程状态有哪些

如何获取进程状态

如何获取进程的CPU占用率

如何获取进程的内存占用

# 查看 122 PID 进程
$ ps 122

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

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

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

# 打印父进程树
# -s --show-parents: 显示父进程
# -a --arguments: 显示参数,如 echo hello 中 hello 为参数
$ pstree 122 -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: 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
 PID   RSS S TTY          TIME COMMAND
 2579 19876 S pts/10   00:00:03 node index.js

实时查看进程内存

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      80  node

页表与缺页异常

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      80  node

标准输出定位到文件中

列出打开的文件

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          2 /

容器中 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

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;


本文学习自https://zhuanlan.zhihu.com/p/90303333

标签:node,18,0.00,56,PID,排查,监控,Linux,CPU
From: https://blog.51cto.com/jowin/6238612

相关文章

  • Linux系统之部署Chrony时间服务器
    (Linux系统之部署Chrony时间服务器)一、Chrony介绍1.Chrony简介Chrony是一个开源自由的网络时间协议NTP的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。2.......
  • 关于Linux操作系统-OS等保要求配置-禁止root用户直接ssh登录
    在等保中,都会去要求查看sshd配置,看是否有禁止root用户直接ssh登录,此项一般也会作为一个强制要求安全配置项笔者这里的操作系统如下,对于Redhat7.x应该也是一样的,可以自行测试[qq-5201351@Localhost~]$cat/etc/redhat-releaseRedHatEnterpriseLinuxrelease8.1(Ootpa)......
  • linux的基础结构和常用的命令基本 Linux 命令的列表:
    linux的基础结构和常用的命令基本Linux命令的列表: Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以,在Linux系统上工作离不开使用系统提供的命令。要想真正理解Linux系统,就必须从Linux命令学起,通过基础......
  • bytehound linux 内存profiler工具
    bytehound是基于rust开发的,方便的linux内存profiler工具特性支持分析内存了泄漏,内存消费情况支持完整的调用栈分析包含了ui支持导出数据,使用火焰图分析支持jemalloc分配器的分析参考使用通过LD_PRELOAD,此模式是通过环境变量的,当然也可以通过/etc/ld.so.preload配......
  • Linux核心命令22Linux系统信息网络磁盘用户
    Linux核心命令21系列文章目录快速上手Linux核心命令(一):核心命令简介快速上手Linux核心命令(二):关机、重启快速上手Linux核心命令(三):文件和目录操作命令快速上手Linux核心命令(四):文件内容相关命令快速上手Linux核心命令(五):文本处理三剑客快速上手Linux核心命令(六):Linux的文本编辑器vi和......
  • KaliLinux安装Burpsuite
    注意事项1.注意linux位数安装jdk之前先输出uname-a,看看kalilinux是32位的还是64位,例如此处我的kali是32位的,因此需下载的是32位的jdk2.jdk版本jdk版本最好是oracle的,若使用的是openjdk很可能会出现burpsuite闪退现象安装JDK1.解压jdk将jdk压缩包解压至kali的/opt目录......
  • Prometheus 监控系统安装
    目录下载启动使用参考Prometheus既是一个时序数据库,又是一个监控系统,更是一套完备的监控生态解决方案。本文简要介绍Prometheus的安装和使用。下载根据系统下载Download版本,并解压tarxvfzprometheus-*.tar.gzcdprometheus-*启动./prometheus--config.file=prometh......
  • Linux 进程调度之schdule主调度器
    考虑到文章篇幅,在这里我只讨论普通进程,其调度算法采用的是CFS(完全公平)调度算法。至于CFS调度算法的实现后面后专门写一篇文章,这里只要记住调度时选择一个优先级最高的任务执行一、调度单位简介1.1task_struct结构体简介对于Linux内核来说,调度的基本单位是任务,用structtask......
  • 如何修改linux中HTTP默认目录
    在Linux中,HTTP服务器的默认目录通常是/var/www/html。要修改它,可以按照以下步骤进行操作:打开Apache配置文件httpd.conf。该文件通常位于/etc/httpd/conf/或/etc/apache2/目录下。找到DocumentRoot指令,并将其值更改为您想要的目录路径。例如,如果您想将默认目录更改为/home/user/......
  • Linux下用tar完整拷贝/备份目录
    保留软连接、createtime、accesstime、modifytime、permission信息以拷贝/mnt/myhome/username到/mnt/newhome/username为例:cd/mnt/myhometar-cf-username|(cd/mnt/newhome&&tar-xpf-)管道符前的tar将文件夹username打包为tar归档文件,并将其输出到......