系统状态和性能监控

最近更新时间:2024-09-19 15:24:51

我的收藏

第一章 TUNED入门

TuneD 是一项服务,可监控您的系统并优化特定工作负载下的性能。
TuneD 的核心是配置文件,可针对不同的用例调整您的系统。TuneD 提供的配置文件分为以下几类:
节能配置文件。
性能提升配置文件。

合并优化配置文件

TuneD 可以一次选择更多配置文件,TuneD 将在加载期间尝试合并它们。如果存在冲突,则最后指定配置文件中的设置优先。
前提:安装 tuned。
例如:虚拟访客中的低功耗。
1. 启动 tuned。
service tuned start
Redirecting to /bin/systemctl start tuned.service
2. 优化系统以在云服务器中运行以获得最佳性能,并调优以实现低功耗。
tuned-adm profile virtual-guest powersave

优化策略

balanced:默认的省电配置文件。它旨在成为性能和功耗之间的折衷方案。它尽可能使用自动缩放和自动调整。唯一的缺点是延迟增加。
powersave:最大节能性能的配置文件。它可以限制性能以最小化实际功耗运行。
throughput-performance:针对高吞吐量优化的服务器配置文件。它禁用节能机制并启用 sysctl 设置,以提高磁盘和网络 IO 的吞吐量性能。
accelerator-performance:加速器性能配置文件包含与吞吐量性能配置文件相同的调整。可以将 CPU 锁定到低 C 状态,因此延迟小于 100us。提高了某些加速器的性能,例如 GPU。
virtual-guest:基于吞吐量性能配置文件,除其他任务外,该配置文件可减少虚拟内存交换并增加磁盘预读值。
virtual-host:该配置文件可减少虚拟内存交换,增加磁盘预读值,并启用更积极的脏页写回值。
optimize-serial-console:通过减少 printk 值来调整串行控制台的 I/O 活动的配置文件。
tuned-adm profile throughput-performance optimize-serial-console
intel-sst:针对具有用户定义的 Intel Speed Select Technology 配置的系统优化的配置文件。
tuned-adm profile cpu-partitioning intel-sst

优化的 CPU 分区配置文件

/etc/tuned/cpu-partitioning-variables.conf 文件中配置 cpu-partitioning 配置文件:具有负载平衡的隔离 CPU、无负载平衡的隔离 CPU、内务处理 CPU。

使用调整后的 CPU 分区配置文件以实现低延迟调整

前提:用 root 身份使用 yum install tuned-profiles-cpu-partitioning 命令安装 cpu-partitioning TuneD 配置文件。
1. 编辑 /etc/tuned/cpu-partitioning-variables.conf 文件并添加以下信息。
Isolated CPUs with the kernel’s scheduler load balancing:

isolated_cores=2-23

Isolated CPUs without the kernel’s scheduler load balancing:

no_balance_cores=2,3
2. 设置 cpu-partitioning TuneD 配置文件。
tuned-adm profile cpu-partitioning
3. 重启。

安装和启动 Tuned

1. 安装 tuned 包。
yum install tuned
2. 启动并启用 tuned 服务。
systemctl enable --now tuned
3. (可选)为实时系统安装 TuneD 配置文件。
yum install tuned-profiles-realtime tuned-profiles-nfv
4. 验证 TuneD 配置文件是否处于活动状态并已应用。
查看当前系统使用配置文件命令:tuned-adm active。
Current active profile: virtual-guest
查看当前系统设置与预设配置文件匹配命令:#tuned-adm verify。
Verfication succeeded, current system settings match the preset profile.
See TuneD log file ('/var/log/tuned/tuned.log') for details.

列出可用的调整配置文件

1. 列出系统上所有可用的 TuneD 配置文件。
tuned-adm list
Available profiles:
- accelerator-performance - Throughput performance based tuning with disabled higher latency STOP states
- balanced - General non-specialized tuned profile
- cpu-partitioning - Optimize for CPU partitioning
- desktop - Optimize for the desktop use-case
- hpc-compute - Optimize for HPC compute workloads
- intel-sst - Configure for Intel Speed Select Base Frequency
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- my-profile
- network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- optimize-serial-console - Optimize for serial console use.
- powersave - Optimize for low power consumption
- realtime - Optimize for realtime workloads
- realtime-virtual-guest - Optimize for realtime workloads running within a KVM guest
- realtime-virtual-host - Optimize for KVM guests running realtime workloads
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest - Optimize for running inside a virtual guest
- virtual-host - Optimize for running KVM guests
Current active profile: virtual-guest
2. 仅显示当前活动的配置文件。
tuned-adm active
Current active profile: virtual-guest

