性能监控汇总

要进行性能分析,需要在性能脚本运行时,对服务器进行性能监控

常用的性能监控命令,当然也可以通过性能平台来进行查看。

常用的性能监控命令

详细查看这里

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包就可以完成监控任务,完全不用设置

监控项
类别计数器监控项
tomactJVM内存使用关注gc回收频率,fullgc次数越少越好
tomact最大线程数线程池连接数长期大于80%以上建议优化
tomact数据库连接活动连接数据长期大于80%以上,建议优化
tomact

请求数

请求状态

线程数、线程状态、大量blocked状态线程可以dump线程栈信息分析

1、Probe安装

访问Psi Probe的官方GitHub页面

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文件中的信息,包括类实例、内存使用情况、线程堆栈等。

  • 2. Eclipse Memory Analyzer Tool (MAT)
    • Eclipse Memory Analyzer是一个功能强大的Java堆分析工具,用于快速查找内存泄漏。要使用Eclipse MAT查看hprof文件,执行如下步骤:
      • 启动Eclipse Memory Analyzer。
      • 选择“文件”→“打开堆转储...”。
      • 浏览到你的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.passwordjmxremote.access文件包含用户名、密码和对应的访问权限。

在JVisualVM中连接到远程JVM:

  1. 启动JVisualVM。这可能需要选择JVisualVM的安装路径或使用命令行运行jvisualvm

  2. 建立远程连接。在JVisualVM中,选择“文件”菜单,然后“添加远程主机...”。输入远程主机的IP地址或主机名。

  3. 添加JMX连接。在你添加的远程主机下,右键点击,选择“添加JMX连接...”。在出现的对话框中,输入刚才配置的JMX端口(在此例中是9090),如果你启用了认证,则还需要输入用户名和密码。

  4. 连接远程主机。配置完信息后,你应该能看到一个新的JMX连接。双击它来建立连接。

监控界面

  • Summary View
    • 在此可以查看到JVM的启动参数及系统属性.
  • Monitor View
    • 在此显示了JVMCPU利用率,堆与非堆内存使用情况,加载了多少类,有多少线程数可以做dump操作,查看对内存明细。堆的回收取消内购至关的反应内存回收频率,是否有内存等问题。
  • Thread View
    • 在此监控线程状态,查看哪些线程有风险,对于Blocked(监控状态)据可以在Dump后分析线程活动,确定是否有性能问题。在此视图中我们主要关心的是那“监视”状态的线程,点击“线程Dump”可以导出IVM 当前的线程栈信息,通过分析这维息来定位到程序问题。

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值