服务器性能排查
一、linux常用监控cpu整体性能的工具------vmstat
功能:报告关于内核线程、虚拟内存、磁盘、陷阱和cpu活动的统计信息。
参数详解:
-f 显示系统启动后的派生数目。
-i 显示从系统启动后每隔设备造成的终端数目。
-I 用新的输出栏显示I/O定向视图,p在标题kthr下,栏fi和fo在标题页面下,而不是栏下;re和cy在页标题中。
-vs 显示所有可用的vmm(运行各种虚拟机的OS)统计信息
-t 显示vmstat的每一输出行旁边的时间戳记。时间戳记按照HH:MM:SS格式显示。
范例:
1、vmstat 显示引导后的统计信息摘要
2、vmstat 2 5
显示2秒时间间隔的5个摘要,第一次摘要包含引导后的时间统计信息
3、vmstat scdisk13 scdisk14
显示引导后包括逻辑磁盘scdisk13和scdisk14的统计信息摘要
4、vmstat -f 显示派生统计信息
5、vmstat -s 对cpu,内存使用情况进行统计
6、vmstat -t 显示每一输出栏旁边的时间戳记
7、vmstat -I 要以另一套输出栏显示新的I/O定向视图
8、vmstat -vs 显示所有可用的vmm统计信息
各项意义:
vmstat 1 10
【procs】
r:在运行队列中等待的进程数
ready
b:在等待io的进程数
w:可进入运行队列但被替换的进程
【memory】
swpd:虚拟内存使用情况,单位KB。
swap:现时可用的交换内存,单位KB
free:空闲的内存,单位KB
buff:被用来做为缓存的内存数,单位KB
【swap】
si:从磁盘交换到内存的交换页数量,单位:KB/秒
so:从内存交换到磁盘的交换页数量,单位:KB/秒
【io】
bi:发送到块设备的块数,单位:块/秒
bo:从块设备接收到的块数,单位:块/秒
【system】
in:每秒中断书,包括时钟中断
cs:每秒的环境(上下文)切换次数
us:cpu用户使用时间百分比
sy:cpu系统使用时间百分比
id:cpu空闲时间百分比
wa:IO等待消耗的cpu时间百分比
分析:
(1)若连续
r>us,表示系统现在运行比较慢,有多数的进程在等待cpu。造成系统中进行运行过慢。
(2)若 r>4sy,则系统面临着cpu短缺的问题,或者是cpu速率过低。
(3)若经常 r>4 &
id<40,表示cpu的负荷很重。
(4)si,so值越大,会看到由内核消耗的cpu时间会越大。
(5)若swap(si和so)值比较高,并且free比较少,有可能是内存不足。
(6)若有过多的上下文切换(cs)和disk block从RAM中被读入(bo),就有可能导致cpu使用过高。
(7)sy的值高时,说明系统内核消耗的cpu资源多
(8)us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
(9)id持续为0并且sy=2us,系统则面临着cpu资源的短缺。
(10)wa>25%,表明磁盘子系统可能没有被正确平衡,或可能是磁盘工作负荷很重的结果。
如果再一个单用户系统中,us+sy>90%,我们就不认为系统的cpu是有瓶颈的
如果在一个多用户系统中,us+sy>80%,我们就认为系统的cpu是有瓶颈的。其中的进程将要花时间在运行队列中等待。响应时间和吞吐量会受损害。
(11)wa>40%表明磁盘io没有也许存在不合理的平衡,或者对磁盘操作比较频繁
(12)wa值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)
结论:只是一个I/O瓶颈。
解决办法:
当发生以上问题的时候请先调整应用程序对CPU的占用情况.使得应用程序能够更有效的使用CPU.同时可以考虑增加更多的CPU. 关于CPU的使用情况还可以结合mpstat, ps aux top prstat –a等等一些相应的命令来综合考虑关于具体的CPU的使用情况,和那些进程在占用大量的CPU时间.一般情况下,应用程序的问题会比较大一些.比如一些SQL语句不合理等等都会造成这样的现象.
二、查看内存使用情况
1. 使用 free
命令
free
命令是Linux系统中最简单和最常用的内存查看命令, 示例如下:
-
[root@centos ~]# free -m
total used free shared buff/cache available
Mem: 32157 747 1191 444 30219 30503
Swap: 4095 7 4088 -
[root@centos ~]# free -h
total used free shared buff/cache available
Mem: 31G 749M 1.2G 444M 29G 29G
Swap: 4.0G 7.4M 4.0G
其中, -m 选项是以MB为单位来展示内存使用信息; -h 选项则是以人类(human)可读的单位来展示。
上面的示例中, Mem: 这一行:
- total 表示总共有的物理内存(RAM)。
- used 表示物理内存的使用量,。
- free 表示空闲内存;
- shared 表示共享内存?;
- buff/cache 表示缓存和缓冲内存量; Linux 系统会将很多东西缓存起来以提高性能,这部分内存可以在必要时进行释放,给其他程序使用。
- available 表示可用内存;
输出结果很容易理解。 Swap 这一行表示交换内存,从示例中的数字可以看到,基本上没使用到交换内存。
2. 查看 /proc/meminfo
另一种方法是读取 /proc/meminfo
文件。 我们知道, /proc
目录下都是虚拟文件,包含内核以及操作系统相关的动态信息。
[root@centos ~]# cat /proc/meminfo
[root@db-jtdbbase-41 ~]# cat /proc/meminfo MemTotal: 32929612 kB MemFree: 1216084 kB MemAvailable: 31232024 kB Buffers: 20 kB Cached: 29858228 kB SwapCached: 44 kB Active: 23932096 kB Inactive: 6501256 kB Active(anon): 810916 kB Inactive(anon): 219576 kB Active(file): 23121180 kB Inactive(file): 6281680 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 4194300 kB SwapFree: 4186752 kB Dirty: 48 kB Writeback: 0 kB AnonPages: 575160 kB Mapped: 71028 kB Shmem: 455388 kB Slab: 1086280 kB SReclaimable: 1015904 kB SUnreclaim: 70376 kB KernelStack: 8496 kB PageTables: 6004 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 20659104 kB Committed_AS: 2473860 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB HardwareCorrupted: 0 kB AnonHugePages: 516096 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 245568 kB DirectMap2M: 8142848 kB DirectMap1G: 27262976 kB
重点关注这些数据:
MemTotal
, 总内存MemFree
, 空闲内存MemAvailable
, 可用内存Buffers
, 缓冲Cached
, 缓存SwapTotal
, 交换内存SwapFree
, 空闲交换内存
提供的信息和 free
命令看到的差不多
3. 使用 vmstat
命令
使用 vmstat -s
命令和选项, 可以对内存使用情况进行统计, 类似于 /proc/meminfo
。
示例如下:
-
[root@centos ~]# vmstat -s
-
2047268 K total memory
-
764736 K used memory
-
1081916 K active memory
-
476624 K inactive memory
-
137292 K free memory
-
96 K buffer memory
-
1145144 K swap cache
-
2097148 K total swap
-
264 K used swap
-
2096884 K free swap
-
5536 non-nice user cpu ticks
-
786 nice user cpu ticks
-
5935 system cpu ticks
-
255784 idle cpu ticks
-
10240 IO-wait cpu ticks
-
0 IRQ cpu ticks
-
447 softirq cpu ticks
-
0 stolen cpu ticks
-
994434 pages paged in
-
563680 pages paged out
-
0 pages swapped in
-
14 pages swapped out
-
518532 interrupts
-
1039207 CPU context switches
-
1656309212 boot time
-
59682 forks
最前面的几行,显示了内存总量,使用量,以及空闲内存等信息。
4. 使用 top
命令
top
命令一般用于查看进程的CPU和内存使用情况;当然也会报告内存总量,以及内存使用情况,所以可用来监控物理内存的使用情况。
在输出信息的顶部展示了汇总信息。
示例输出:
-
[root@centos ~]# top
-
top - 14:41:28 up 47 min, 3 users, load average: 0.00, 0.01, 0.09
-
Tasks: 205 total, 3 running, 202 sleeping, 0 stopped, 0 zombie
-
%Cpu(s): 0.0 us, 25.0 sy, 0.0 ni, 75.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
-
KiB Mem : 2047268 total, 136552 free, 765188 used, 1145528 buff/cache
-
KiB Swap: 2097148 total, 2096884 free, 264 used. 1084248 avail Mem
-
-
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
-
1 root 20 0 128540 7148 4220 S 0.0 0.3 0:02.66 systemd
-
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
-
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
-
6 root 20 0 0 0 0 S 0.0 0.0 0:04.40 ksoftirqd/0
-
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
-
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
-
9 root 20 0 0 0 0 R 0.0 0.0 0:02.43 rcu_sched
-
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
-
11 root rt 0 0 0 0 S 0.0 0.0 0:00.26 watchdog/0
-
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
-
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
-
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
-
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
-
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
-
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
-
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
-
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
-
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
-
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
-
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 edac-poller
-
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 watchdogd
-
30 root 20 0 0 0 0 S 0.0 0.0 0:00.10 kswapd0
-
31 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
-
32 root 39 19 0 0 0 S 0.0 0.0 0:00.12 khugepaged
-
33 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 crypto
-
41 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kthrotld
-
43 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kmpath_rdacd
各种操作系统提供的参数略有不同,一般来说都可以根据CPU和内存来排序。
例如:
-
# CentOS
-
top -o %MEM
-
top -o %CPU
-
-
# mac
-
top -o mem
-
top -o cpu
碰到不清楚的,请使用 top -h 查看帮助信息。
重点关注顶部的 KiB Mem 和 KiB Swap 这两行。 表示内存的总量、使用量,以及可用量。
buffer 和 cache 部分,和 free 命令展示的差不多。
二、 查看物理内存信息
想要查看物理内存的硬件信息,可以使用 demidecode
命令。
这个命令会输出物理内存相关的信息。
-
$ dmidecode -t 17
-
-
# dmidecode 3.0
-
Getting SMBIOS data from sysfs.
-
SMBIOS 2.8 present.
-
-
Handle 0x1100, DMI type 17, 40 bytes
-
Memory Device
-
Array Handle: 0x1000
-
Error Information Handle: Not Provided
-
Total Width: Unknown
-
Data Width: Unknown
-
Size: 8192 MB
-
Form Factor: DIMM
-
Set: None
-
Locator: DIMM 0
-
Bank Locator: Not Specified
-
Type: RAM
-
Type Detail: Other
-
Speed: Unknown
-
Manufacturer: Alibaba Cloud
-
Serial Number: Not Specified
-
Asset Tag: Not Specified
-
Part Number: Not Specified
-
Rank: Unknown
-
Configured Clock Speed: Unknown
-
Minimum Voltage: Unknown
-
Maximum Voltage: Unknown
-
Configured Voltage: Unknown
dmidecode -t 17
展示的信息包括 内存大小, 类型,带宽等信息。 当然,因为示例中使用的是虚拟机,所以有的信息是不可用的。
如果不加 -t
参数,则展示所有类型的硬件信息。 也可以指定其他 -t
参数来查看对应的硬件信息
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通