设置一个经过调整的配置文件

此过程会在您的系统上激活选定的 TuneD 配置文件。
1. 您可以让 TuneD 为您的系统推荐最合适的配置文件。
tuned-adm recommend
virtual-guest
2. 激活配置文件。
tuned-adm profile selected-profile
激活多个配置文件命令。
tuned-adm profile profile1 profile2
3. 重启系统。
reboot
4. 验证 TuneD 配置文件是否处于活动状态并已应用。
tuned-adm verify
Verfication succeeded, current system settings match the preset profile.
See TuneD log file ('/var/log/tuned/tuned.log') for details.

禁用 TUNED

1. 暂时禁用所有 tuned。
tuned-adm off
2. 永久停止和禁用 tuned 服务。
systemctl disable --now tuned

第二章 磁盘管理

查看磁盘

1. 查看磁盘信息,但不会显示未挂载的磁盘。
df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 830M 0 830M 0% /dev
tmpfs 845M 24K 845M 1% /dev/shm
tmpfs 845M 250M 596M 30% /run
tmpfs 845M 0 845M 0% /sys/fs/cgroup
/dev/vda1 50G 4.5G 43G 10% /
tmpfs 169M 0 169M 0% /run/user/0
2. 查看主机所有的磁盘列表。
fdisk -lu
Disk /dev/vda: 50 GiB, 53687091200 bytes, 104857600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 262144 bytes / 262144 bytes
Disklabel type: dos
Disk identifier: 0xe609e297
Device Boot Start End Sectors Size Id Type
/dev/vda1 2048 104857566 104855519 50G 83 Linux
3. 查看指定目录磁盘使用情况。
在命令后直接放目录名:df -h /dev。
Filesystem Size Used Avail Use% Mounted on
devtmpfs 830M 0 830M 0% /dev
df 命令介绍:
-a:列出所有的文件系统,包括系统特有的 /proc 等文件系统。
-k:以 KB 的容量显示各文件系统。
-m:以 MB 的容量显示各文件系统。
-h:以人们较易阅读的 GB,MB,KB 等格式自行显示。
-H:以 M=1000K 替代 M=1024K 的进位方式。
-T:显示文件系统类型。
-i:不用硬盘容量,而以 inode 的数量来显示。
-l:只显示本机的文件系统。
du 命令介绍:
作用:使用 du 命令查看指定目录的使用情况。
选项:-h:输出文件系统分区使用的情况。
-s:显示文件或整个目录的大小。

添加新磁盘

新添加硬盘后,我们如果想使用这块硬盘,必须通过分区 -> 格式化 -> 挂载后才可以使用。
1. 分区:一共有两种分区方式。
采用 MBR 的方式进行分区,即 fdisk 命令。
采用 GPT 的方式进行分区,即 gdisk 命令。
2. 格式化磁盘:
mkfs
将指定分区格式化为 ext4 格式:mkfs -t ext4 /dev/sdb1
格式化指定磁盘 2G 空间:mkfs /dev/sdb2 2G
3. 挂载:
建立设备份区和系统目录的映射关系。
mount [设备名称] [挂载目录]。

删除磁盘分区

1. 查看硬盘信息,找到自己想要删除哪块硬盘上的分区。
fdisk -l
2. 进入该磁盘分区。
fdisk 设备名称
3. 输入 d 表示删除分区,若有多个分区,则会需要选择分区号。
command(m for help): d
4. 输入 w 保存退出。

可用的磁盘调度程序

none:
先入先出(FIFO)调度算法。它通过简单的最后一个缓存合并通用块层的请求。
mq-deadline:
尝试从请求到达调度程序时起为请求提供保证的延迟。此调度程序适用于大多数用例,特别是写操作大部分异步的情况。
bfq:
以桌面系统和互动任务为目标。此调度程序适合用于复制大型文件,在这种情况下,系统也不会变得无响应。
kyber:
调度程序通过计算提交至块 I/O 层的每个 I/O 请求的延迟来调整自身以达到延迟目标。这个调度程序适合快速设备,如 NVMe、SSD 或其他低延迟设备。
默认磁盘调度程序:
对于非易失性 Memory Express(NVMe)块设备,默认调度程序是 none。

