写点什么

Java 性能优化权威指南 - 读书笔记(一)

作者:xfgg
  • 2023-10-25
    福建
  • 本文字数:3467 字

    阅读完需:约 11 分钟

Java性能优化权威指南-读书笔记(一)

从 I don't know What I don't know 到 I know What I don't know 再到 I already know what I need to know 的过程!

个人理解,不喜勿喷

策略、方法和方法论

性能问题的现状

传统的软件开发过程主要包括 4 个阶段:分析、设计、编码和测试

  • 分析:用于评估需求、权衡各种架构的利弊以及构思高层抽象

  • 设计:依据分析阶段的基本架构和高层抽象,进行更精细的抽象,考虑具体实现

  • 编码:代码设计的实现

  • 测试:验证实现是否合乎应用需求

建议在分析阶段添加性能分析,测试阶段之后新增性能测试

通过性能分析定位性能问题

  • 应用预期的吞吐量是多少?

  • 请求和响应之间的延迟预期是多少?

  • 应用支持多少并发用户或者并发任务?

  • 当并发用户数或者并发任务数达到最大时,可接受的吞吐量和延迟是多少?

  • 最差情况下的延迟是多少?

  • 要使垃圾收集引入的延迟在可容忍范围之内,垃圾收集的频率应该是多少?

低劣的设计和糟糕的实现发现得越晚,修复的代价越大

现在许多应用都会使用自动构建和测试,进一步添加自动性能测试

性能分析的两种方法

  1. 自顶向下

自顶向下是最常用的性能调优方法

首先对运行在特定负载之下的应用进行监控,监控范围包括:操作系统,Java 虚拟机,JavaEE 容器以及应用的性能测量统计指标,然后基于监控信息所给出的提示进行下一步工作,例如 JVM 垃圾收集器调优,操作系统调优,或者应用程序性能分析

  1. 自底向上

在无法更改应用源代码,例如应用已经部署在生产环境中等,个人理解:开发一般不需要考虑这个问题

首先需要收集和监控最底层 CPU 的性能统计数据,监控的 CPU 统计数据包括执行特定任务所需要的 CPU 指令数(路径长度),以及应用在一定负载运行下时的 CPU 高速缓存未命中率,然后根据这些信息优化 CPU 使用率

操作系统性能监控

这里主要讲解 linux 和 windows 的性能监控方法

改善性能涉及三种不同的活动

  • 性能监控

  • 性能分析

  • 性能调优

CPU 使用率

Windows

个人是 linux 系统,不好演示

工具:任务管理器或 Performance Monitor(性能监视器)

具体使用可自行百度

命令行:Windows typeperf

Linux

工具:GNOME System Monitor

如图显示该系统有 4 个虚拟处理器

CPU 历史区域:每个虚拟处理器在一段时期内的 CPU 使用率,每条线代表一个虚拟处理器,下方颜色块显示的是每个虚拟处理器当前 CPU 使用率

命令行:vmstat/mpstat/top

vmstat 1 5 表示每 1 秒刷新,刷新 5 次


  • procs:相关进程的信息。

  • memory:关于内存使用的信息。

  • swap:交换区的使用情况。

  • io:关于 IO 操作的信息。

  • system:关于中断和上下文切换的信息。

  • cpu:CPU 的使用情况。

us 是用户态 CPU 使用率,sy 是系统 CPU 使用率,id 是空闲率或 CPU 可用率。

us、sy 的和应该等于 100 减去 id,即 100-id 列的值


mpstat -P ALL 1 3 表示所有 CPU 的统计信息,每 1 秒刷新一次,共刷新 3 次


  • %usr:用户级(应用)运行时间百分比。

  • %nice:用于 user-nice 时间的百分比。

  • %sys:系统级运行时间百分比。

  • %iowait:CPU 空闲时间百分比,此时至少有一个 I/O 在等待中。

  • %irq/soft:分别处理硬/软中断所占用的 CPU 时间百分比。

  • %idle:CPU 闲置时间百分比。


top 命令


  1. top:直接输入 top 后按 enter,可以看到当前系统的状态,包括任务数,负载状态,CPU 使用状态,内存和交换区使用状态以及各个进程的状态。

  2. top -p pid:监视指定进程的状态。

  3. top -d n:设定每次显示的间隔,单位为秒。

  4. top -i:忽略闲置和僵尸进程。

  5. top -b:以批处理模式启动 top,主要用于在脚本中捕获 top 的输出信息。

  6. top -n num:在结束 top 程序前,更新 num 次。

在使用top命令的过程中,还可以实时输入一些命令来调整 top 的显示:

  1. P:按 CPU 利用率排序。

  2. M:按内存利用率排序。

  3. t:显示或隐藏“任务(CPU 核心)”,“负载和运行时间”这两行信息。

  4. m:显示或隐藏“内存简述”行。

  5. c:显示或隐藏命令完整路径。

  6. k:杀死一个进程,需要知道该进程的 PID。

  7. r:变更一个进程的优先级别。

CPU 调度程序运行队列

Windows

工具:在 Performance Monitor 中添加性能计数器监控运行队列长度

命令行:typeperf ”\System\Processor Queue Length“ 监控运行队列长度

Linux

vmstat 输出的第一列是运行队列长度,表示运行队列中轻量级进程的实际数量


内存使用率

Windows

工具:Performance Monitor 中监控每秒内存页面调度(\Memory\Pages/Second)、可用内存字节数(\Memory\Available MBytes)可以判别系统是否正在进行页面交换,当可用内存变少,并且有页面调度时,系统可能正在进行页面交换

命令行:typeperf -si 5 "\Memory\Available MBytes" "\Memory\Pages/sec"

