一、cpu负载
1、CPU基本概念
1.1、什么是物理cpu个数
物理cpu个数即主板上实际能够看到的cpu个数(也是cpu插槽数)
1.2、 什么是cpu核数
cpu核数指的是物理cpu个数 * 每个物理cpu的核心数,因为每个物理cpu可能包含多个核心,如下图,有2个物理cpu,每个物理cpu包含4个核心,即该服务器/主板是8核。
1.3、什么是逻辑cpu个数
总逻辑CPU个数 = 物理CPU个数 * 每个物理CPU的核数 * 每个核的超线程数,一般超线程是乘以2,即:总逻辑CPU个数 = 物理CPU个数 * 每个物理CPU的核数 * 2,如果没有超线程,那么,总逻辑CPU个数 = 物理CPU个数 * 每个物理CPU的核数。
1.4、原生多核与封装多核
原生多核:
是真正意义上的多核,最早由AMD提出,每个核心之间都是完全独立的,都拥有自己的前端总线,不会造成冲突,即使在高负载状况下,每个核心都能保证自己的性能不受太大的影响。(即原生多核的抗压能力强,但是需要先进的工艺,每扩展一个核心都需要很多的研发时间)
封装多核:
只把多个核心直接封装在一起,比如Intel早期的PD双核系列,就是把两个单核直接封装在一起。(性能更弱、成本高,但是发展研发更快)
1.5、什么是超线程技术
四核八线程主要涉及的就是超线程技术:
它由 Intel 研发,是把处理器内部的一个物理CPU模拟成两个逻辑CPU(以后也许有多个),让单个处理器就能使用线程级的并行计算,进而兼容多线程操作系统和软件。超线程技术充分利用空闲CPU资源,在相同时间内完成更多工作,在一定程度上提高了运行效率和性能。
所以才会出现了我们提到的四核八线程,也就是将四个物理核心模拟成八个逻辑核心,同时会有四核支持八线程的操作。
但是呢,四核八线程虽然模拟出来的是八核,其实和真实八核区别很大,虽然采用超线程技术能同时执行两个线程,但它并不能像两个真实CPU那样,每个CPU都具有独立的资源。单一资源同时只能支持一个CPU占用,因此当这些资源闲置后另一个CPU才能继续占用。并且,单一核心模拟出的两个逻辑核心的单个性能会有所下降。
1.6、几路几核几线程是什么意思
比如单路四核八线程
单路指的是有1个cpu插槽(即物理cpu,physical id),4核指的是每个物理cpu的核数(core id),8线程指的是每个核通过超线程虚拟成2个,即总逻辑cpu核数(processor)是8,即该cpu开启了超线程技术,超线程技术就是单个处理器基础上提供两个逻辑处理器。
【举例】:
a、对于两路四核超线程计算机,两路指计算机有2个物理CPU,每颗CPU中有4个物理内核,CPU支持超线程,就有2*4*2=16个逻辑CPU,这就是通常所谓的16核计算机;
b、双路四核超线程,解释为:两个物理CPU,每个CPU都是4核,然后每个核通过超线程虚拟成2个,一共就是16核。
1.7、物理核与虚拟核
物理核:
物理核数=cpu数(机子上装的cpu的数量) * 每个cpu的物理核数
虚拟核:
所谓的4核8线程,4核指的是cpu核数(core id)。通过超线程技术,用一个物理核模拟两个虚拟核,每个虚拟核1个线程,总数为8线程(即processor)。在操作系统看来是8个核,但是实际上是4个物理核。通过超线程技术可以实现单个物理核实现线程级别的并行计算,但是比不上性能两个物理核。
2、查看cpu数
2.1、麒麟系统
lscpu
返回结果如下:
架构: aarch64 #arm64架构
CPU 运行模式: 64-bit #64位
字节序: Little Endian #小端法
CPU: 96 #cpu数量(逻辑cpu数量)
在线 CPU 列表: 0-95 #在线的cpu数量,有时为了省电或者过热的时候,某些cpu会停止运行
每个核的线程数: 1 #每个核心的线程数
每个座的核数: 48 #每个cpu插槽(物理cpu)有几个核心
座: 2 #cpu插槽(物理cpu)个数,英文会用socket表示
NUMA 节点: 4
厂商 ID: HiSilicon #cpu厂商名称
型号: 0
型号名称: Kunpeng-920
步进: 0x1 #可以理解为版本号
CPU 最大 MHz: 2600.0000
CPU 最小 MHz: 200.0000
BogoMIPS: 200.00
L1d 缓存: 6 MiB
L1i 缓存: 6 MiB
L2 缓存: 48 MiB
L3 缓存: 96 MiB
NUMA 节点0 CPU: 0-23
NUMA 节点1 CPU: 24-47
NUMA 节点2 CPU: 48-71
NUMA 节点3 CPU: 72-95
Vulnerability Itlb multihit: Not affected
Vulnerability L1tf: Not affected
Vulnerability Mds: Not affected
Vulnerability Meltdown: Not affected
Vulnerability Spec store bypass: Not affected
Vulnerability Spectre v1: Mitigation; __user pointer sanitization
Vulnerability Spectre v2: Not affected
Vulnerability Tsx async abort: Not affected
标记: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm
# 直接查看逻辑cpu总数
cat /proc/cpuinfo | grep -i processor | wc -l
2.2、centos系统
# 查看物理cpu个数
cat /proc/cpuinfo | grep -i "physical id" | sort | uniq | wc -l
#查看每个cpu有几核
cat /proc/cpuinfo | grep "cpu cores" | uniq
#查看逻辑cpu总个数
cat /proc/cpuinfo| grep "processor"| wc -l
#查看cpu品牌信息
cat /proc/cpuinfo| grep "model name" | uniq
【补充】:
总逻辑CPU个数 = 物理CPU个数 * 每个物理CPU的核数 * 每个核的超线程数
总核数 = 物理CPU个数 * 每颗物理CPU的核数
(如果总逻辑cpu个数不等于总核数,则可以判断该cpu开启了超线程技术)
3、查看cpu负载
3.1、vmstat查看(系统自带)
#每隔1秒刷新1次,刷新3次
vmstat 1 3
【参数说明】:
字段 | 含义 |
---|---|
procs | 进程信息字段:
|
memory | 内存信息字段:
|
swap | 交换分区信息字段:
|
io | 磁盘读/写信息字段:
|
system | 系统信息字段:
|
cpu | CPU信息字段:
|
3.2、top查看(系统自带)
top
【参数说明】:
行数 | 参数解释 |
第1行 | 第1行是任务队列消息,同uptime命令的执行结果。 系统时间:13:45:19 系统运行时间:up 66天,16小时2分钟 当前登录用户:1 user 负载:0.02,0.01,0.00,load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。 |
第2行 | 第2行,Tasks 任务(进程) 总进程:953 total,运行:1 running,休眠:951 sleeping,停止:0 stopped,僵尸进程:1 zombie |
第3行 | 第3行,cpu状态信息 0.1%us:用户空间占用cpu百分比 0.2%sy:内核空间占用cpu百分比 0.0%ni:改变过优先级的进程占用cpu的百分比 99.8%id:空闲cpu百分比 0.0%wa:IO等待占用cpu百分比,参考值为30%,如果wa超过30%,说明IO等待严重 0.0%hi:硬中断占用cpu的百分比 0.0%si:软中断占用cpu的百分比 0.0%st:被虚拟机所盗用的 CPU 百分比 |
第4行 | 第4行:内存状态 总内存:130062.6total,单位MB(有时是KB,前面会有标识) 空闲内存:42319.9MB 已使用内存:11941.9MB 缓冲的交换区总量:75800.9MB 注:可用内存=free+buffer+cached 第4行中使用中的内存总量(used)指的是现在系统内核控制的内存数, 第4行中空闲内存总量(free)是内核还未纳入其管控范围的数量。 纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心 |
第5行 | 第5行:swap交换分区信息 总交换分区大小:4095.9 total 空闲的交换分区大小:4095.9 free 已使用的交换分区的大小:0.0 used 注:对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了 |
第6行 | 空行 |
第7行 | 第7行,各进程(任务)的状态监控 PID — 进程id |
【补充】:
a、僵尸进程如何查看和杀死
(top命令如果zombie字段大于0,表示存在僵尸进程)
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
命令注解:
-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程
运行结果参考如下:
Z 12334 12339 /path/cmd
这时,我们可以使用 kill -HUP 12339来杀掉这个僵尸进程
运行后,可以再次运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否将僵尸进程杀死
如果kill 子进程的无效,可以尝试kill 其父进程来解决问题,例如上面例子父进程pid是 12334,那么我们就运行 kill -HUP 12334
如果查出来的僵尸进程很多 ,如果是同一个父进程,可以直接杀死父进程,如果每个僵尸死进程的父进程不一样,可以使用如下命令批量杀死僵尸进程:
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
二、内存负载
1、查看内存使用情况
1.1、free命令查看
free -m #以MB为单位显示
free -h #以G为单位显示
free -h -s 3 #持续观看内存变化,每3秒显示一次,按ctrl c终止
【参数说明】:
- Mem 行(第二行)是内存的使用情况。
- Swap 行(第三行)是交换空间的使用情况。对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
- total 列显示系统总的可用物理内存和交换空间大小。
- used 列显示已经被使用的物理内存和交换空间。
- free 列显示还有多少物理内存和交换空间可用使用。严格来说used指的是现在系统内核控制的内存数,free是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
- shared 列显示被共享使用的物理内存大小。
- buff/cache 列显示被 buffer 和 cache 使用的物理内存大小,可用内存=free+buffer+cached。
- available 列显示还可以被应用程序使用的物理内存大小。
1.2、查看meminfo文件
cat /proc/meminfo #提供的信息和 free 命令看到的差不多
1.3、其他方式(vmstat、top)
vmstat -s #可以对内存使用情况进行统计, 类似于 /proc/meminfo
top -o %MEM #使用top查看,并按内存使用从大到小排序,%CPU是按cpu占用从大到小排序
【补充】:
a、查看物理内存硬件信息
dmidecode -t 17 # -t是type指定查看类型,17代表内存,其他类型可以使用man dmidecode查看
三、磁盘负载
1、查看硬盘信息
1.1、区分硬盘是固态盘还是机械盘
#方法1:
#sda替换为实际盘符,返回1表示机械盘,返回0表示固态盘,0表示磁盘不可以旋转,那么就是SSD了
cat /sys/block/sda/queue/rotational
#方法2:
lsblk -d -o name,rota #同样0表示固态,1表示机械
2、IO负载查看
2.1、iostat查看
# -x 选项将用于显示和io相关的扩展数据; 1表示间隔;10表示时间
iostat -x 1 10
【参数说明】:
选项 | 说明 |
r/s | 每秒完成的读次数 |
rkB/s | 每秒读数据量(kB为单位) |
rrqm/s | 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并 |
w/s | 每秒完成的写次数 |
wkB/s | 每秒写数据量(kB为单位) |
wrqm/s | 每秒对该设备的写请求被合并次数 |
%util | 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率,如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。 |
2.2、iotop查看
非系统自带,需要安装iotop包。
特点:用于查看哪个线程耗IO比较高,按o键只显示有磁盘IO活动的进程。
iotop
iotop命令参数说明:
-o, --only只显示正在产生I/O的进程或线程。除了传参,可以在运行过程中按o生效。
-b, --batch非交互模式,一般用来记录日志。
-n NUM, --iter=NUM设置监测的次数,默认无限。在非交互模式下很有用。
-d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1。
-p PID, --pid=PID指定监测的进程/线程。
-u USER, --user=USER指定监测某个用户产生的I/O。
-P, --processes仅显示进程,默认iotop显示所有线程。
-a, --accumulated显示累积的I/O,而不是带宽。
-k, --kilobytes使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用。
-t, --time 加上时间戳,非交互非模式。
-q, --quiet 禁止头几行,非交互模式。有三种指定方式。
-q 只在第一次监测时显示列名
-qq 永远不显示列名。
-qqq 永远不显示I/O汇总。
交互按键:
和top命令类似,iotop也支持以下几个交互按键。
left和right方向键:改变排序。
r:反向排序。
o:切换至选项--only。
p:切换至--processes选项。
a:切换至--accumulated选项。
q:退出。
i:改变线程的优先级。
四、网络负载
1、查看网卡设备是百兆/千兆/万兆
ethtool ens33 #ens33替换成实际网卡名
如果是bond,可以直接查看bond状态
cat /proc/net/bonding/bond0 #bond0根据实际bond名替换
如上,两个一万兆网卡做bond平衡轮询模式,所生成的bond速率是两万兆。
2、查看网络负载
2.1、sar命令分析
sar -n DEV 1 5 #每隔1秒显示1次,显示5次
【参数释义】
IFACE:这一列表示设备名称
rxpck/s:这一列表示每秒进入收取的包的数量
txpck/s:这一列表示每秒发送出去的包的数量
rxkB/s:这一列表示每秒收取的数据量(单位为KB)
txkB/s:这一列表示每秒发送的数据量
2.2、nethogs查看
特点:非系统自带,属于nethogs,用于显示网卡上进程级的流量信息
nethogs #查看所有网卡进程级流量,默认监控所有物理网卡
nethogs et0 #查看指定网卡进程级流量
nethogs -v 3 #指定网卡流量显示单位,默认KB,(0 = KB/s, 1 = total KB, 2 = total B, 3 = total MB)
nethogs -a #-a参数可以监控所有流量网卡,特别是回环口流量