确定活跃磁盘调度程序

查看哪个磁盘调度程序目前在给定块设备中活跃。
cat /sys/block/ 设备 /queue/scheduler 将设备替换为块设备名称。
[none] mq-deadline kyber bfq

使用 TuneD 设置磁盘调度程序

1. 查看哪个配置集当前处于活跃状态。
tuned-adm active
2. 创建保存 TuneD 配置集的新目录。
mkdir /etc/tuned/my-profile
3. 查找所选块设备系统唯一标识符。
devadm info --query=property --name=/dev/device | grep -E '(WWN|SERIAL)'
[root@VM-6-117-centos ~]# udevadm info --query=property --name=/dev/sr0 | grep -E '(WWN|SERIAL)'

ID_SERIAL=QEMU_DVD-ROM_QM00002

ID_SERIAL_SHORT=QM00002
4. 创建 /etc/tuned/my-profile/tuned.conf 配置文件。在该文件中设置,为与 WWN 标识符匹配的设备设置所选磁盘调度程序。
[disk]

devices_udev_regex=IDNAME=device system unique id

elevator=selected-scheduler
5. 启用您的配置集。
tuned-adm profile my-profile
6. 验证 TuneD 配置集是否活跃并应用。
tuned-adm active
Current active profile: my-profile
tuned-adm verify
Verfication succeeded, current system settings match the preset profile.

See TuneD log file ('/var/log/tuned/tuned.log') for details.
7. 读取 /sys/block/ 设备 /queue/scheduler 文件的内容。
cat /sys/block/device/queue/scheduler
[root@VM-6-117-centos ~]# cat /sys/block/sr0/queue/scheduler

mq-deadline kyber [bfq] none

使用 udev 规则设置磁盘调度程序

1. 查找块设备系统唯一标识符。
udevadm info --name=/dev/sr0 | grep -E '(WWN|SERIAL)'
[root@VM-6-117-centos ~]# udevadm info --name=/dev/sr0 | grep -E '(WWN|SERIAL)'

E: ID_SERIAL=QEMU_DVD-ROM_QM00002

E: ID_SERIAL_SHORT=QM00002
2. 配置 udev 规则。使用以下内容创建 /etc/udev/rules.d/99-scheduler.rules 文件。
注意:
将 IDNAME 替换为要使用的标识符的名称(如 ID_WWN)。
将 设备系统唯一 id 替换为所选标识符值(例0x5002538d00000000)。
ACTION=="add|change", SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="QM00002", ATTR{queue/scheduler}="bfq"
3. 重新载入 udev 规则。
udevadm control --reload-rules
4. 应用调度程序配置。
udevadm trigger --type=devices --action=change
5. 验证活跃的调度程序。
cat /sys/block/device/queue/scheduler*
[root@VM-6-117-centos ~]# cat /sys/block/sr0/queue/scheduler
mq-deadline kyber [bfq] none

为特定磁盘临时设置调度程序

此流程为特定块设备设置给定磁盘调度程序。系统重启后该设置不会保留。
1. 将所选调度程序的名称写入 /sys/block/ 设备 /queue/scheduler 文件。
echo selected-scheduler > /sys/block/device/queue/scheduler
在文件名中,将 device 替换为块设备名称,如 vda。
2. 验证调度程序是否在该设备中活跃。
cat /sys/block/device/queue/scheduler
[root@VM-6-117-centos ~]# cat /sys/block/vda/queue/scheduler

[none] mq-deadline kyber bfq

第三章 CPU 使用率以及调优

显示 CPU 的架构信息

1. 收集 CPU 的架构信息,如 CPU、线程、内核、插槽和 NUMA 节点的数量。
lscpu
[root@VM-6-117-centos ~]# 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: 2
Core(s) per socket: 1
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
BIOS Vendor ID: Smdbmds
CPU family: 6
Model: 106
Model name: Intel(R) Xeon(R) Platinum 8374C CPU @ 2.70GHz
BIOS Model name: 3.0
Stepping: 6
CPU MHz: 2700.000
BogoMIPS: 5400.00
Hypervisor vendor: KVM
Virtualization type: full
L1d cache: 48K
L1i cache: 32K
L2 cache: 1280K
L3 cache: 58368K
NUMA node0 CPU(s): 0,1
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch cpuid_fault invpcid_single ssbd ibrs ibpb ibrs_enhanced fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 wbnoinvd arat avx512vbmi umip avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq arch_capabilities

