linux 调优各项监控指标

自开始负责生产环境部署 , 中间遇到了若干线上环境内存以及CPU的问题 。由于微服务以及容器的流行 , 现在已经可以很方便的使用 K8s + prometheus + grafana + alert 的方式进行监控 , 这足以覆盖大部分场景 。
最重要的事情已经交由最适合的组件去做 , 然而了解一些在裸机上的命令以及指标也是必不可少的:

  1. 了解监控什么指标
  2. 平时写一些脚本也经常会 OOM 或者 CPU 使用率过高
先以一张来自 linuxperf 的图作为大纲于 , 我试着对一些指标进行整理 , 以备不时之需 。
linux 调优各项监控指标

文章插图
 
htop/top
linux 调优各项监控指标

文章插图
 
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/cpuinfocat /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.61USERTTYFROMLOGIN@IDLEJCPUPCPU WHATrootpts/0172.16.0.119:276.00s0.05s0.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 100Linux 3.10.0-957.21.3.el7.x86_64 (shanyue)10/21/19_x86_64_(2 CPU)16:55:52runq-szplist-szldavg-1ldavg-5ldavg-15blocked16:55:5304640.070.110.13016:55:5404640.060.100.13016:55:5504640.060.100.13016:55:5604640.060.100.13016:55:5704640.060.100.13016:55:5704640.060.100.130Average:04640.060.100.130CPU 使用率可以直接使用 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 -htotalusedfreesharedbuff/cacheavailableMem:3.7G682M398M2.1M2.6G2.7GSwap:0B0B0B进程衍生问题
  • 如何根据命令名找到进程
  • 如何根据参数名找到进程
  • 进程状态有哪些
  • 如何获取进程状态
  • 如何获取进程的CPU占用率
  • 如何获取进程的内存占用
# 查看 122 PID 进程$ ps 122# 根据命令名(command)找到 PID$ pgrep -a node26464 node /code/node_modules/.bin/ts-node index.ts30549 node server.js# 根据命令名以及参数找到 PID$ pgrep -af ts-node26464 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 -sapprocfsman7.org/linux/man-p…
进程的状态