c语言实现linux下的top命令来获取cpu利用率_有用的一篇笔记,linux 调优各项监控指标...

92ed9ab7dd3317d6997ddaf126ee0d3f.png

自开始负责生产环境部署,中间遇到了若干线上环境内存以及CPU的问题。由于微服务以及容器的流行,现在已经可以很方便的使用 K8s + prometheus + grafana + alert 的方式进行监控,这足以覆盖大部分场景。

最重要的事情已经交由最适合的组件去做,然而了解一些在裸机上的命令以及指标也是必不可少的:

  1. 了解监控什么指标
  2. 平时写一些脚本也经常会 OOM 或者 CPU 使用率过高

先以一张来自 linuxperf 的图作为大纲于,我试着对一些指标进行整理,以备不时之需。

9471c4526dbf309fd515dd75b4365f19.png

htop/top

a38fba54a74edcec40fc2ee46c291b08.png

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

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

CPU 基本信息

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

  • 如何查看 CPU 个数
  • 如何查看 CPU model
  • 如何查看 CPU 主频
cat /proc/cpuinfo
cat /proc/stat

平均负载 (load average)

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

$ uptime19:28:49 up 290 days, 20:25,  1 user,  load average: 2.39, 2.64, 1.55
$ w19: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 -htotal        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

procfs

http://man7.org/linux/man-p…

进程的状态

  • 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 2579PID   RSS S TTY          TIME COMMAND

实时查看进程内存

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  node18: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  node18: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  node18: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  node18: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  nodeAverage:      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  node18: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

幸运地是有人已经在 stackoverflow 上总结出来了

  • http://stackoverflow.com/questions/2…

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 0Transport 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

TCP 连接数

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

-- 最大连接数
show max_connections;-- 当前连接数
select count(*) from pg_stat_activity;

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

-- 最大连接数
show variables like 'max_connections';-- 当前连接数
show full processlist;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android config.mk,android编译分析之10—config.mk

config.mk可以说是android编译系统中关于配置环境的一个总的makefile,定义了编译环境的方方面面。执行完config.mk就完成了android编译系统的所有准备工作,即准备好了所有的编译需要的全局变量,下一步直接执行make,即可产生镜像文…

在Spring中记录JAX-WS SOAP消息

每当在Spring中使用JAX-WS时,您可能都希望记录传入和传出的SOAP消息-如果仅用于开发过程中的调试。 因此,第一件事就是增加日志级别,对吗? 不幸的是,这将无效。 您将要做的是利用javax.xml.ws.handler.HandlerResolver…

WordPress /wp-admin/includes/post.php user_ID 参数操作权限提升漏洞

漏洞版本: WordPress 3.6 漏洞描述: Bugtraq ID:62346 CVE ID:CVE-2013-4340WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设自己的网志WordPress wp-admin/includes/post.php脚本在处理user_ID参数时存在一个安全漏洞&…

rip协议中周期性广播路由信息的报文_技术实操||距离矢量路由协议-RIP

距离矢量路由协议—RIP01距离矢量路由协议概述路由信息协议RIP(RoutingInformation Protocol)的简称,它是一种基于距离矢量(Distance-Vector)算法的协议,使用跳数作为度量来衡量到达目的网络的距离。RIP主要应用于规模较小的网络中。RIP是一种比较简单的…

android中可以有两个焦点吗,android – 如何通过焦点在屏幕上调整两个片段的大小?...

我有三个片段,前两个填充80%的屏幕,最后一个填充其余的片段(这个片段永远不会改变大小).我希望,在用户(焦点)输入片段后,调整片段的大小,使其填满屏幕的70%(将10%留给另一个).像这样:可以通过动态改变碎片的重量吗?或者…

使用tinylog 1.0简化您的日志记录

tinylog的大小仅为75 KB,是广泛使用的经典日志记录框架Log4j和Logback的轻型替代方案。 经过三年的开发,最终版本1.0刚刚于 3月底发布 。 在几个设计问题中,tinylog采取了与Java中经典日志记录框架完全不同的方法。 本文将介绍与Log4j和Logba…

MySQL : 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost...

MySQL : 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost 摘自: http://www.cnblogs.com/xyzdw/archive/2011/08/11/2135227.html 报错:1130-host ... is not allowed to connect to this MySql server 解决方法&#x…