查看 CPU 的使用率:

展示 CPU 的性能。
top
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。
nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
system(通常缩写为 sy),代表内核态 CPU 时间。
idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。
iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。
irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。
softirq(通常缩写为 si),代表处理软中断的 CPU 时间。
steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比。
公式:CPU 使用率 = 1 - 空闲时间 / 总 CPU 时间。

查看 CPU 使用率:

安装 sysstat 工具。
yum install sysstat
查看 CPU 占用命令:pidstat 1
[root@VM-6-117-centos ~]# pidstat 1
Linux 5.4.119-19-0009.1 (VM-6-117-centos) 08/19/2022 _x86_64_ (2 CPU)
03:11:04 PM UID PID %usr %system %guest %wait %CPU CPU Command
03:11:05 PM 0 561098 1.00 0.00 0.00 0.00 1.00 0 barad_agent
03:11:05 PM UID PID %usr %system %guest %wait %CPU CPU Command
03:11:06 PM 0 561098 0.00 1.00 0.00 0.00 1.00 0 barad_agent

perf 工具

1. 安装 perf 工具。perf 用户空间工具是基于内核的 Linux 子系统性能计数器(PCL)接口。Perf 是一个强大的工具,它使用性能监控单元(PMU)来测量、记录和监控各种硬件和软件事件。
yum install perf
2. 使用 perf top 分析 CPU 使用率。
perf top 命令用于实时系统分析,其功能与 top 实用程序类似。但是,top 实用程序通常显示给定进程或线程使用的 CPU 时间,perf top 会显示每个特定功能使用的 CPU 时间。
perf top
6.48% perf [.] __symbols__insert
5.21% [kernel] [k] kallsyms_expand_symbol.constprop.1
4.80% perf [.] rb_next
2.48% perf [.] rust_demangle_callback
2.42% libc-2.28.so [.] __GI_____strtoull_l_internal
2.32% [kernel] [k] vsnprintf
2.10% [kernel] [k] number
由图可知,SLsmg_write_chars 功能使用最多 CPU 时间。

perf 调查忙碌 CPU

1. 计数禁用 CPU 数量聚合的事件。
perf stat -a -A sleep seconds
指定周期等事件:perf stat -a -A -e cycles sleep seconds
2. 显示使用 perf 报告进行的 CPU 样本。
当前目录中创建了 perf.data 文件,该文件含有 perf 记录。
perf report --sort cpu
按 CPU 和命令排序:perf report --sort cpu,comm

使用 perf top 分析时显示特定的 CPU

perf top --sort cpu
按 CPU 和命令排序:perf top --sort cpu,comm

记录报告和监控特定 CPU

1. 在特定 CPU 中记录性能数据,生成 perf.data 文件,使用以逗号分隔的 CPU 列表。
perf record -C 0,1 sleep seconds
使用一组 CPU。
perf record -C 0-2 sleep seconds
2. 显示 perf.data 文件的内容,以进一步分析。
perf report

第四章 内存使用率

查看内存使用情况

