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 个阶段:分析、设计、编码和测试
分析:用于评估需求、权衡各种架构的利弊以及构思高层抽象
设计:依据分析阶段的基本架构和高层抽象,进行更精细的抽象,考虑具体实现
编码:代码设计的实现
测试:验证实现是否合乎应用需求
建议在分析阶段添加性能分析,测试阶段之后新增性能测试
通过性能分析定位性能问题
应用预期的吞吐量是多少?
请求和响应之间的延迟预期是多少?
应用支持多少并发用户或者并发任务?
当并发用户数或者并发任务数达到最大时,可接受的吞吐量和延迟是多少?
最差情况下的延迟是多少?
要使垃圾收集引入的延迟在可容忍范围之内,垃圾收集的频率应该是多少?
低劣的设计和糟糕的实现发现得越晚,修复的代价越大
现在许多应用都会使用自动构建和测试,进一步添加自动性能测试
性能分析的两种方法
自顶向下
自顶向下是最常用的性能调优方法
首先对运行在特定负载之下的应用进行监控,监控范围包括:操作系统,Java 虚拟机,JavaEE 容器以及应用的性能测量统计指标,然后基于监控信息所给出的提示进行下一步工作,例如 JVM 垃圾收集器调优,操作系统调优,或者应用程序性能分析
自底向上
在无法更改应用源代码,例如应用已经部署在生产环境中等,个人理解:开发一般不需要考虑这个问题
首先需要收集和监控最底层 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 命令
top:直接输入 top 后按 enter,可以看到当前系统的状态,包括任务数,负载状态,CPU 使用状态,内存和交换区使用状态以及各个进程的状态。
top -p pid:监视指定进程的状态。
top -d n:设定每次显示的间隔,单位为秒。
top -i:忽略闲置和僵尸进程。
top -b:以批处理模式启动 top,主要用于在脚本中捕获 top 的输出信息。
top -n num:在结束 top 程序前,更新 num 次。
在使用top
命令的过程中,还可以实时输入一些命令来调整 top 的显示:
P:按 CPU 利用率排序。
M:按内存利用率排序。
t:显示或隐藏“任务(CPU 核心)”,“负载和运行时间”这两行信息。
m:显示或隐藏“内存简述”行。
c:显示或隐藏命令完整路径。
k:杀死一个进程,需要知道该进程的 PID。
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]
:可选参数,指定采样的次数,默认为无限次。
版权声明: 本文为 InfoQ 作者【xfgg】的原创文章。
原文链接:【http://xie.infoq.cn/article/58215875d93ecb2aef9755a57】。未经作者许可,禁止转载。
评论