Linux

命令行:vmstat 输出中的 free 列监控页面交换,也可以用 top 命令或/pro/meminfo 文件来监控

用 vmstat 监控页面交换,需要监控 vmstat 中的 si 和 so,分别表示内存页面的换入和换出的量,free 列显示可用的空闲内存,留意是否会同时出现空闲内存少和页面调度频繁的情形


监控锁竞争

Windows

需要外部工具:Intel VTune 或 AMD CodeAnalyst

Linux

命令行:pidstat -w


  • 18时40分48秒:时间戳,显示命令运行时的时间。

  • UID:进程的用户 ID,表示进程所属的用户。

  • PID:进程的 ID,表示进程的唯一标识符。

  • cswch/s:表示每秒发生的上下文切换次数,包括进程切换和主动休眠等。

  • nvcswch/s:表示每秒发生的非特权进程上下文切换次数,也叫非特权进程切换次数。

  • Command:进程的命令名称。

参数说明:

  • [options]:pidstat 命令的选项,用于指定要显示的统计信息。常用选项如下:-p <pid>:监测指定进程 ID 的活动情况。-u:显示 CPU 利用率。-r:显示内存利用率。-d:显示磁盘利用率。-w:显示上下文切换和中断信息。-v:显示指定进程的详细信息。

  • [interval]:可选参数,指定两次采样的时间间隔(以秒为单位),默认为 1 秒。

  • [count]:可选参数,指定采样的次数,默认为无限次。

网络 I/O 使用率

Linux

命令行:nicstat 1 5


  • Time:显示采样数据的时间戳。

  • Int:网络接口的名称。

  • rKB/s:接收的数据量(以 KB 为单位)每秒钟。

  • wKB/s:发送的数据量(以 KB 为单位)每秒钟。

  • rPk/s:接收的数据包(以包为单位)每秒钟。

  • wPk/s:发送的数据包(以包为单位)每秒钟。

  • rAvs:接收的数据包平均大小(以字节为单位)。

  • wAvs:发送的数据包平均大小(以字节为单位)。

  • %Util:网络接口的利用率,即接口处于工作状态的百分比。

  • Sat:网络接口的断裂时间(以秒为单位),即接口发生故障的时间。

参数说明:

  • [options]:nicstat 命令的选项,用于指定要显示的统计信息。常用选项如下:-a:显示所有网络接口的统计信息。-u:显示网络接口的传输速率。-i <interface>:指定要监测的特定网络接口。可以使用ifconfig -a查看可用的网络接口名称。-s:显示各个网络接口的摘要统计信息。-v:显示详细的报告,包括每个进程的网络 I/O 和套接字信息。

  • [interval]:可选参数,指定两次采样的时间间隔(以秒为单位),默认为 1 秒。

  • [count]:可选参数,指定采样的次数,默认为无限次。

隔离竞争锁

追查竞争锁来历一直都是难题,可以用一下方法

  • 定期转储线程,查找那些可能在多个线程中因共享锁而被阻塞的线程,后续详细介绍

  • Oracle Solaris Studio Performance Analyzer,后续详解

监控抢占式上下文切换

Linux

命令行:pidstat -w 监控抢占式上下文切换,可以用 taskset 创建处理器组将应用分配给这些处理器组

具体请百度,个人也不是很懂

磁盘 I/O 使用率

Linux

命令行:iostat

针对avg-cpu部分中的统计信息:

  • %user:所占 CPU 时间的百分比,用于进程运行在用户态的时间。

  • %nice:所占 CPU 时间的百分比,用于进程运行在用户态的优先级已经提升的时间。

  • %system:所占 CPU 时间的百分比,用于进程运行在内核态的时间。

  • %iowait:所占 CPU 时间的百分比,用于等待磁盘 I/O 的时间。

  • %steal:所占 CPU 时间的百分比,用于被其他虚拟 CPU 进行运算的时间(仅适用于虚拟化环境)。

  • %idle:所占 CPU 时间的百分比,即 CPU 处于空闲状态的时间。

针对Device部分中的磁盘统计信息:

  • tps:每秒完成的传输操作数,即每秒磁盘执行的读写操作总和。

  • kB_read/s:每秒从磁盘读取的数据量(以 KB 为单位)。

  • kB_wrtn/s:每秒向磁盘写入的数据量(以 KB 为单位)。

  • kB_dscd/s:每秒废弃(丢弃)的缓存数据量(以 KB 为单位)。

  • kB_read:读取自第一次启动至今的总字节数(以 KB 为单位)。

  • kB_wrtn:写入自第一次启动至今的总字节数(以 KB 为单位)。

  • kB_dscd:废弃(丢弃)的缓存数据总字节数(以 KB 为单位)。

参数说明:

  • [options]:iostat 命令的选项,用于指定要显示的统计信息。常用选项如下:-a:显示所有磁盘和 CPU 的统计信息。-d:显示磁盘的统计信息。-c:显示 CPU 的统计信息。-N <device>:显示指定设备的统计信息。-x:显示扩展的磁盘统计信息。-t:在输出结果中添加时间戳。

  • [interval]:可选参数,指定两次采样的时间间隔(以秒为单位),默认为 1 秒。

  • [count]:可选参数,指定采样的次数,默认为无限次。


发布于: 刚刚阅读数: 7
用户头像

xfgg

关注

THINK TWICE! CODE ONCE! 2022-11-03 加入

目前:全栈工程师(前端+后端+大数据) 目标:架构师

评论

发布
暂无评论
Java性能优化权威指南-读书笔记(一)_Java_xfgg_InfoQ写作社区