1. 使用 free 命令:free
[root@VM-6-117-centos ~]# free
total used free shared buff/cache available
Mem: 1730432 375364 130400 255480 1224668 932144
Swap: 0 0 0
total 表示总共有 1.6G 的内存。
used 表示物理内存的使用量,大概215M。
free 表示空闲内存。
shared 表示共享内存。
buff/cache 表示缓存和缓冲内存量,Linux 系统会将很多东西缓存起来以提高性能,这部分内存可以在必要时进行释放,给其他程序使用。
available 表示可用内存。
Swap 表示交换内存。
2. 使用 vmstat:vmstat -m
[root@VM-6-117-centos ~]# vmstat -m
Cache Num Total Size Pages
rpc_inode_cache 46 46 704 23
rpc_buffers 16 16 2048 16
rpc_tasks 16 16 256 16
ext4_groupinfo_4k 420 420 144 28
fscrypt_info 0 0 104 39
fscrypt_ctx 0 0 64 64
bridge_fdb_cache 0 0 128 32
ip6-frags 0 0 208 19
fib6_nodes 128 128 64 64
ip6_dst_cache 32 32 256 16
对内存使用情况进行统计。
3. 查看 /proc/meminfo:cat /proc/meminfo
[root@VM-6-117-centos ~]# cat /proc/meminfo
MemTotal: 1730432 kB
MemFree: 131156 kB
MemAvailable: 933048 kB
Buffers: 80508 kB
Cached: 1070344 kB
SwapCached: 0 kB
Active: 847508 kB
Inactive: 575192 kB
Active(anon): 437152 kB
Inactive(anon): 90176 kB
Active(file): 410356 kB
Inactive(file): 485016 kB
Unevictable: 0 kB
Mlocked: 0 kB
/proc 目录下都是虚拟文件,包含内核以及操作系统相关的动态信息,/proc/meminfo 是了解 Linux 系统内存使用状况的主要接口,我们最常用的 freevmstat 等命令就是通过它获取数据的 ,/proc/meminfo 所包含的信息比 free 等命令要丰富得多。

查看物理内存信息

1. dmidecode 命令。
dmidecode -t 17
展示的信息包括 内存大小, 类型,带宽等信息。

虚拟内存

1. 介绍:物理内存是有限的(即使支持了热插拔)、非连续的,不同的 CPU 架构对物理内存的组织都不同。这使得直接使用物理内存非常复杂,为了降低使用内存的复杂度,引入了虚拟内存机制。
2. 使用方法:通过虚拟内存机制,每个进程都以为自己占用了全部内存,进程访问内存时,操作系统都会把进程提供的虚拟内存地址转换为物理地址,再去对应的物理地址上获取数据。
3. 虚拟内存不仅通过内存地址转换解决了多个进程访问内存冲突的问题,还带来更多的益处:
进程内存管理:内存完整性由于虚拟内存对进程的欺骗,每个进程都认为自己获取的内存是一块连续的地址。我们在编写应用程序时,就不用考虑大块地址的分配,总是认为系统有足够的大块内存即可。
数据共享:通过虚拟内存更容易实现内存和数据的共享。

段页机制

现代操作系统的内存管理机制有两种:段式管理页式管理
段式内存管理,就是将内存分成段,每个段的起始地址就是段基地址。地址映射的时候,由逻辑地址加上段基地址而得到物理地址。
页式内存管理,内存分成固定长度的一个个页片。地址映射的时候,需要先建立页表,页表中的每一项都记录了这个页的基地址。通过页表,由逻辑地址的高位部分先找到逻辑地址对应的页基地址,再由页基地址偏移一定长度就得到最后的物理地址,偏移的长度由逻辑地址的低位部分决定。
段页式内存管理需要通过段表和页表的一同使用,段表中包含:段号、段内页表的起始地址,页表包含:页号、页内偏移量。通过虚拟地址中的段号在段表中找到对应的段号项,通过段表中的段号项可以得到段内页表的起始地址(也就是这个分段对应的页表),在得到该段内存对应的页表后可以通过虚拟地址中的段内页号找到对应的页表项得到物理起始地址,加上虚拟地址中的页内偏移量就对应的物理地址。

内存回收

1. 内存回收的目标:对于内核并不是所有的物理内存都可以参与回收,例如内核的代码段,如果被内核回收了,系统就无法正常运行了,所以一般内核代码段、数据段、内核申请的内存、内核线程占用的内存等都是不可以回收的,除此之外的内存都可以是我们要回收的目标。
2. 内存回收时机:
内核需要为任何时刻突发到来的内存申请提供足够的内存,以便 cache 的使用和其他相关内存的使用不至于让系统的剩余内存长期处于很少的状态。
当真的有大于空闲内存的申请到来的时候,会触发强制内存回收。
3. 回收机制:
针对第1种,Linux 系统设计了 kswapd 后台程序,当内核分配物理页面时,由于系统内存短缺,没法在低水位情况下分配内存,因此会唤醒 kswapd 内核线程来异步回收内存。也就是周期性内存回收机制。
针对第2种,Linux 系统会触发直接内存回收(direct reclaim),在内核调用页分配函数分配物理页面时,由于系统内存短缺,不能满足分配请求,内核就会直接触发页面回收机制,尝试回收内存来解决问题。也就是直接内存回收。