要进行性能分析,需要在性能脚本运行时,对服务器进行性能监控
常用的性能监控命令,当然也可以通过性能平台来进行查看。
常用的性能监控命令
top: 进程列表中,是根据cpu的使用率从高到低排序
top命令的语法如下:
top [options]
常用的top命令选项包括:
-d delay
:设置刷新间隔的时间,单位为秒,默认为3秒。-n iterations
:设置显示的迭代次数,完成指定次数后自动退出。-p pid
:仅显示指定进程ID的信息。-u username
:仅显示指定用户名的进程信息。-o field
:按指定字段进行排序,例如按CPU占用率排序使用-o %CPU
。-O field
:按指定字段进行倒序排序。
top命令的输出结果包括以下几个常见字段:
top
顶部的CPU状态区域的字段含义如下:
us
(user):用户态CPU使用的百分比,表示用户进程消耗的CPU时间。sy
(system):系统态CPU使用的百分比,表示内核进程消耗的CPU时间。ni
(nice):调整过优先级后,用户态CPU使用的百分比。id
(idle):空闲CPU的百分比,表示CPU处于空闲状态的时间。wa
(waiting I/O):等待I/O完成的CPU使用的百分比,表示CPU等待I/O操作完成的时间。hi
(hardware interrupts):硬件中断所消耗的CPU使用的百分比。si
(software interrupts):软件中断所消耗的CPU使用的百分比。st
(stolen):被虚拟化环境(如虚拟机)偷取的CPU使用的百分比。
物理内存(Mem)和交换空间(Swap)相关的字段含义如下:
对于物理内存 (Mem) 字段:
total
:物理内存的总大小。used
:已使用的物理内存大小。free
:剩余的物理内存大小。shared
:被多个进程共享的物理内存大小。buffers
:缓存的物理内存大小,用于加速磁盘访问。cached
:缓存的文件系统数据的物理内存大小。
对于交换空间 (Swap) 字段:
total
:交换空间的总大小。used
:已使用的交换空间大小。free
:剩余的交换空间大小。cached
:缓存的交换空间大小。
top
默认按CPU使用率排序显示进程列表相关的字段含义如下:
PID
:进程ID,表示每个进程的唯一标识符。USER
:进程的所有者,即运行该进程的用户。PR
:进程的优先级。NI
:进程的优先级调整值。VIRT
:进程使用的虚拟内存大小。RES
:进程使用的物理内存大小。SHR
:进程使用的共享内存大小。S
:进程的状态,包括 R (运行)、S (睡眠)、D (不可中断的睡眠)、Z (僵尸进程)、T (跟踪或停止) 等。%CPU
:进程的CPU使用率,表示该进程占用CPU资源的百分比。%MEM
:进程的内存使用率,表示该进程占用系统内存的百分比。TIME+
:进程的累计CPU时间,表示该进程在CPU上运行的总时间。COMMAND
:进程的名称,表示该进程的可执行文件名或命令名。
load average : 负载平均值 显示了1分钟、5分钟、15分钟的平均负载值
top - 15:50:40 up 1 day, 3:25, 1 user, load average: 0.64, 0.81, 0.85
Tasks: 308 total, 1 running, 307 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12.7 us, 2.5 sy, 0.0 ni, 84.5 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 15742.4 total, 5037.9 free, 7838.0 used, 2866.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 6562.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
789 root 20 0 313460 69648 27072 S 2.0 0.4 0:15.70 systemd
987 user 20 0 379424 89976 30816 S 1.7 0.6 0:10.82 gnome-ter
1342 user 20 0 355368 47920 30752 S 1.3 0.3 0:06.55 python3
2451 user 20 0 1756948 518668 38952 S 1.0 3.2 1:58.44 chrome
3548 user 20 0 428964 49720 30968 S 0.7 0.3 0:03.28 gedit
1 root 20 0 225344 13220 9640 S 0.3 0.1 0:05.02 systemd
ps 查看当前的进程
获取帮助 命令 --help
- ps -ef |grep 进程名or进程id
ps命令的输出结果通常包括以下几个字段:
UID
:进程所属用户的ID。PID
:进程的ID。PPID
:父进程的ID。C
:进程的CPU占用率。STIME
:进程启动的时间。TTY
:进程所属的终端。CMD
:进程的命令行。
vmstat 对虚拟内存、进程、cpu信息进行监控
vmstat命令的语法如下:
vmstat [delay [count]]
delay
:可选参数,表示两次打印输出之间的时间间隔,单位为秒,默认为2秒。count
:可选参数,表示打印输出的次数,默认为无限次。
vmstat命令的输出结果包括以下几个字段:
procs
:显示进程相关的统计信息,包括运行队列长度、中断数等。r
:运行队列的长度,即正在运行和等待CPU的进程数。b
:处于不可中断(blocked)状态的进程数。
memory
:显示内存相关的统计信息,包括物理内存、虚拟内存和交换空间的使用情况。swpd
:使用的交换空间大小。free
:空闲的物理内存大小。buff
:用作缓冲区的物理内存大小。cache
:用作缓存的物理内存大小。
swap
:显示交换空间的使用情况。si
:每秒从磁盘读入交换空间的数据量。so
:每秒写入磁盘的交换空间数据量。
io
:显示IO相关的统计信息,包括块设备的读写情况。bi
:每秒从块设备读取的块数。bo
:每秒写入块设备的块数。
system
:显示系统相关的统计信息,包括上下文切换次数、中断数等。in
:每秒的中断数。cs
:每秒的上下文切换次数。
cpu
:显示CPU相关的统计信息,包括用户模式和内核模式的CPU使用率。us
:用户空间占用CPU的百分比。sy
:内核空间占用CPU的百分比。id
:空闲CPU的百分比。wa
:等待I/O操作完成的CPU时间的百分比。st
:被虚拟化环境偷取的CPU时间的百分比。
mpstat 查看cpu的监控数据
mpstat命令的语法如下:
mpstat [options] [delay [count]]
[options]
表示可选的命令选项,用于指定显示的统计信息类型或其他操作。
[delay]
表示刷新间隔的时间,单位为秒。它用于指定每次显示统计信息之间的时间间隔。
[count]
表示显示的迭代次数。它用于指定显示统计信息的总次数,达到指定次数后,mpstat命令将自动退出。
常用的mpstat命令选项包括:
-P
:显示每个CPU的统计信息。-u
:显示CPU利用率的统计信息。-I
:显示中断的统计信息。-P ALL
:显示所有CPU的统计信息,包括CPU利用率、中断、上下文切换等。-V
:显示mpstat命令的版本信息。
mpstat命令的输出结果包括以下几个字段:
CPU
:CPU编号。%usr
:用户空间CPU利用率。%nice
:优先级较低的进程CPU利用率。%sys
:内核空间CPU利用率。%iowait
:等待I/O完成的CPU时间。%irq
:处理中断的CPU时间。%soft
:处理软中断的CPU时间。%steal
:被虚拟化环境偷取的CPU时间。%guest
:运行虚拟机客户操作系统的CPU时间。%gnice
:运行虚拟机客户优先级较低的进程的CPU时间。%idle
:空闲CPU时间。
netstat 网络相关监控
netstat是一个网络工具命令,用于显示网络连接、路由表、网络接口状态等信息。它可以帮助用户查看当前系统的网络连接情况,包括正在监听的端口、已建立的连接、网络接口的统计数据等。
netstat命令的语法如下:
netstat [options]
常用的netstat命令选项包括:
-a
:显示所有的网络连接和监听端口。-t
:显示TCP协议相关的连接。-u
:显示UDP协议相关的连接。-n
:以数字形式显示IP地址和端口号。-p
:显示建立连接的进程信息。-r
:显示路由表信息。-s
:显示网络接口的统计信息。
netstat命令的输出结果包括以下几个字段:
Proto
:协议类型,如TCP、UDP。Recv-Q
:接收队列的长度。Send-Q
:发送队列的长度。Local Address
:本地地址和端口号。Foreign Address
:远程地址和端口号。State
:连接状态,如ESTABLISHED、LISTENING等。PID/Program name
:建立连接的进程ID和名称。
sysstat 系统性能监控工具包
sysstat是一个系统性能监控工具包,它包含了一系列的命令和工具,用于收集和分析系统的性能数据。sysstat可以提供关于CPU利用率、内存使用情况、磁盘 I/O、网络流量等方面的统计信息。
iostat 磁盘性能分析时常用
iostat是sysstat工具包中的一个命令,用于显示磁盘I/O统计信息。它可以提供关于磁盘的读写速度、I/O等待时间和磁盘利用率等方面的统计数据。
iostat命令的语法如下:
iostat [options] [interval] [count]
常用的iostat命令选项包括:
-c
:显示CPU利用率统计信息。-d
:显示磁盘I/O统计信息。-p
:显示每个磁盘分区的I/O统计信息。-t
:在输出中包含时间戳信息。-x
:显示更详细的磁盘I/O统计信息,包括每个设备的平均服务时间、队列长度等。
interval
参数指定了数据采样的时间间隔(以秒为单位)
count
参数指定了采样的次数。如果省略这两个参数,则iostat将会持续显示实时的磁盘I/O统计信息。
显示所有磁盘的I/O统计信息:
iostat -d
显示指定磁盘分区的I/O统计信息:
iostat -p <磁盘分区>
显示磁盘I/O统计信息,并以特定时间间隔和采样次数进行采样:
iostat -d 5 10
iostat命令的输出结果包括以下几个字段:
Device
:磁盘设备的名称。tps
:每秒钟的传输率,表示每秒完成的传输次数。kB_read/s
:每秒读取的数据量,以KB为单位。kB_wrtn/s
:每秒写入的数据量,以KB为单位。kB_read
:读取的总数据量,以KB为单位。kB_wrtn
:写入的总数据量,以KB为单位。
sar 提供关于CPU利用率、内存使用情况、磁盘I/O、网络流量等方面的历史统计数据
sar是sysstat工具包中的一个命令,用于收集和报告系统性能统计信息。它可以提供关于CPU利用率、内存使用情况、磁盘I/O、网络流量等方面的历史统计数据。
sar命令的语法如下:
sar [options] [interval] [count]
常用的sar命令选项包括:
-u
:显示CPU利用率统计信息。-r
:显示内存使用情况统计信息。-b
:显示磁盘I/O统计信息。-n
:显示网络流量统计信息。-q
:显示系统平均负载和运行队列长度统计信息。-A
:显示所有可用的统计信息。-s
:指定开始时间,格式为HH:MM:SS。-e
:指定结束时间,格式为HH:MM:SS。
interval
参数指定了采样的时间间隔(以秒为单位)
count
参数指定了采样的次数。如果省略这两个参数,则sar将采集所有可用的统计数据。
显示CPU利用率统计信息:
sar -u
显示内存使用情况统计信息:
sar -r
显示磁盘I/O统计信息:
sar -b
显示网络流量统计信息:
sar -n DEV
显示系统平均负载和运行队列长度统计信息:
sar -q
显示指定时间范围内的CPU利用率统计信息:
sar -u -s 09:00:00 -e 12:00:00
sar命令的输出结果包含了所选择的统计信息。输出结果的具体格式和字段取决于所选择的选项。以下是sar命令常见选项的输出示例
-u
:CPU利用率统计信息的输出示例:
10:00:01 AM CPU %user %nice %system %iowait %steal %idle
10:10:01 AM all 5.01 0.00 3.01 0.20 0.00 91.78
10:20:01 AM all 4.94 0.00 2.98 0.22 0.00 91.85
...
-r
:内存使用情况统计信息的输出示例:10:00:01 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 10:10:01 AM 1234567 1234567 1234567 12.34 123456 123456 1234567 12.34 123456 123456 12345 10:20:01 AM 1234567 1234567 1234567 12.34 123456 123456 1234567 12.34 123456 123456 12345 ...
-b
:磁盘I/O统计信息的输出示例:10:00:01 AM tps rtps wtps bread/s bwrtn/s 10:10:01 AM 0.10 0.00 0.10 0.00 0.20 10:20:01 AM 0.11 0.01 0.10 0.10 0.21 ...
-n
:网络流量统计信息的输出示例:10:00:01 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 10:10:01 AM eth0 0.10 0.20 1.00 2.00 0.00 0.00 0.00 10:20:01 AM eth0 0.11 0.21 1.10 2.10 0.00 0.00 0.00 ...
-q
:系统平均负载和运行队列长度统计信息的输出示例:10:00:01 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked 10:10:01 AM 1 1234 0.01 0.02 0.03 0 10:20:01 AM 1 1234 0.01 0.02 0.03 0 ...
dstat 综合性能监控工具,可以提供实时的系统资源使用情况统计信息
dstat是一个综合性能监控工具,可以提供实时的系统资源使用情况统计信息。dstat可以显示关于CPU、内存、磁盘I/O、网络流量等方面的统计数据,可以帮助你全面了解系统的性能状况。
dstat命令的语法如下:
dstat [options] [delay [count]]
常用的dstat命令选项包括:
-c
:显示CPU统计信息。-m
:显示内存统计信息。-d
:显示磁盘I/O统计信息。-n
:显示网络统计信息。-p
:显示进程统计信息。-r
:显示系统负载、内存使用情况以及交换空间使用情况。-s
:显示系统中断和上下文切换统计信息。-t
:在输出中包含时间戳信息。-y
:显示文件系统统计信息。
delay
参数指定了数据采样的时间间隔(以秒为单位)
count
参数指定了采样的次数。如果省略这两个参数,则dstat将会持续显示实时的性能统计信息。
显示实时的 CPU、内存、磁盘 I/O、网络流量统计信息:
dstat
显示指定选项的统计信息,以特定时间间隔和采样次数进行采样
dstat -c -m -d -n -p 5 10
显示系统负载、内存使用情况以及交换空间使用情况:
dstat -r
dstat命令的输出结果依赖于所选择的选项,常见的输出字段包括:
usr
:用户空间CPU使用率。sys
:内核空间CPU使用率。idl
:CPU空闲率。used
:已使用的内存量。free
:空闲的内存量。read
:每秒读取的数据量。writ
:每秒写入的数据量。recv
:每秒接收的数据量。send
:每秒发送的数据量。proc
:正在运行的进程数量。
ss 显示当前系统的套接字(Socket)统计信息
ss是Linux系统中的一个命令行工具,用于显示当前系统的套接字(Socket)统计信息。它提供了比netstat更详细和更快速的套接字信息,并支持更多的过滤和排序选项。
ss命令的基本语法如下:
ss [options]
常用的ss命令选项包括:
-t
:显示TCP套接字信息。-u
:显示UDP套接字信息。-l
:仅显示监听套接字信息。-a
:显示所有套接字信息。-n
:以数字格式显示IP地址和端口号。-r
:显示路由表信息。-s
:显示套接字统计信息。-p
:显示与套接字关联的进程信息。
lsof 显示系统中打开的文件和网络连接的命令行工具
sof是一个用于显示系统中打开的文件和网络连接的命令行工具。它的全称是"list open files"。lsof可以帮助你查看哪些进程打开了哪些文件或网络连接。
sof命令的基本语法如下:
lsof [options]
常用的lsof命令选项包括:
-a
:逻辑与操作,用于指定多个条件。-c <进程名>
:按进程名筛选。-p <进程ID>
:按进程ID筛选。-u <用户名>
:按用户名筛选。-i
:显示网络连接信息。-t
:仅显示进程ID。-F <格式>
:指定自定义的输出格式。
lsof命令的输出结果包含以下字段的信息:
COMMAND
:打开文件的进程名称。PID
:进程ID。USER
:进程的所有者。FD
:文件描述符,用于表示文件的访问模式(例如,读取、写入、追加等)。TYPE
:文件类型,如常规文件(REG)、目录(DIR)、套接字(SOCK)等。DEVICE
:文件所在的设备名称。SIZE/OFF
:文件大小或文件偏移量。NODE
:文件的节点号。NAME
:打开文件的路径和名称。
显示指定进程打开的文件
lsof -p <进程ID>
显示网络连接信息:
lsof -i
仅显示进程ID:
lsof -t
指定自定义的输出格式:
lsof -F <格式>
-
示例:
vmstat 1 5
这会每秒报告一次系统状态,共报告五次。如果
r
的值持续高,说明有很多进程等待CPU资源。如果id
值很低,说明CPU资源利用率很高。
性能监控诊断
系统性能分析思路
系统性能分析因素——cpu
cpu的执行速度与性能好坏在很大程度上决定了系统整体的性能的快慢
系统性能分析因素——内存
当可用的内存太小,系统的进程会被阻塞中,应用将会变得非常缓慢,有时会失去响应,严重会触发系统的内存溢出从而导致应用程序被系统杀死,更严重可能导致系统重启,可以考虑做一些缓存服务器去提升系统性能。
系统性能分析因素——网络
系统应用之间的交互,尤其是在跨机器之间的,都是基于网络的,因此网络带宽、响应时间、网络延迟、阻塞都是影响系统性能的因素。
系统性能分析因素——I/O
I/O读写的性能直接影响系统程序的性能,磁盘I/O是系统中最慢的部分。主要是cpu处理频率叫磁盘的无力操作快几个量级,如果拿读取磁盘和内存的时间比较就是分钟及到毫秒的区别。I/O比较频繁的(读或者写)时候,如果I/O得不到满足就会导致应用阻塞。
系统性能分析因素——总结
系统性能的因素是彼此依赖的,任何一个处于高负载的状态都可能导致其他资源收到影响。
- 系统性能的各个方面确实是互相影响的,因为它们在硬件资源和操作系统层面上是紧密联系的。下面将详细讨论几个主要性能方面之间的相互影响。
-
CPU和内存
- CPU等待内存: 当CPU快速处理完数据后,可能需要等待内存将数据送入处理器进行下一步处理。如果内存速度慢,或者内存带宽有限,将导致CPU闲置,这称为内存瓶颈。
- CPU缓存: 现代CPU有内建的缓存机制,如L1、L2和L3缓存。这些缓存比主内存快得多,可以减少CPU等待内存的时间。如果程序不能有效利用CPU缓存(比如频繁的缓存失效),性能将受到影响。
- 多任务处理: 当多个进程或线程并发运行时,操作系统需要在它们之间切换上下文(context switching),这涉及到保存和恢复CPU寄存器和内存状态。大量的上下文切换会消耗CPU资源,影响系统性能。
-
内存和磁盘I/O
- 交换操作: 当系统的物理内存用尽时,操作系统会使用磁盘空间作为虚拟内存,通过交换(swap)操作来移动数据。磁盘的读写速度远慢于内存,频繁的交换操作会显著降低系统性能。
- 缓存和缓冲: 操作系统通常使用内存中的缓存和缓冲区来减少对磁盘的直接访问。如果内存资源紧张,缓存和缓冲区的大小可能会减小,导致增加对磁盘的I/O操作,降低性能。
-
CPU和磁盘I/O
- I/O等待: CPU在执行数据读写操作时,可能需要等待I/O操作的完成。如果磁盘I/O响应慢,CPU就会在I/O等待状态下浪费时间,这会降低CPU的效率。
- 直接内存访问(DMA): 现代系统中,磁盘I/O操作通常使用DMA,无需CPU介入即可将数据传输到内存中。然而,DMA仍然会占用内存带宽,如果DMA请求很重,可能会影响CPU访问内存的速度。
-
网络I/O和其他资源
- 网络等待: 类似于磁盘I/O,如果一个应用程序依赖于网络数据,当网络响应慢或网络带宽有限时,程序可能会阻塞等待网络I/O的完成,这会影响CPU利用率和整体性能。
- 内存占用: 网络活动可能会产生大量的临时数据,如缓存网页内容或临时文件。这些数据占用了宝贵的内存资源,可能会影响其他内存敏感的应用程序。
系统性能的整体影响
性能问题往往不是孤立存在的。例如,一个内存泄漏可能导致内存不足,这又引发过多的磁盘交换操作,增加了I/O系统的压力,间接影响CPU效率。同理,CPU的性能问题可能导致处理网络请求的延迟增加,影响到网络I/O的效率。
瓶颈阀值分析
cpu定位分析
当系统cpu利用率大于50%,我们需要注意
当系统cpu利用率大于70%,我们需要密切关注(告警)
当系统cpu利用率大于80%,情况就比较严重了(严重)
内存定位分析
当内存使用率大于50%,我们需要注意
当内存使用率大于70%,我们需要密切关注(告警)
当内存使用率大于80%,情况就比较严重了(严重)
网络定位分析
我们通过查看发现收发包的吞吐率达到网卡的最大上限,网络数据报文有因为这类原因而引发的丢包、阻塞等现象,我们都证明了当前网络可能存在瓶颈。(一般我们在性能测试为了减少网络影响都在局域网中)
I/O定位分析
当I/O利用率大于40%,我们需要注意
当I/O利用率大于60%,我们需要密切关注(告警)
当I/O利用率大于80%,情况就比较严重了(严重)
linux系统性能分析思路与实践
系统负载监控分析实践
在linux系统中,系统负载是一个很重要的指标,它的多少决定了系统是否处于忙碌状态,系统开始运行时,cpu的处理颗数已经是一个恒定值,它的大小决定同一时刻,系统可以承受的最大负载。当超过这个负载系统调用就会出现阻塞我们可以通过uptime、top、w等命令帮我们分析系统负载
系统负载监控分析实践
uptime
uptime
命令对于快速了解系统运行状态和负载情况非常有用。它可以帮助系统管理员判断系统是否过载,如果平均负载持续高于CPU核心数,那可能意味着系统正在经历过高的压力。
-
当前时间:显示当前的系统时间。
-
系统运行时间:自系统最后一次启动以来已过去的时间,通常以天、小时和分钟表示。
-
用户数量:当前登录到系统的用户数。
-
平均负载:显示过去1分钟、5分钟和15分钟的平均系统负载。这个数字是系统中活跃进程的平均数量,一个活跃的进程是指正在使用或等待CPU资源的进程。
12:34:56 up 10 days, 2:42, 4 users, load average: 0.00, 0.01, 0.05
12:34:56
是当前的系统时间。up 10 days, 2:42
表示系统已经运行了10天2小时42分钟。4 users
表示当前有4个用户登录系统。load average: 0.00, 0.01, 0.05
分别表示过去1分钟、5分钟和15分钟的平均系统负载。
对于uptime
命令的输出,负载均值可以给出系统活跃进程的大致情况。比如,一个值为1.00的1分钟负载均值在单核心机器上意味着CPU全满,而在四核心机器上意味着CPU的使用率大约为25%。通常,一个健康的系统的负载均值应该小于或等于CPU的核心数。
系统监控分析实践
top命令详解
top也提供了负载平均值的快照,top给出的系统运行时间,反映了当前系统存活了多久,这个字段很好的衡量了系统的高可用性
任务队列信息
- total:系统中总共有多少个进程。
- running:当前正在运行的进程数。
- sleeping:当前处于睡眠状态的进程数。
- stopped:被停止的进程数。
- zombie:僵尸进程数,这些进程已经结束,但其父进程尚未回收其资源。
top - 18:23:34 up 1 day, 3:47, 5 users, load average: 0.85, 0.77, 0.69
18:23:34
- 当前系统时间。up 1 day, 3:47
- 系统运行时间,这里表示系统已经运行了1天3小时47分钟。5 users
- 当前有5个用户登录到系统。load average: 0.85, 0.77, 0.69
- 分别代表过去1分钟、5分钟和15分钟的平均负载。如果这些数字高于你的CPU核心数,它意味着有进程正在等待CPU资源,系统可能处于繁忙状态。
进程状态信息
- total:系统中总共有多少个进程。
- running:当前正在运行的进程数。
- sleeping:当前处于睡眠状态的进程数。
- stopped:被停止的进程数。
- zombie:僵尸进程数,这些进程已经结束,但其父进程尚未回收其资源。
Tasks: 200 total, 2 running, 192 sleeping, 6 stopped, 0 zombie
这意味着系统中共有200个进程,其中2个正在运行,192个处于睡眠状态,6个被停止,没有僵尸进程。
cpu信息
一般我们关注us 、sy、hi 、si 、id 、wa
- cpu (s):当前cpu的平均值
- 默认配置是显示平均的cpu使用情况,按下键盘1可以显示各颗逻辑cpu的使用情况
- us (user):用户空间占用的CPU百分比。
- sy (system):核心空间占用的CPU百分比。
- ni (nice):已修改优先级的进程占用的CPU百分比。
- id (idle):空闲的CPU百分比。
- 当id持续过低的时候,表示系统迫切需要解决cpu资源问题
- 统计使用cpu的利用率需要通过1-id %获取
- wa (IO wait):等待输入/输出的CPU时间百分比。
- 使用率过高时,我们要考虑IO的性能瓶颈,可以使用iostat,sar等命令做进一步分析
- hi (hardware IRQ):硬件中断请求。
- 使用率过高时,表示当前的硬件中断占用很大的百分比。一般硬件中断我们可以分析文件
/proc/interrupts
文件、/proc/stat
文件、服务irqbalance是否配置、以及cpu的频率设置,通过这些可以帮系统打散优化系统的硬件中断
- 使用率过高时,表示当前的硬件中断占用很大的百分比。一般硬件中断我们可以分析文件
- si (software IRQ):软件中断请求。
- 常见的软件中断都是和网络相关,长时间的写日志也可能产生软件中断
- 当网络出现阻塞时,软件中断就会出现瓶颈。可以通过ps命令(ps 进程id|grep ksoftirqd)查看进程ksoftirqd的使用信息
- st (steal time):在虚拟化环境中,其他操作系统占用的时间。
%Cpu(s): 5.2 us, 2.8 sy, 0.0 ni, 91.0 id, 0.6 wa, 0.2 hi, 0.2 si, 0.0 st
这表示用户进程使用了5.2%的CPU,内核进程使用了2.8%,没有进程正在使用额外的nice值份额,91.0%的CPU处于空闲状态,0.6%用于等待I/O操作,0.2%用于硬件中断,0.2%用于软件中断,没有时间被虚拟化环境中其他操作系统占用。
内存信息
Mem:这一行显示了物理内存的使用情况。
- total:总共的物理内存量。
- free:空闲内存量。
- used:已使用的内存量。
- buff/cache:由缓冲和缓存占用的内存量。
- 如果buff/cache的值很大,说明cache住的文件数多。如果频繁的访问文件都能被命中,很明显会比读取磁盘的调用快,磁盘的IO必定会减小
- buff/cache的命中率很关键,如果频繁的访问文件不能命中,对cache而言是个比较大的资源浪费,此时盈考虑drop cache并且提升对应的命中率
- buff/cache可以看成可用内存,它会占用一定的物理内存,当系统需要内存时可以释放出来
- 做清理buff/cache的时候是把物理内存的数据同步到磁盘的过程,为了保证在执行drop cache的过程不丢失数据,需要执行sync命令
KiB Mem : 8167800 total, 1042800 free, 5094000 used, 2031000 buff/cache
这表示机器有8167800KiB的内存,其中1042800KiB是空闲的,5094000KiB已被使用,2031000KiB被缓冲和缓存使用。
Swap:显示交换空间的使用情况。
- total:交换空间总量。
- free:空闲交换空间量。
- used:已使用的交换空间量。
- avail Mem:可供应用程序使用的内存量(考虑了交换空间和物理内存)。
KiB Swap: 2097148 total, 2007148 free, 90000 used. 3055084 avail Mem
这表示系统有2097148KiB的交换空间,2007148KiB是空闲的,90000KiB已被使用,有3055084KiB的内存是可用的。
进程信息
-
PID - Process ID。进程的唯一标识符。
-
USER - 运行该进程的用户的用户名。
-
PR - Priority。进程的优先级,越小表示优先级越高。
-
NI - Nice value。一个与进程优先级相关的值,用于影响进程的调度。负值表示高优先级,正值表示低优先级。
-
VIRT - Virtual Memory Size。进程使用的虚拟内存总量,包括进程使用的库文件、已分配但未使用的内存和交换空间中的非物理内存。
-
RES - Resident size。进程使用的、未被换出的物理内存的大小,也就是常驻内存大小。
-
SHR - Shared Memory。进程使用的共享内存的大小,这部分内存可能被其他进程共享。
-
S - Process Status。进程的状态。可以是以下几种:
- R (running):正在运行或在运行队列中等待。
- S (sleeping):休眠状态,进程在等待某个事件或接收信号。
- T (stopped):进程已停止,通常是因为收到了停止信号。
- Z (zombie):僵尸进程,子进程已结束但父进程尚未收集其退出状态。
- D (disk sleep):不可中断的睡眠状态,通常是在等待IO操作。
-
%CPU - CPU Usage。进程自上次更新以来使用的CPU时间的百分比。
-
%MEM - Memory Usage。进程使用的物理内存的百分比。
-
TIME+ - Total CPU Time。自进程启动以来占用CPU的总时间。
-
COMMAND - Command Name or Command Line。进程启动时的命令行名称或命令行。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1087 root 20 0 162568 2464 0 S 0.0 0.0 0:00.89 sshd
1092 root 20 0 115484 1936 0 R 0.0 0.0 0:07.58 top
1312 user1 20 0 1042580 54916 32768 S 0.7 0.7 12:11.14 apache2
...
top命令小技巧
-
排序进程:
- 通过按
<
或>
可以切换排序列,例如,按%CPU
或%MEM
对进程进行排序,以便快速找到最消耗资源的进程。
- 通过按
-
改变显示更新频率:
- 默认情况下,
top
命令每隔几秒就会更新显示的信息。通过按d
或s
,你可以更改更新间隔,然后输入你希望的秒数。
- 默认情况下,
-
杀掉进程:
- 如果你发现某个进程需要被终止,可以通过
top
杀掉它。首先按k
,然后输入你想杀掉的进程的 PID,再输入信号(如果不确定,可以使用默认的 15 信号,即 SIGTERM)。
- 如果你发现某个进程需要被终止,可以通过
-
查找进程:
- 通过按
L
,你可以搜索想要监控的特定进程。
- 通过按
-
过滤进程:
- 通过按
o
或O
,你可以设置过滤条件,例如按用户、PID等过滤。
- 通过按
-
查看单个用户的进程:
- 通过按
u
,然后输入特定的用户名,可以只显示该用户的进程。
- 通过按
-
选择显示的列:
- 通过按
f
或F
,你可以选择希望在进程列表中显示的字段。
- 通过按
-
切换显示模式:
- 按
A
可以在不同的显示模式间切换,查看不同的信息集合。 - 按
V
可以为每个多线程的进程显示一个单独的树状视图。
- 按
-
冻结或解冻进程列表更新:
- 通过按
Ctrl
+S
来停止屏幕更新,按Ctrl
+Q
来继续更新。
- 通过按
-
退出而不中断:
- 按
q
退出top
,这是最简单的退出方式,不会影响任何进程。
- 按
-
显示或隐藏列:
- 按
x
可以高亮显示排序列,按y
可以高亮显示运行进程。
- 按
-
显示总计行:
- 按
l
可以开启或关闭显示平均负载和启动时间行。
- 按
-
交互式命令:
top
是一个交互式命令,你可以在运行时按h
或者问号?
来查看帮助页面。
容器监控
目前采用java进行系统开发的系统居多,这些系统运行在java容器上,通过对容器的监控可以了解到java程序的运行状况,分析java程序的问题。目前市面上流行的中间件有很多(Tomcat、 Jetty、Jboss、Webloic、Websphere)基本原理相似,都遵循servlet规范。
对容器的监控实际上是对jvm的监控,容器运行在jvm上。
Tomcat
grafana + prometheus + jvm_exporter
1、下载安装jvm_exporter.jar到服务器tomcat的bin文件夹
2、配置tomcat.yml文件 到tomcat的bin文件夹 (下载地址)监控其他的程序也可以在这里下载yaml文件
配置catalina.sh文件 JAVA_OPTS="-javaagent:./jmx_prometheus_javaagent-0.14.0.jar=3088:./tomcat.yml"
JAVA_OPTS="-javaagent:./jmx_prometheus_javaagent-0.15.0.jar=6088:./tomcat.yml"
JAVA_OPTS="-javaagent:./{jmx_prometheus_javaagent-0.15.0.jar目录地址,目前放的bin路径下}={6088,端口地址不要求}:./tomcat.yml"
启动tomcat
模板:8563 或 3457
使用8563的模板时候,job的配置, 一定要与 prometheus.yml文件中 job_name 要相同
Probe
Probe是Tomcat的一个监控工具,Probe只需要一个war包就可以完成监控任务,完全不用设置
类别 | 计数器 | 监控项 |
tomact | JVM内存使用 | 关注gc回收频率,fullgc次数越少越好 |
tomact | 最大线程数 | 线程池连接数长期大于80%以上建议优化 |
tomact | 数据库连接 | 活动连接数据长期大于80%以上,建议优化 |
tomact | 请求数 请求状态 | 线程数、线程状态、大量blocked状态线程可以dump线程栈信息分析 |
1、Probe安装
2、Probe相关配置
安全配置
要配置用户访问权限,需要编辑Tomcat的conf/tomcat-users.xml
文件。你可以定义用户和角色来限制谁可以访问Psi Probe。
<role rolename="probeuser"/>
<role rolename="probeadmin"/>
<user username="admin" password="password" roles="probeuser,probeadmin"/>
修改Tomcat的启动设置
编辑Tomcat的启动配置文件,这通常是setenv.sh
(在UNIX系统中)或setenv.bat
(在Windows系统中),这些文件位于Tomcat的bin
目录中。如果这些文件不存在,你可以创建它们。
添加下面的参数以启用JMX远程连接:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=YOUR_JMX_PORT"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
3、启动tomcat
http://your-tomcat-server-address:port/probe
GRRENTTHREAD_COUNT代表当前线程池中Ready好的数重,有的在运行状态,
CURRENTTHREADS_BUSY代表当前是活动状态的线程数量,正处在活动状态的在等待状态。MAX THREADS代表最大线程数量。MAX SPARE THREADS 代表最大空闭线程数量。MIN SPARE THREADS 代表最小空闭线程数量。
我们首先要关心的是CURRENT THREADS BUSY与CURRENT THREAD COUNT是否接近MAX THREADS,如果是,则需要加大MAX THREADS数量;如果服务器硬件支撑不来更多的线程jvm数,就需要更强的硬件或者做集群来分担负载
JVM监控
堆内存监控
jps 列出JVM实例
jps
(Java Virtual Machine Process Status Tool)是一个来自JDK的有用命令行工具,它可以列出在本地机器上运行的HotSpot JVM实例。jps
工具对于快速查看有哪些Java进程在运行以及它们的进程ID(PID)非常有用。
默认情况下,jps
会列出所有Java进程的PID和简短的主类名字,但它也支持几个选项来显示额外信息:
-q
:只显示PID,不显示类名、JAR名和传递给主类的参数。-m
:输出传递给主类的参数。-l
:输出应用主类的完整包名或应用JAR的完整路径名称。-v
:输出传递给JVM的参数。-V
:输出传递给JVM的参数,用于非标准参数。-J
:用于传递参数到jps
的JVM本身(例如-J-Xms512m
)。
jps [ip] 列出远程机器上的javaa进程信息,不过这需要安全授权。
jstat 查看JVM堆的统计信息
jstat
(Java Virtual Machine Statistics Monitoring Tool)是一个在JDK中包含的命令行实用工具,它用于监控Java虚拟机(JVM)的运行时状态信息,重点关注与垃圾收集(GC)相关的堆状态信息。
这个工具能提供关于堆使用情况、GC活动和类装载的实时数据,帮助识别内存泄漏、频繁的垃圾收集周期和其他性能问题。
使用jstat
你可以查看多种不同类型的统计数据,通过在命令中指定不同的选项:
-class
:监控类装载、卸载数量、总空间以及类装载所耗费的时间。-gc
:监控Java堆的条件,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间统计等。S0C
:第一个survivor空间的容量S1C
:第二个survivor空间的容量S0U
:第一个survivor空间的使用量S1U
:第二个survivor空间的使用量EC
:Eden空间的容量EU
:Eden空间的使用量OC
:老年代的容量OU
:老年代的使用量MC
:元空间的容量(或永久代Perm)MU
:元空间的使用量(或永久代Perm)CCSC
:压缩类空间的容量CCSU
:压缩类空间的使用量YGC
:年轻代垃圾收集次数YGCT
:年轻代垃圾收集时间FGC
:老年代垃圾收集次数FGCT
:老年代垃圾收集时间GCT
:总垃圾收集时间
-gccapacity
:显示各个代以及元空间的当前容量和最大容量。-gcutil
:显示各代当前使用的占比。-gcnew
、-gcnewcapacity
:监控新生代的GC状况。-gcold
、-gcoldcapacity
:监控老年代的GC状况。-gcmetacapacity
:监控元数据区的容量和使用量。-gcpermcapacity
:在JDK8之前,监控永久代的情况(在JDK8中已移除永久代,由元空间取代)。-compiler
:监控JIT编译器的编译活动。-printcompilation
:输出JIT编译的方法信息。
使用jstat
,你需要知道目标Java应用程序的进程ID(PID)。然后可以用以下方式之一运行jstat
:
# 显示目标JVM进程的垃圾收集情况
jstat -gc <pid>
# 每隔5秒输出一次数据,连续输出10次
jstat -gc <pid> 5000 10
总GC时间=YGC时间+FGC时间
总GC时间越大就会影响用户体验所以总GC时间是JVM调优的重点
jmap 生成Java应用程序内存的快照
jmap
(Java Memory Map)命令是Java开发工具包(JDK)中包含的一个工具,它用于生成Java应用程序内存的快照。这个命令对于分析堆内存使用情况和查找内存泄漏非常有用。jmap
可以生成堆转储文件,这个文件可以被其他分析工具(如MAT, jhat, VisualVM等)读取,以进一步分析。
jmap
的常用选项:
-dump:<option>
:生成堆转储快照。常见的用法是-dump:live,file=<filename>
,这将只记录活动对象到指定的文件中。-heap
:打印出JVM堆的详细信息,包括使用的GC算法、堆配置和堆使用情况等。-histo
:打印出堆中对象的直方图,包括每个Java类的实例数量和内存大小。-clstats
:为类加载器打印类加载器的统计信息。-finalizerinfo
:打印待终结对象信息。
在使用jmap
时,通常需要提供要检查的Java进程的ID(也称为PID)。例如,要为进程号为1234的Java应用程序生成堆转储,你可以执行以下命令:
jmap -dump:format=b,file=heapdump.hprof 1234
此命令将生成一个名为heapdump.hprof
的二进制文件,其中包含了进程号为1234的Java应用程序的堆转储。
要查看hprof文件,你需要使用堆分析工具。以下是一些可以用来查看和分析hprof文件的工具:
- 1. VisualVM
- VisualVM是一个可视化工具,提供了一种界面来查看hprof文件。你可以使用以下步骤在VisualVM中打开和分析hprof文件:
- 启动VisualVM。
- 从工具栏中选择“文件”菜单,然后选择“从文件加载...”。
- 浏览到你的hprof文件的位置,并打开它。
- VisualVM是一个可视化工具,提供了一种界面来查看hprof文件。你可以使用以下步骤在VisualVM中打开和分析hprof文件:
VisualVM将显示hprof文件中的信息,包括类实例、内存使用情况、线程堆栈等。
- 2. Eclipse Memory Analyzer Tool (MAT)
- Eclipse Memory Analyzer是一个功能强大的Java堆分析工具,用于快速查找内存泄漏。要使用Eclipse MAT查看hprof文件,执行如下步骤:
- 启动Eclipse Memory Analyzer。
- 选择“文件”→“打开堆转储...”。
- 浏览到你的hprof文件的位置,并打开它。
- Eclipse Memory Analyzer是一个功能强大的Java堆分析工具,用于快速查找内存泄漏。要使用Eclipse MAT查看hprof文件,执行如下步骤:
MAT会分析文件,并且提供一系列的报告,如泄漏嫌疑对象、最大对象和垃圾收集根信息等。
线程监控
JVisualVM
JVisualVM是一个免费的Java虚拟机监视、故障排查和性能分析工具
启用远程监控
要在JVisualVM中启用远程监控,你需要在远程Java虚拟机(JVM)上配置JMX(Java Management Extensions)代理,并在JVisualVM中连接到该代理。
在远程JVM上启用JMX:
启动远程JVM时,需要添加一些系统属性来启用JMX代理。 比如:
java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9090 \
-Dcom.sun.management.jmxremote.rmi.port=9090 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-jar your-app.jar
com.sun.management.jmxremote
: 这个标志启用了JMX代理,它用于远程监控和管理。com.sun.management.jmxremote.port
: 指定JMX代理的端口号(在此例中为9090)。com.sun.management.jmxremote.rmi.port
: RMI(远程方法调用)通信端口,通常这个值与jmxremote.port
一致。com.sun.management.jmxremote.ssl
: 指定是否通过SSL保护JMX连接。在这个例子中,设置为false
表示不使用SSL。com.sun.management.jmxremote.authenticate
: 指定是否启用验证。如果设置为false
,则表示不需要验证(注意这种配置适合安全可信的环境,因为它可能会带来安全风险)。
上述配置不包括安全配置。 在生产环境中,你通常会想要通过防火墙保护这些端口,并且启用SSL和用户认证来确保通信的安全。
如果你想要启用认证并指定访问控制列表,你需要这样配置:
-Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/path/to/jmxremote.access \
其中jmxremote.password
和jmxremote.access
文件包含用户名、密码和对应的访问权限。
在JVisualVM中连接到远程JVM:
-
启动JVisualVM。这可能需要选择JVisualVM的安装路径或使用命令行运行
jvisualvm
。 -
建立远程连接。在JVisualVM中,选择“文件”菜单,然后“添加远程主机...”。输入远程主机的IP地址或主机名。
-
添加JMX连接。在你添加的远程主机下,右键点击,选择“添加JMX连接...”。在出现的对话框中,输入刚才配置的JMX端口(在此例中是9090),如果你启用了认证,则还需要输入用户名和密码。
-
连接远程主机。配置完信息后,你应该能看到一个新的JMX连接。双击它来建立连接。
监控界面
- Summary View
- 在此可以查看到JVM的启动参数及系统属性.
- Monitor View
- 在此显示了JVMCPU利用率,堆与非堆内存使用情况,加载了多少类,有多少线程数可以做dump操作,查看对内存明细。堆的回收取消内购至关的反应内存回收频率,是否有内存等问题。
- Thread View
- 在此监控线程状态,查看哪些线程有风险,对于Blocked(监控状态)据可以在Dump后分析线程活动,确定是否有性能问题。在此视图中我们主要关心的是那“监视”状态的线程,点击“线程Dump”可以导出IVM 当前的线程栈信息,通过分析这维息来定位到程序问题。