31
性性性性

性能调优

Embed Size (px)

DESCRIPTION

性能调优. 摘要. Linux 系统资源监控 JVM 内存管理 Profiler 工具介绍 程序优化经验. Linux 内存管理. 查看内存分配 Free Buffer/Cache 系统文件缓存,可以快速释放给应用程序 A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use. - PowerPoint PPT Presentation

Citation preview

Page 1: 性能调优

性能调优

Page 2: 性能调优

摘要• Linux 系统资源监控• JVM 内存管理• Profiler 工具介绍• 程序优化经验

Page 3: 性能调优

Linux 内存管理• 查看内存分配

Free

• Buffer/Cache– 系统文件缓存,可以快速释放给应用程序– A buffer is something that has yet to be "written" to disk. A

cache is something that has been "read" from the disk and stored for later use.

total used free shared buffers cachedMem: 33013644 28049128 4964516 0 1819956 20741200-/+ buffers/cache: 5487972 27525672 Swap: 2096440 780 2095660

Page 4: 性能调优

Linux CPU 内存监控• Top

Page 5: 性能调优

Linux 磁盘 IO 监控• Iostatrpmms@app-30:~/index/lucene$ iostat -xLinux 2.6.26-2-amd64 (app-30.photo.163.org) 2011 年 11 月 04 日 _x86_64_

avg-cpu: %user %nice %system %iowait %steal %idle 0.65 0.00 0.37 0.11 0.00 98.87

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %utilsda 0.01 9.80 0.74 3.84 18.98 150.37 36.98 0.14 29.67 1.66 0.76sda1 0.00 0.62 0.00 0.28 0.03 7.20 25.51 0.00 9.74 2.05 0.06sda2 0.00 0.00 0.00 0.00 0.00 0.00 2.00 0.00 40.00 40.00 0.00

rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/swrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/sr/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/sw/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/srsec/s: 每秒读扇区数。即 delta(rsect)/swsec/s: 每秒写扇区数。即 delta(wsect)/s

rkB/s: 每秒读 K 字节数。wkB/s: 每秒写 K 字节数。avgrq-sz: 平均每次设备 I/O 操作的数据大小 ( 扇区 ) 。avgqu-sz: 平均 I/O 队列长度。await: 平均每次设备 I/O 操作的等待时间 ( 毫秒 ) 。svctm: 平均每次设备 I/O 操作的服务时间 ( 毫秒 ) 。%util: 有百分之多少的时间用于 I/O 操作

Page 6: 性能调优

Linux 磁盘 IO 监控• Iotop

Page 7: 性能调优

文件句柄• 文件句柄上限

通过 ulimit 命令查看和修改• lsof

查看占用的文件句柄,常用参数:– -p <PID> ,仅显示指定进程占用的– -i ,仅显示网络文件句柄,可用于过滤连接– -n ,取消域名解析,加快处理– -s ,显示文件大小,对于网络连接可用于过滤

连接状态

Page 8: 性能调优

Linux 网络监控• 连接数上限

– 端口数– 文件句柄数,每个连接占用一个文件句柄

• Netstat查看网络连接状态与数量常用参数:– -p 显示连接所属 pid ,配合 grep 可以看出特定进程、端

口的连接状况– -n 显示 ip 地址,不尝试解析域名– -l 只显示监听端口– -a 同时显示网络连接与监听端口

Page 9: 性能调优

Linux 网络监控• Iftop 按连接查看网络带宽占用• nethogs 按进程统计占用总带宽与流量

Page 10: 性能调优

Linux 网络监控• Iptraf

简单图形化界面,能按网卡、端口、包大小等,查看如流量等统计信息

• Netperf客户端与服务器,能直接测试两台服务器之间的吞吐量服务器端运行: netserver客户端运行: netperf -H 172.16.38.36 -l 10

Page 11: 性能调优

Linux 系统监控工具• Vmstatfs@fs-50:~/tomcat-cloud-rpc$ vmstat -SMprocs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 0 0 819 1283 323 10011 0 0 15 47 0 0 5 1 95 0

• Procs• r: 运行的和等待 (CPU 时间片 ) 运行的进程数,这个值也可以判断

是否需要增加 CPU( 长期大于 1)• b: 处于不可中断状态的进程数,常见的情况是由 IO 引起

• Memory• swpd: 切换到交换内存上的内存

• Swap• si: 虚拟内存由磁盘调入内存• so: 虚拟内存由内存调入磁盘

• Io • bi: 从块设备读入的数据总量 ( 读磁盘 )• bo: 写入到块设备的数据总理 ( 写磁盘 )

• System• in: 每秒产生的中断次数• cs: 每秒产生的上下文切换次数

• Cpu• us: 用户进程消耗的 CPU 时间百分比• sy: 内核进程消耗的 CPU 时间百分比• id: CPU 处在空闲状态时间百分比• wa: IO 等待消耗的 CPU 时间百分比

Page 12: 性能调优

垃圾回收概述• 目的

找出没用的对象进行释放• 如何找出“已死”对象?

– 引用计数算法– 根搜索算法

• 如何回收空间– 标记-清除 -> 空间碎片多– 复制 -> 空间浪费多– 标记-整理 -> 效率低– 分代收集 -> 因地制宜

Page 13: 性能调优

标记 - 清除

Page 14: 性能调优

复制1 2 3

4 5 6

7 8 9

2 4 5

8 9

Page 15: 性能调优

标记 - 整理

1 2 3

4 5 6

