自开始负责生产环境部署 , 中间遇到了若干线上环境内存以及CPU的问题 。由于微服务以及容器的流行 , 现在已经可以很方便的使用 K8s + prometheus + grafana + alert 的方式进行监控 , 这足以覆盖大部分场景 。
最重要的事情已经交由最适合的组件去做 , 然而了解一些在裸机上的命令以及指标也是必不可少的:
- 了解监控什么指标
- 平时写一些脚本也经常会 OOM 或者 CPU 使用率过高
文章插图
htop/top
文章插图
htop 足以覆盖大多数指标 , 详细直接查看帮助即可 。
- sort: by mem/cpu/state. 根据进程状态排序也至关重要 , 特别在 load average 过高的时候 。根据内存以及CPU使用率排序用以定位高资源占用者 。
- filter
- fields
- process/ count
- ...
- 如何查看 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.130
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)
- -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 -sap
procfsman7.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)
推荐阅读
- 图解Linux的IO模型和相关技术
- Linux技巧:介绍设置定时周期执行任务的方法
- linux awk使用方法
- Linux中10大常用命令之sort使用案例
- 你对Linux文件的色码知多少?
- mysql5.7性能提升一百倍调优宝典
- 在 Linux 上使用开源软件创建 SDN
- 浅谈Linux中一切皆文件
- 开源技术大神总结的7条Linux核心知识点
- Linux常用命令之tee,您用过吗?