Linux下常用性能监控指令
概述
运维的职责之一就是排查故障,而排查故障意味着我们必须要有能够及时定位问题的能力。如果对操作系统的本身的性能状态后知后觉,那又从何谈起故障排除呢?学会使用合适的工具来监控服务器的性能状态,就变成了对于运维而言的一个硬性的要求。这里我们就来看一下常用的几种查看我们性能状态的指令。
监控CPU状态指令
常用指令:top、atop、htop、lscpu、numactl
涉及文件:/proc/cpuinfo
运行top的时候会看到这么一行:
%Cpu(s): 1.9 us, 1.5 sy, 0.0 ni, 96.4 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
按1则会将单个cpu的信息显示出来:
%Cpu0 : 1.4 us, 2.1 sy, 0.0 ni, 96.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 2.0 us, 2.0 sy, 0.0 ni, 95.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 1.6 us, 1.8 sy, 0.0 ni, 96.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 2.0 us, 2.0 sy, 0.0 ni, 95.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
0.0 st
%Cpu4 : 11.7 us, 2.4 sy, 0.0 ni, 96.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu5 : 2.0 us, 2.0 sy, 0.0 ni, 95.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu6 : 1.4 us, 2.1 sy, 0.0 ni, 96.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu7 : 2.0 us, 2.0 sy, 0.0 ni, 95.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
us 用户空间占用CPU百分比
sy 内核空间占用CPU百分比
ni 用户进程空间内改变过优先级的进程占用CPU百分比
id 空闲CPU百分比
wa 等待输入输出的CPU时间百分比
hi 硬件中断
si 软件中断
[root@foundation0 ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 2 # 个数
On-line CPU(s) list: 0,1
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 60
Model name: Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
Stepping: 3
CPU MHz: 3600.009
BogoMIPS: 7200.01
Virtualization: VT-x
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 8192K
NUMA node0 CPU(s): 0,1
# 通过lscpu可以看到cpu的频率,版本,核数和缓冲等数据。
这里可以看到几个关键数据
-
cpu的缓冲:是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。主要为了解决CPU运算速度比内存速度更快的问题,避免cpu花费很长时间等待数据写入内存,通常这部分数据是cpu即将访问到的数据。
cpu缓冲分为L1(性价比低),L2(原则越大越好)和L3(二级缓冲未命中后的一种缓冲)
-
numa参数
numa把一台计算机分成多个节点(node),每个节点内部拥有多个CPU,节点内部使用共有的内存控制器,节点之间是通过互联模块进行连接和信息交互。因此节点的所有内存对于本节点所有的CPU都是等同的。对于其他节点中的所有CPU都不同。因此每个CPU可以访问整个系统内存,但是访问本地节点的内存速度最快(不经过互联模块),访问非本地节点的内存速度较慢(需要经过互联模块),即CPU访问内存的速度与节点的距离有关,该距离成为Node Distance。
假设我们当前状态是这样的:
Thread(s) per core: 2 # 每个core有2个threads Core(s) per socket: 6 # 每个socket有6个cores Socket(s): 4 # 共有4个sockets NUMA node(s): 4 # 共有4个NUMA nodes NUMA node0 CPU(s): 0-5,24-29 NUMA node1 CPU(s): 6-11,30-35 NUMA node2 CPU(s): 12-17,36-41 NUMA node3 CPU(s): 18-23,42-47
从上表我们可以看到,numa处于开启的状态,并且我们的每个numa节点里有12个cpu。打开numa容易面临CPU节点之间内存分配不均衡的问题,因为numa默认的内存分配策略是优先在进程所在CPU的本地内存中分配。当某个CPU节点内存不足时,会导致swap产生,而不是从远程节点分配内存。所以像mysql之类的服务都是关闭numa模式的。
可在bios里面关闭numa,或者在启动文件grub里指定numa=off。numa状态也可通过numactl获取。
监控内存使用情况指令
常用指令:free,swapon,top,vmstat,sar
涉及文件:/proc/meminfo
[root@foundation0 ~]# free -m # 以M为单位显示内存
total used free shared buff/cache available
Mem: 5857 3562 301 75 1993 1940
Swap: 8064 5 8059
#总内存 #已使用 #空闲内存 #多个进程 #磁盘缓存的大小 #可以使用的内存总量
#共享的内存
#总额
内存分成物理内存和swap,swap是以磁盘模拟空间提供给内存用的方式,故该方式会直接导致性能下降。
free和available的区别:
Free:空闲内存数,表示系统尚未使用的内存。
Available:应用程序可用内存数。系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的内存,这部分可回收的内存加上Free才是系统可用的内存,是一个估计值。
buffer和cache的区别:
buffer的核心作用是用来缓冲,假设你将数据写入磁盘,实时同步写入会导致磁盘io消耗过大且磁盘利用率低,那可以选择将数据先存放在buffer里,变成异步模式,对系统的磁盘利用率和整体的性能就变高了。
cache的核心作用是缓存,旨在加快数据取用的速度。比如你做了一些运算,该计算的结果需要被反复调用,那我们就可以将这个数据存入cache,加速数据取用的速度。
通常我们会看到write-buffer和read-cache,但并不代表buffer不可以参与读,cache不可以参与写。
vmstat的用法:
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]
举例:
[root@Foundation0 ~]# vmstat -a 2 10 # 开启显示active/inactive memory,每两秒输出一条