7 8 9

2 4 5

8 9

Page 16: 性能调优

JVM 内存分代管理机制• Stack• Heap

– Eden– Survivor * 2– Tenured

• Perm• Direct

Page 17: 性能调优

JVM 内存分配策略• 局部变量表(基本数据类型,对象引用指针)、动

态链接、方法出口等存在 Stack• 新对象一般在 eden+survivor 中分配(新生代)• 新生代满了进行 Minor GC ,存活对象拷贝到另一个

survivor ,原 survivor+eden 清空• 如果 survivor 不足或对象满足晋升条件,则进入老

年代,移动到 Tenured 区• Tenured 不足触发 Full GC , Full GC 代价高• Perm 用于存放类、常量信息等• Direct 用于 native方法空间分配,如 NIO

Page 18: 性能调优

JVM GC 监控方法• 打印 GC 日志

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log

• Jstat 工具实时监控 jvm 个内存池的空间使用情况,以及 gc次数和占用时间

• VisualVM

Page 19: 性能调优

GC log 示例

Page 20: 性能调优

Jstat 示例

Page 21: 性能调优

JVM GC 算法• Serial - 新 /老生代,单线程,最基本的 GC 策略 • ParNew - 新生代, Serial 多线程版本,利用多核缩短全局停顿时间

• Parallel Scavenge - 新生代,多线程,关注总体吞吐量

• Parallel Old - 老生代, Parallel Scavenge老年代版本• CMS - 老生代,多线程,全局停顿时间短,”标记 -

清除“算法,碎片多,需要 Serial 作为后备 FullGC • G1(Garbage First , JDK 7)

Page 22: 性能调优

Parallel Scavenge / Old

• 目标–达到可控的吞吐量

• 核心思想– GC 策略根据设定的吞吐率、最大停顿时间、当前 jvm负载等,决定 gc 运行时机,而不完全在空间满了的情况下执行 GC 。

– 如果需要缩短停顿时间,会缩小新生代或让 gc运行更频繁

Page 23: 性能调优

Concurrent Mark Sweep( CMS)

• 目标– 实现最短的回收停顿时间

• 核心思想把回收分成多个阶段:– 初始标记,停顿,仅标记根节点– 并发标记,从根节点出发标记所有活对象– 重新标记,停顿,修正并发标记阶段的数据变动– 并发清除,清除所有垃圾对象

• 缺点– GC线程与用户线程并发,影响效率– 无法处理浮动垃圾——并发清除阶段生成的垃圾– 空间碎片多– 在由于空间碎片或没法及时清理出可用空间时会使用 Serial Old 进行 FullGC

Page 24: 性能调优

Gargage First ( G1)• 目标

– 高吞吐率 + 低停顿时间• 核心思想

– 把整个堆划分位多个独立区域,每个区域都有新 /老生代的概念,但没有明确的划分

– 跟踪每个区域的垃圾堆积程度,后台维护优先列表,优先回收垃圾最多的区域,保证在有限时间内获得最高的收集效率

• 优点– 可以明确指定毫秒时间片内 GC停顿不超过指定值,几乎是实

时 Java 的垃圾收集器– 回收吞吐率高

• JDK 7 中实验性回收策略

Page 25: 性能调优

GC 效率对比• 新生代垃圾为主

– ParNew – Parallel Scavenge

• 老生代垃圾为主– Serial 0.9s– Parallel Old 0.7s– CMS 0.003s

Page 26: 性能调优

常用 GC相关参数

总空间 -Xms2048m -Xmm2048m

新生代 -Xmn1024m

eden:survior -XX:SurvivorRatio=8

老生代晋升 -XX:PretenureSizeThreshold=10000-XX:MaxTenuringThreshold=15

CMS -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80

Parallel scavenge -XX:+UseParallelOldGC -XX:+UseParallelGC

Page 27: 性能调优

常用 Profiler 工具• 常用 Profiler 产品

– 收费• JProfiler• Yourkit Java Profiler

– 免费• TPTP( Test and Performance Tools Platform)

• 基于 java 代理机制 使用简单,功能强大,但对性能影响较大。

• 适用场景– 查看内存耗在哪里– 查看是否有内存泄露– 线程执行状态,锁等待、 io block

Page 28: 性能调优

基于 AspectJ 进行 profile( AJProfiler)

• AspectJ 简介基于编译时代码插入的 Java AOP支持,对性能影响小

• Profile原理基于 AOP ,在需要监控的方法执行前后记录系统时间,计算方法执行时间进行各种统计。

• 项目地址http://qa.hz.netease.com/projects/netease498591/news

• 主要功能– 请求时间吞吐率监控– 函数调用时间 Profile 监控

Page 29: 性能调优

AJProfiler使用方法• 使用方法

– 加入 maven编译依赖–添加需要代码插入的依赖包列表–添加指定监控函数切面文件–重新编译项目–启用 jmx 监控

• 具体参考使用说明文档http://qa.hz.netease.com/attachments/download/35193?nav=211

Page 30: 性能调优

程序优化经验• 重点从算法、逻辑上优化• 避免保存重复的 String 对象

– 小心使用 String.subString() 与 String.intern() • 不要用 Log4j输出文件名、行号

– Log4j 通过打印线程堆栈实现,生成大量 String• 少用 finalizer• 避免过多使用 java 序列化• Memcached 客户端选择, gwhalin 和 spy 对比• 优先考虑适用返回值而不是异常表示错误

Page 31: 性能调优

谢谢