华谊兄弟出现什么问题_什么是语言训练?这就要从语言问题的出现说起了

开口、发音是每一个孩子在语言发展过程中所不可少的经历,他们从周围环境中获取到的各种信息转化为想要表达的内容。虽然一开始孩子的语言并没有成年人那么流畅和准确,但随着时间的推移,他们的说话发音愈发成熟。只是,并不是所有孩…

【算法提升—力扣每日一刷】五日总结【12/18--12/22】

文章目录 2023/12/18LeetCode每日一刷:[20. 有效的括号](https://leetcode.cn/problems/valid-parentheses/) 2023/12/19LeetCode每日一刷:[150. 逆波兰表达式求值(后缀表达式运算)](https://leetcode.cn/problems/evaluate-rever…

CompletableFuture不能被打断

我已经写了很多有关InterruptedException和中断线程的文章 。 简而言之,如果您没有Future.cancel()调用Future.cancel()那么Future将终止待处理的get() ,但还将尝试中断基础线程。 这是一个非常重要的功能,可以更好地利用线程池。 我还写信总…

Nginx 禁止部分 User-Agrent 访问

经常有一些垃圾爬虫,完全不管你受得了受不了,完全不管你的 robots.txt ,拼命的爬你的网站,用下面方面可以帮这帮垃圾干掉。 location / { root /home/www/; if ($http_user_agent ~* "qihoobot") { retu…

crio电压采集 labview_NI cDAQ917采集温度方法

NI cDAQ-9171是一款由总线供电的单槽NI CompactDAQ USB机箱,适合较小的便携式传感器测量系统。cDAQ-9171可与50多款专用测量模块配合使用,用于构建模拟输出、数字I/O或计数器/定时器测量系统。这些模块适用于各种传感器测量,包括热电偶、RTD、…

JPA 2.1如何成为新的EJB 2.0

美丽在于情人眼中。 “轻松”也是如此: 了解有关SQL结果集映射的更多信息,并轻松处理本机查询结果: http : //t.co/WH4BTlClIP #JPA #Java #JavaEE — Thorben Janssen( thjanssen123) 2015年4月15日 Thorben撰写了…

常见问题摘要(生活篇)

1 lingoes软件安装了,却没发现怎么取词? 答:在软件设置里面,修改取词模式,一般以鼠标左键按下ctrl 为标准操作。转载于:https://www.cnblogs.com/lastshadow/p/3330146.html

android finish 区别,Android Activity类finish、onDestory和System.exit介绍

image.pngfinish函数Activity.finish()Call this when your activity is done and should be closed.在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。当调用此方法的时候,系统只是将最上面的Activity移出了栈&#xf…

github哪些协议能商用_GitHub 上有哪些一般人也可以用的项目?

​之前有不少粉丝来信询问:能否给初步接触 GitHub 的用户,推荐几个比较实用、容易看懂,无需具备太多专业知识便能上手使用的项目呢?答案是:有的。今天,我们就上述问题,来聊聊 GitHub 上有哪几个…

在JVM中记录世界停顿

不同的事件可能导致JVM暂停所有应用程序线程。 这种暂停称为世界停止(STW)暂停。 触发STW暂停的最常见原因是垃圾回收( 例如github中的示例 ),但是不同的JIT操作( 示例 ),偏向锁吊销…

目睹鸿蒙开创四大至高位面,吞噬星空 绝非鸿蒙系列,完结前最后的分析【申精】...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼先说说空间的划分:第一要说的是空间等级的划分,盘龙里分的很清楚,物质位面,七大神位面,四大至高位面,说得很清楚,物质位面虽然是最低等的位面&…

小程序确定取消弹窗_小程序开发之弹出框

小程序开发过程中,很多地方为了便利我们多采用小程序自带弹出框来实现交互效果。这也够大多数开发使用,下面我给大家详细介绍下小程序弹出框wx.showToast()title:显示的提示信息,在没有图标的情况下,文本内容可显示两行…

jOOQ与Hibernate:何时选择哪个

Hibernate已成为Java生态系统中的事实上的标准,事实上, 如果标准对您很重要 ,并且如果您将JCP与ISO,ANSI,IEEE等置于同一级别,那么Hibernate也是实际的JavaEE标准实现。 本文的目的不是讨论标准&#xff0…