系统底层综合知识
查看cpu相关信息
关于物理CPU,物理核,逻辑核:
- 物理CPU:主板上真正安装的CPU个数,通过physical id可以查看。
- 物理核:一个CPU会集成多个物理核,通过core id可以查看物理核的序号。
- 逻辑核: Intel运用了超线程技术,一个物理核可以被虚拟出多个逻辑核,processor是逻辑核序号。
以上信息都可以通过cat /proc/cpuinfo
来查看。包括虚拟机也可以。
virtualbox虚拟机一般是虚拟机出一个物理CPU、N个物理核,每个物理核对应一个逻辑核。
云平台的虚拟机可能是虚拟出N个物理CPU,总共只有一个物理核,每个物理CPU对应一个逻辑核。
以上两种方式最终都是虚拟出N个逻辑核。
值得注意的是,在一个物理核上超线程出来的两个逻辑核实际上不仅仅共享同一个物理核,还共享该物理核所持有的L1和L2缓存。
查看总的:
bash
cat /proc/cpuinfo | grep -E "core id|processor|physical id"
查看具体某一个:
bash
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
grep 'core id' /proc/cpuinfo|sort|uniq|wc -l
grep 'processor' /proc/cpuinfo|sort|uniq|wc -l
其他方式查看:
bash
grep -c processor /proc/cpuinfo
grep processor /proc/cpuinfo|wc -l
注意编号的可重复性
例如,一个服务器有 2 个物理 CPU,每个物理 CPU 有 4 个核心,那么第一个物理 CPU 的核心编号可能是 0、1、2、3,而第二个物理 CPU 的核心编号也可能是 0、1、2、3
单独查看结果:2 4 8 (physical id core id processor)表示 2 个物理 CPU,每个物理 CPU 有 4 个核心,总共 8 个逻辑核。一个核心对应一个逻辑核,没有启用超线程。如果启用超线程,结果可能为:2 4 16
所以,上面所说的,查看总的是靠谱的,因为同时列出的是所有的,但是去重查看具体某一个的方法,不一定靠谱。
使用top命令也可以知道cpu的总核数,通过执行top命令,然后按数字1,即可显示所有的CPU核数。
top命令看到的CPU核是逻辑核。
超线程的性能:
据Intel官方介绍,相比直接使用物理核,使用逻辑核平均性能只提升20-30%。也就是说,24核的超线程,比不开超线程的12核,最多只能提升30%。线上的服务器默认都是开启超线程的。
让我们从单线程视角来看,由于你的进程被其他进程分享了L1和L2缓存,这就导致cache miss变多,性能会比不开超线程要差。
其他知识点:L1、L2、L3、TLB缓存、Cache Line、地址对齐、页表大小、页表级数等。参考:《深入理解Linux进程与内存》第一章。
查看cpu架构信息:
bash
lscpu
lscpu 结果解析
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 4
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Model name: Intel(R) Xeon(R) CPU E7-4820 v3 @ 1.90GHz
Stepping: 4
CPU MHz: 1895.432
BogoMIPS: 3790.86
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 25600K
NUMA node0 CPU(s): 0-7
Flags: fpu vme de pse tsc arch_capabilities ...
总逻辑 CPU 数 = Socket(s) × Core(s) per socket × Thread(s) per core
例如:1 Socket × 8 Cores × 2 Threads = 16 逻辑 CPU
内核与线程:
- Socket(s) 物理 CPU 插槽数量(如 1 表示单 CPU 主板)
- Core(s) per socket 每个物理 CPU 插槽(Socket)的物理核心数(如 8 表示 8 核)
- Thread(s) per core 每个物理核心支持的线程数(超线程技术启用时为 2)
CPU频率:
- CPU MHz: 1895.432
含义:当前 CPU 的运行频率为 1895.432 MHz(1.895 GHz)。基础频率,实际频率可能因负载和节能模式动态变化(可通过 cpupower frequency-info 查看)。
说明:这是 CPU 当前的运行频率,可能会因节能模式或负载而变化。
- BogoMIPS: 3790.86
含义:虚拟的 MIPS(每秒百万指令数)值。
说明:这是一个粗略估算值,用于大致衡量 CPU 的性能。仅用于启动时内核调度器校准,无实际性能意义。
虚拟化相关:
- Hypervisor vendor: VMware
含义:虚拟化技术提供商为 VMware。
说明:这表明系统运行在 VMware 的虚拟化环境中。
- Virtualization type: full
含义:虚拟化类型为全虚拟化。在全虚拟化中,这个“虚拟电脑”看起来和真实电脑一模一样,操作系统完全不知道自己是在虚拟环境中运行的。兼容性很好,性能可能会稍逊于半虚拟化,因为需要模拟硬件。
说明:这意味着虚拟机直接运行在硬件上,而不需要修改操作系统。
虚拟化方式:
- 全虚拟化(full):完全模拟硬件,操作系统无需修改,兼容性最好,但性能稍差。
- 半虚拟化(paravirtualized):操作系统需要修改,性能更好,但兼容性有限。
- 部分虚拟化(partial):只模拟部分硬件,兼容性和性能都有限。
- 硬件辅助虚拟化(hardware-assisted):利用硬件特性加速虚拟化,性能和兼容性都很好,但需要硬件支持。
注意事项
虚拟化环境:在虚拟机中运行 lscpu 时,部分参数(如 Vendor ID)可能显示为宿主机信息。
free 结果解析
以free -m
为例:
total used free shared buff/cache available
Mem: 19897 7041 1666 971 11189 11552
Swap: 0 0 0
- 总内存:19897 MB
- 已使用内存:7041 MB
- 空闲内存:1666 MB
完全空闲,没有被任何进程或系统占用。
- 共享内存:971 MB
被多个进程共享的内存大小。例如,某些库或数据结构可能被多个进程共享,这部分内存只计算一次。
- 缓冲区/缓存内存:11189 MB
这部分内存被系统用于缓存磁盘数据或作为缓冲区。虽然它被“占用”,但可以随时释放给需要的进程。它提高了系统的读写性能。(并不会释放全部,会保留一部分用于性能优化。)
- 实际可用内存:11552 MB
系统可以立即分配给新进程的内存大小,包括空闲内存和可以释放的缓冲区/缓存内存。这个值更能反映系统的实际可用内存情况。
关系分析:
1、total = used + free + buff/cache
19897 = 7041 + 1666 + 11189
19897 = 19896 # 由于四舍五入,可能存在微小的误差
2、available = free + 可释放的 buff/cache
11552 = 1666 + 11189可释放的部分(9886)
9886 < 11189,占比88%,说明 buff/cache 释放了大部分,但仍有部分无法释放。
说明:available 是系统可以立即分配给新进程的内存大小,包括空闲内存和可以释放的缓冲区/缓存内存。通常情况下,available 会略小于 free + buff/cache,因为系统会保留一部分缓冲区/缓存内存用于性能优化。
查看更多内存信息:
bash
cat /proc/meminfo
lshw查看物理内存大小:
bash
sudo lshw -short -C memory | grep 'System Memory'
x86_64与长模式
x86_64(即64位x86架构)的处理器并不总是运行在长模式(Long Mode)下,但其对64位操作的支持依赖于长模式。
特性 | 实模式 | 保护模式 | 虚拟 8086 模式 | 长模式 |
---|---|---|---|---|
位宽 | 16 位 | 32 位 | 16 位(仿真) | 64 位 |
内存保护 | ❌ 无 | ✔️ 段+页 | ✔️ 分页隔离 | ✔️ 纯分页 |
特权级 | ❌ 无 | ✔️ Ring 0-3 | ✔️ Ring 3 | ✔️ Ring 0-3 |
最大物理内存 | 1 MB | 4 GB | 依赖宿主模式 | 256 TB(实际) |
虚拟内存 | ❌ 不支持 | ✔️ 支持 | ✔️ 支持 | ✔️ 增强支持 |
典型应用 | BIOS/DOS | 32 位 OS | 旧程序兼容 | 64 位 OS |
常见误解澄清:
误区:x86_64处理器只能运行在长模式下。
事实:x86_64兼容所有传统模式,具体模式取决于运行的操作系统和代码类型。
误区:64位程序必须全程在长模式下运行。
事实:CPU在启动时需经历实模式和保护模式,最终由操作系统切换到长模式。
模式切换的典型流程,以启动64位操作系统为例:
- 实模式:CPU启动时默认状态,执行BIOS/UEFI代码。
- 保护模式:引导加载程序(如GRUB)切换到保护模式,加载内核。
- 长模式:内核初始化时启用长模式(通过设置CR0.PG和CR4.PAE,并加载64位页表)。
- 兼容模式(可选):64位操作系统通过兼容模式运行32位程序。
总结:
1、x86_64处理器支持多种模式,长模式是其运行64位代码的必要条件,但并非唯一模式。
2、是否处于长模式取决于当前执行的代码和操作系统:
- 64位操作系统内核:始终在长模式的64位模式下运行。
- 32位操作系统内核:全程运行在保护模式。
- 启动阶段:依次经历实模式、保护模式,最终进入长模式。
系统性能工具之sar
sysstat与sar
sysstat是Linux系统中的常用工具包,而sar 是 Linux中sysstat工具包中的用于监控Linux系统性能的工具之一。
sysstat 工具包中包含两种类型的工具:即时查看工具(iostat、mpstat、sar);累计统计工具(sar)。
因此sar命令,又叫做系统活动情况报告。不仅可以实时查看服务器的性能,还可以做累计统计。
安装:
bash
sudo yum/apt install sysstat
然后启用数据收集:
bash
sudo vi /etc/default/sysstat
change ENABLED="false" to ENABLED="true"
重新启动sysstat服务:
bash
sudo service sysstat restart
安装完成后,就可以利用这款强大的工具去监控我们的 Linux 操作系统了,macos下没有sysstat。
常用参数与示例
统计CPU设备的负载信息,每次间隔2秒,共3次:
bash
sar -u 2 3
统计硬盘设备的读写信息,每次间隔2秒,共3次:
bash
sar -d 2 3
统计内存设备的读写信息,每次间隔2秒,共3次:
bash
sar -r 2 3
统计内存设备的分页使用情况,每次间隔5秒,共3次:
bash
sar -B 5 3
查看I/O负载,每隔一秒刷新,刷新10次:
bash
sar -b 1 10
查看swap分区页面交换情况:
bash
sar -W 1 3
显示CPU使用率情况:
bash
sar -u
显示系统负载情况:
bash
sar -q
查看队列长度和CPU平均负载,每隔一秒刷新,刷新10次:
bash
sar -q 1 10
显示硬盘I/O和传输速率情况:
bash
sar -b
显示网卡和网络情况:
bash
sar -n DEV
参考资料
- Linux实例负载高问题排查和异常处理
- https://zhuanlan.zhihu.com/p/34223218
- https://blog.csdn.net/cron_zzx/article/details/87972234
- https://www.linuxcool.com/sar
性能分析工具之perf
perf Examples
Linux上的perf工具是一个强大的性能分析工具,它可以帮助开发者和系统管理员监控和分析系统性能。
最详尽的文档,直接查看文档说明:
https://www.brendangregg.com/perf.html
摘录一些用法
实时性能监控
bash
perf top
这个命令会实时显示当前系统中占用CPU资源最多的函数或指令,类似于top命令,但是专注于性能事件。
统计程序性能
bash
perf stat ls
这个命令会运行ls命令,并在执行前后显示这段时间内系统的性能统计数据,如CPU时间、上下文切换、缓存事件等。
记录性能数据
bash
perf record -e cpu-cycles -g ./your_program
这个命令会记录./your_program运行时的CPU周期事件,并开启调用栈记录。
报告性能分析结果
bash
perf report
这个命令会读取由perf record命令生成的性能数据文件,并生成易于理解的性能报告 。
分析特定进程的性能
bash
perf stat -p <PID>
用-p选项指定进程ID,可以分析特定进程的性能概况 。
生成火焰图
bash
perf record -F 99 -a -g -- sleep 60
perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > flamegraph.svg
这一系列命令会生成一个火焰图,它可以帮助可视化程序中的性能热点 。
分析内核锁的性能
bash
perf lock record
perf lock report
这两个命令分别用于记录和报告内核锁的性能,包括锁的等待时间和争用情况 。
分析内核内存分配
bash
perf kmem record --page ls
perf kmem stat --page
使用perf kmem可以分析内核slab分配器的性能,包括内存分配和释放事件 。
自定义动态跟踪点
bash
perf probe --line schedule
perf probe -a schedule:12
使用perf probe可以定义新的动态跟踪点,例如在schedule函数的第12行添加一个探测点 。