Linux 系统常用监控命令总结

To be updated…
排查 Linux 问题方法以及常用命令
1. CPU
1.1 steal time
- 理解 CPU steal time - Jessysong | CSDN
- 理解 CPU steal time | MKY-技术驿站
- 谁偷走了我的云主机 CPU 时间:理解 CPU Steal Time | 知乎
2. 内存
操作系统 IPC 共享内存/队列:
平时我们经常需要监控内存的使用状态,常用的命令有free
、vmstat
、top
、dstat -m
等。
2.1 free
推荐阅读:
各行数据含义
第一行Mem
:
total
:内存总数7.7G
,物理内存大小,就是机器实际的内存used
:已使用内存6.2G
,这个值包括了cached
和应用程序实际使用的内存free
:空闲的内存1.5G
,未被使用的内存大小shared
:共享内存的大小,17M
buffers
:被缓冲区占用的内存大小,33M
cached
:被缓存占用的内存大小,184M
其中有:
第二行-/+ buffers/cache
,代表应用程序实际使用的内存:
- 前一个值表示
used - buffers/cached
,表示应用程序实际使用的内存 - 后一个值表示
free + buffers/cached
,表示理论上都可以被使用的内存
可以看到,这两个值加起来也是
total
第三行swap
,代表交换分区的使用情况:总量、使用的和未使用的
缓存 cache
cache
代表缓存,当系统读取文件时,会先把数据从硬盘读到内存里,因为硬盘比内存慢很多,所以这个过程会很耗时。
为了提高效率,Linux 会把读进来的文件在内存中缓存下来(局部性原理),即使程序结束,cache 也不会被自动释放。因此,当有程序进行大量的读文件操作时,就会发现内存使用率升高了。
当其他程序需要使用内存时,Linux 会根据自己的缓存策略(例如 LRU)将这些没人使用的 cache 释放掉,给其他程序使用,当然也可以手动释放缓存:
缓冲区 buffer
考虑内存写文件到硬盘的场景,因为硬盘太慢了,如果内存要等待数据写完了之后才继续后面的操作,效率会非常低,也会影响程序的运行速度,所以就有了缓冲区buffer
。
当内存需要写数据到硬盘中时会先放到 buffer 里面,内存很快把数据写到 buffer 中,可以继续其他工作,而硬盘可以在后台慢慢读出 buffer 中的数据并保存起来,这样就提高了读写的效率。
例如把电脑中的文件拷贝到 U 盘时,如果文件特别大,有时会出现这样的情况:明明看到文件已经拷贝完,但系统还是会提示 U 盘正在使用中。这就是 buffer 的原因:拷贝程序虽然已经把数据放到 buffer 中,但是还没有全部写入到 U 盘中
同样的,可以使用sync
命令来手动flush buffer
中的内容:
交换分区 swap
交换分区swap
是实现虚拟内存的重要概念。swap
就是把硬盘上的一部分空间当作内存来使用,正在运行的程序会使用物理内存,把未使用的内存放到硬盘,叫做swap out
。而把硬盘交换分区中的内存重新放到物理内存中,叫做swap in
。
交换分区可以在逻辑上扩大内存空间,但是也会拖慢系统速度,因为硬盘的读写速度很慢。Linux 系统会将不经常使用的内存放到交换分区中。
cache 和 buffer 的区别
cache
:作为page cache
的内存,是文件系统的缓存,在文件层面上的数据会缓存到page cache
中buffer
:作为buffer cache
的内存,是磁盘块的缓存,直接对磁盘进行操作的数据会缓存到 buffer cache 中
简单来说:page cache
用来缓存文件数据,buffer cache
用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache
中。如果直接采用dd
等工具对磁盘进行读写,那么数据会缓存到buffer cache
中。
2.2 vmstat
vmstat (Virtual Memory Statics,虚拟内存统计) 是对系统的整体情况进行统计,包括内核进程、虚拟内存、磁盘、中断和 CPU 活动的统计信息:
procs
r
列:表示运行和等待 CPU 时间片的进程数,这个值如果长期大于 CPU 个数,就说明 CPU 资源不足,可以考虑增加 CPUb
列:表示在等待资源的进程数,例如正在等待 I/O 或者内存交换
memory
swpn
列:表示切换到交换分区的内存大小,如果swpd
的值不为 0 或者比较大,且si
、so
的值长期为 0,那么这种情况暂时不会影响系统性能free
列:当前空闲的物理内存大小buff
列:表示buffers cache
的内存大小,一般对块设备的读写才需要缓冲cache
列:表示page cache
的内存大小,一般作为文件系统的缓存,频繁访问的文件都会被 cached。如果 cache 值比较大,就说明 cached 文件数量较多。如果此时 I/O 中的bi
比较小,就说明文件系统效率比较好
swap
si
列:表示swap in
,即内存由交换分区放入物理内存中so
列:表示swap out
,即将未使用的内存放到硬盘的交换分区中
io
bi
列:表示从块设备读取的数据总量,即读磁盘,单位KB/s
bo
列:表示写入块设备的数据总量,即写磁盘,单位KB/s
这里设置的
bi+bo
参考值为1000
,如果超过1000
,且wa
值比较大,则表示系统磁盘 I/O 性能瓶颈
system
in
列:表示在某一时间间隔中观察到的每秒设备中断数cs
列:表示每秒产生的上下文切换次数
上面这两个值越大,内核消耗的 CPU 时间就越多
cpu
us
列:表示用户进程消耗 CPU 的时间百分比。us
值比较高时,说明用户进程消耗的 CPU 时间多,如果长期大于 50%,可以考虑优化程序sy
列:表示内核进程消耗 CPU 的时间百分比。sy
值比较高时,说明内核消耗的 CPU 时间多,如果us+sy
超过 80%,就说明 CPU 资源存在不足id
列:表示 CPU 处在空闲状态的时间百分比wa
列:表示 I/O Wait 所占 CPU 的时间百分比。wa
值越高,说明 I/O Wait 越严重。如果wa
值超过 20%,说明 I/O Wait 严重st
列:表示 CPU Steal Time,针对虚拟机
3. 网络
3.1 接口
3.2 端口
3.3 tcpdump
3.4 nethogs
监控各进程的网络流量
4. I/O 性能
5. 进程
5.1 top
例如最常用的top
命令:
1
: 显示各个 CPU 的使用情况c
: 显示进程完整路径H
: 显示线程P
: 排序 - CPU 使用率M
: 排序 - 内存使用率R
: 倒序Z
: Change color mappingsB
: Disable/enable boldl
: Toggle load avgt
: Toggle task/cpu statsm
: Toggle mem info
5.2 lsof
6. 性能测试
time
命令
7. 用户
8. 系统状态
9. 硬件设备
10. 文件系统
11. 内核、中断
12. 系统日志、内核日志
13. cron 定时任务
14. 调试工具
14.1 perf
14.2 strace
strace
命令用于打印系统调用、信号:
14.3 ltrace
ltrace
命令用于打印动态链接库访问:
15. 场景案例
场景 1:连上服务器之后
场景 2:/proc 目录有哪些信息
场景 3:后台执行命令
一些命令
部分资源
- 学习 Linux 命令,看这篇 2w 多字的命令详解就够了 | Java3y
- 每天学习一个命令 | Verne in Github
- 10 分钟教你如何划重点 —— Systemd 最全攻略 | 阿里智能运维
- 20 个命令行工具监控 Linux 系统性能 | Linux Story
- vmstat 命令查看虚拟内存 | 51CTO
- Grafana | Github
- 28 个 UNIX/Linux 的命令行神器 | 酷壳 CoolShell
- CentOS 7 查看网络带宽使用情况 | 陈沙克日志
- 【必看】Linux 问题故障定位,看这一篇就够了 | 民工哥技术之路
- Load Average 的含义 | 博客园
- Linux 性能调优工具 perf 的使用 | cpper
- 10 个非常赞的 Linux 网络监控工具 | Python 网络爬虫与数据挖掘
参考文章
- 常用 Linux 系统监控命令 | 神奕的博客
- Linux 工具快速教程 | Linux Tools Quick Tutorial
- 穷佐罗的 Linux 书 | GitBook
- Brendan D. Gregg
- BPF Performance Tools | Brendan D. Gregg
- Systems Performance: Enterprise and the Cloud | Brendan D. Gregg
- How to use strace and ltrace commands in Linx | The Geek Diary
- First 5 Minutes Troubleshooting A Server | devo.ps
- First 5 Commands When I Connect on a Linux Server | Linux.com
- Linux Performance Analysis in 60,000 Milliseconds | The Netfilx Tech Blog
- 【PPT】Shared Memory Segments and POSIX Semaphores
- 通过 free 命令理解 Linux 内存管理 | Cizixs
- free 命令中 cached 和 buffers 的区别 - 踏雪无痕 | 博客园
- Linux du 命令和 df 命令区别 | CSDN
- du 和 df 文件大小不一致问题排查 | CSDN
- Linux CPU 资源高、内存高分析 - milkty | 博客园
复习文章
- 常用 Linux 系统监控命令 | 神奕的博客
- Linux 文件系统 inode 介绍 | 卡瓦邦噶
- 理解 inode | 阮一峰
- 文件描述符(File Descriptor)简介 | SegmentFault
- [译] Linux 系统调用权威指南 | ArthurChiao’s Blog
- 运维岗秋招之路 | 牛客
- 运维岗位的面试问题 | 牛客
- Linux 进程的生命周期 | 卡瓦邦噶
- 10 分钟教你如何划重点 —— Systemd 最全攻略 | 阿里智能运维
- 什么是内存(一):存储器层次结构 - eleven_yw | 博客园
- 什么是内存(二):虚拟内存 - eleven_yw | 博客园
- 关于跨平台的一些认识 - eleven_yw | 博客园
- 计算机网络的各种基本概念总结(七层模型,TCP,HTTP,socket,RPC等)| CSDN
- 网络七层模型与四层模型区别 | 掘金
系统负载
关于load average
的几点总结:
- 系统负载统计的是运行和等待运行的进程/线程数
- Linux 下是
5s
一采样并计算移动平均 - 一分钟指数移动平均用到了不止近一分钟的采样数据
- 有
n
核,满载的负载就是n
调试工具
- 【干货】Linux 工具快速教程 | Linux Tools Quick Tutorial
- The Linux Perf Master | Ribose Yim
- 穷佐罗的 Linux 书 | GitBook
- 性能分析利器之 perf 浅析 - WalkerTalking
- 系统级性能分析工具 perf 的介绍与使用 - Arnold Lu | cnblogs
- 在 Linux 下做性能分析 3:perf | 知乎专栏 - 软件架构设计
- Linux 性能优化 9:KVM 环境 | 知乎专栏 - 软件架构设计
- 使用 gprof 对程序的性能分析(集合贴)| CSDN
- 使用 GNU profiler 来提高代码运行速度 | IBM Developer
- [译] tcpdump 示例教程 | 鸟窝
- 使用 truss、strace 或 ltrace 诊断软件的”疑难杂症” | IBM Developer
- 调试工具 ltrace strace ftrace 的使用 | JasonLe
- 使用 ltrace 跟踪库函数调用 | Liujingwen’s Blog
- [译] Linux 系统调用权威指南 | ARTHURCHIAO’S BLOG
- [译] strace 是如何工作的 | ARTHURCHIAO’S BLOG
- [译] ltrace 是如何工作的 | ARTHURCHIAO’S BLOG
- tcpdump/wireshark 抓包及分析 | ARTHURCHIAO’S BLOG