一、cpu
1、top 命令
us%------cpu 处于用户态的运行时间占比
sy%------cpu 处于内核态的运行时间占比
ni%------改变过优先级的进程占用 CPU 的百分比
id%------ 空闲时间占比
wa%------cpu io 等待时间占比
hi%------cpu 硬中断花费时间占比
si%------cpu 软中断花费时间占比
sar 命令
2、平均负载(load)
含义:单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
监控命令:uptime
分别显示是 1min|5min|15min 平均负载数
注意:负载高低依赖系统逻辑 cpu 数。从值的大小来说,负载越接近逻辑 CPU 数,负载越高,高于 CPU 数量 70%,应该分析排查负载高的问题了。
从趋势来说,三个负载如果基本相同,系统负载很平稳,如果 1min 远小于 15min 的值,说明负载在减少。
负载和 CPU 使用率的关系,一个是活跃进程数统计值,一个是使用时间统计值。
车道数=逻辑 cpu 数;车子等于活跃进程
3、上下文切换
Linux 是一个多任务操作系统,它支持远大于 cpu 数量的任务同时运行。当然这些任务实际上并不是真正的同时运行,而是系统将时间片轮流分配给不同的任务,造成多任务同时运行的错觉。
每个任务运行之前,CPU 都需要知道任务从哪里加载,从哪里开始,需要系统帮它设置好 CPU 寄存器和程序计数器,也就是 CPU 上下文。保存下来的上下文,存储在系统内核中,并在任务重新调度执行时再次加载进来,这样能保证原来的任务状态不受影响。让任务看起来是连续运行的。
根据 CPU 上下文切换可以分为不同的场景:进程上下文切换、线程上下文切换、中断上下文。
中断上下文:
为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序响应设备事件。在打断其他进程时,需要将进程当前的状态保存下来,在中断结束后,进程可以从原来的状态恢复运行。跟进程上下文切换一样,中断上下文切换也需要消耗 CPU,切换次数过多也会耗费大量的 CPU,甚至严重降低系统的整体性能。所以,当你发现中断次数过多时,就需要注意去排查它是否会给你的系统带来严重的性能问题。
线程上下文:
线程是进程的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源 (如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。但同进程内的线程切换,要比多进程间的切换消耗更少的资源,而这,也正是多线程代替多进程的一个优势。
进程上下文:
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全
区别:
进程切换分两步
1).切换页目录以使用新的地址空间
2).切换内核栈和硬件上下文。
对于 linux 来说,线程和进程的最大区别就在于地址空间。对于线程切换,第 1 步是不需要做的,第 2 是进程和线程切换都要做的。所以明显是进程切换代价大
线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题
4、命令
1)vmstat 可以分析系统的 CPU 上下文切换和中断次数
其中
in(interrupt):每秒中断的次数
cs(context switch):每秒上下文切换的次数
r (Running or Runable):就绪队列的长度,就是正在运行和等待 CPU 的进程数
b(Blocked):处于不可中断睡眠状态的进程数
2)pidstat 分析进程的上下文切换情况
pidstat -w -p pid 查看某个进程的上下文切换
pidstat -w -t -p pid 查看某个进程的各个现成的上下文切换
cswch :自愿上下文切换,是指进程无法获取所需资源导致的上下文切换,比如 I/O、内存等系统只有 不足是就会发生自愿上下文切换。
nvscwch :非资源上下文切换,是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换,比如说大量进程都在争抢 CPU,就容易发生非资源上下文切换。
如果系统的上下文切换次数比较稳定,那么从数百到一万以内都是正常的,但是当上下文切换超过一万次,或则切换数量出现数量级的增长时,就可能出现了性能问题了。
中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看/proc/interrupts 文件来分析具体的中断类型。
总结:
先看 id% 是空闲的,如果很高,表示 cpu 基本处于闲置状态。
看 us%,用户进程 CPU 查看,pidstat 查看具体进程占用
看 sy%,内核进程 CPU 查看,着重排查内核线程或则系统调用的性能问题。
看 wa%,io 等待 cpu 查看,着重排查系统存储是否出现了 I/O 问题。
看 hi% si% 着重排查内核中断服务程序。
总的来说从 top 查看使用率以及僵尸进程和平均负载等信息,从 vmstat 的输出查看上下文切换次数、中断次数、运行状态和不可中断状态的进程数。
从 pidstat 的输出可以得到进程的用户 CPU 使用率、系统 cpu 使用率、以及自愿上下文切换和非自愿上下文切换的情况。
二、内存
total :总内存大小
used:是已使用内存的大小,包含了共享内存
free:是未使用的内存的大小
shared:是共享内存的大小
buffer/cache :缓存和缓冲区的大小
avaliable:是新进程可用内存的大小
top 命令
VIRT:进程虚拟内存的带下,只要申请过的内存即使么有真正分配物理内存也会计算在内
RES:常驻内存的大小,进程实际使用物理内存大小,但不包括 Swap 和共享内存
SHR:共享内存的大小,比如与其他进程共同使用的共享内存、加载的攻台连接库以及程序代码段等
%MEM:进程使用物理内存占系统总内存的百分比
三、磁盘 I/O
1、系统磁盘 I/O
命令监控工具 iostat -d -x 1
%util 磁盘使用率
r/s + w/s :每秒的 I/O 请求数量
rkB/s + wkB/s 吞吐量,指每秒从硬盘读写的数据量
r_await+w_await ,就是响应时间,指 I/O 请求从发出到收到响应的间隔时间
2、进程磁盘 I/O
监控命令工具 pidstat -d 1
kB_rd/s:每秒读取的数据大小,单位是 KB
kB_wr/s :每秒法术的写请求数据大小,单位是 KB
kB_ccwr/s:每秒取消的写请求数大小,单位是 KB
总结:分析过程
util% 使用率高于 80% 说明使用率高
cpu 指标中的 iowait% 跟磁盘 i/o 相关,如果恨到的话就要开始排查磁盘 io 的问题
通过 iostat 查看磁力片的 i/o 使用率瓶颈;
通过 pidstat 找出大量 i/o 的进程
通过 lsof 查看进程打开了哪些文件
四、网络 i/o
1、监控命令工具:ifconfig + 网卡
其中
RX==receive 是下行流量, TX==Transmit,发送是上行流量
errors 表示发生错误的数据包,比如校验错误,帧同步错误;
dropped 表示丢弃的数据包数,即数据包已经收到的 Ring Buffer,但是因为内存不足等原因丢包;
overruns 表述超限数据包数,即网络 i/o 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;
carrier 表示发生 carrider 错误的数据包数,比如双攻模式不匹配,物理电缆出现问题等;
collisions 表示碰撞数据包数。
2、查看网卡的带宽
ethtool eno1 | grep Speed
3、套接字信息
netstat -nlp
当套接字处于连接状态(Established) Recv -Q 表示套接字缓冲还没有被应用程序取走的字节数(即接受队列长度)。而 Send -Q 表示还没有被远端主机确认的字节数(即发送队列长度)。
当套接字处于监听状态(Listening)时,Recv-Q 表示半连接队列长度当前值。而 Send-Q 表示半连接队列的最大长度
所谓全连接,是指服务器接收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接挪到全连接队列中,这些全连接中的套接字,还需要被 accept() 系统调用取走,服务器才可以整张处理客户端的请求。
所谓半连接,是指还没有完成 TCP 三次握手的链接,连接只进行了一半,服务器收到了客户端的 SYN 包后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。
4、网络吞吐
sar -n DEV 1
nload