- 浏览: 94674 次
- 性别:
- 来自: 深圳
文章分类
最新评论
5.1 寻找性能瓶颈
通常性能瓶颈的表象是资源消耗过多、外部处理系统性能不足,或者资源消耗不多,但程序的响应速度却仍达不到要求。
资源主要消耗在 CPU 、文件 IO 、网络 IO 、以及内存方面。
外部处理的性能不够主要是调用其他系统的功能或数据库操作的响应速度不够。
资源消耗不多,但程序的响应速度仍达不到要求的主要原因是程序代码运行效率不高,未充分使用资源或程序结构不合理。
对于 JAVA 应用而言,寻找性能瓶颈的方法通常为首先分析资源的消耗,然后结合 JAVA 的一些工具来查找程序中资源消耗过多的代码。
5.1.1 CPU 消耗分析
在 Linux 中, CPU 主要用于中断、内核及用户进程的任务处理,优先级为中断 > 内核 > 用户进程,在学习如何分析 CPU 消耗状况前,还有三个重要的概念要阐述。
1. 上下文切换
每个 CPU (或多核心 CPU 中的每核 CPU )同一时间只能执行一个线程, Linux 采用的是抢占式调度,即为每个线程分配一定的执行时间。线程执行时间到达而切换到其它线程时,就会触发上下文切换。上下文切换过多会造成内核占据较多的 CPU 使用,使得应用的响应速度下降。
2. 运行队列
每个 CPU 都维护了一个可运行的线程队列。通常建议控制在每个 CPU 核上的运行队列为 1-3 个。
3. 利用率
CPU 利用率为 CPU 在用户进程、内核、中断处理、 IO 等待以及空亲五个部分使用的百分比。建议用户进程和内核进程消耗的 CPU 比率在 65%-70%/30%-35% 左右。
在 linux 中 , 可用 top 或 pidstat 方式来查看进程中线程的 CPU 的消耗状况。
1. top
CPU 行, us 表示用户进程处理所占的百分比 ;sy 表示内核进程所占的百分比 ; ni 表示被 nice 命令改变优先级的任务所占的百分比 ; id 表示 CPU 空闲时间所占的百分比 ; wa 表示为在执行的过程中等待 IO 所占的百分比 ; hi 表示为硬件中断所占的百分比 ; si 表示为软件中断所占的百分比
对于多个或多核的 CPU ,显示则会是多个 CPU 所占用百分比的总和,因此会出现 160%us 的现象,如需查看每个核的消耗情况,可在进入 top 视图后按 1 ,就会按核来显示消耗状况。
在 top 视图按 shift+h 后,可按线程查看 CPU 的消耗状况。
2. pidstat
pidstat 是 SYSSTAT 中的工具,如需使用,请先安装
pidstat 1 2 ,在 console 会每隔 1 秒输出目前活动进程的 CPU 消耗状况,共 2 次。
Pidstat –p [PID] –t 1 5 可查看某进程中线程的 CPU 消耗状况
当 CPU 消耗严重时,主要体现在 us 、 sy 、 wa 或 hi 的值变高。对 JAVA 应用而言,主要体现在 us 、 sy 两个值上:
us
us 值过高,表示运行的应用消耗了大部分的 CPU ,如下是找出具体消耗 CPU 的线程的办法:
首先通过 top 或 pidstat 命令找出消耗 CPU 严重严重的线程及其 ID ,将些 ID 转化为十六进制的值。之后通过 kill -3 [javapid] 或 jstack 的方式 dump 出应用的 java 线程信息,通过之前转化的十六进制的值找到对应的 nid 值的线程。该线程即为消耗 CPU 的线程。可多执行几次上述过程,以确保找到真实的消耗 CPU 的线程。
sy
sy 值高时,表示系统花费了更多的时间在进行线程切换, JAVA 应用造成这种现象的主要原因是启动的线程比较多,且这些线程多数都处于不断的阻塞和执行状态的变化过程中,导致系统不断的切换线程,产生大量的上下文切换。
5.1.2 文件 IO 消耗分析
Linux 在操作文件时,将数据放入文件缓存区,直到内存不够或系统要释放内存给用户进程使用,因此在查看 Linux 内存状况时经常会发现可用的物理内存不多,但 cached 用了很多,这是 Linux 提升文件 IO 速度的一种做法。这种情况下,如物理空闲内存够用,通常在 Linux 上只有写文件和第一次读取文件时会产生真正的文件 IO
在 Linux 中,主要通过 pidstat 来查找文件 IO 的消耗
1. pidstat
pidstat –d –t –p[pid] 1 100 查看线程的 IO 消耗状况,要在 2.6.20 以上版本有效。返回结果中, TID 表示线程 ID , KB_rd/s 表示每秒读取的 KB 数, KB_wr/s 表示每秒写入的 KB 数。
2 . iostat
在没有 pidstat 的情况下,只能通过 IOSTAT 来查看整个系统的文件 IO 消耗状况,无法跟踪进程的文件 IO 消耗状况。
直接输入 iostat ,返回结果中, tps 是每秒的 IO 请求数 ; Blk_read/s 是指每秒读的块数量,通常块的大小为 512 字节 ; Blk_write 指每秒写的块数量 ; Blk_read/Blk_wrtn 指总共读 / 写的块数量
iostat –x xvda 3 5 输出信息会相对多一些,其中。 r/s 表示每秒读请求数 ; w/s 指每秒写请求数 ; await 表示平均每次 IO 操作的等待时间 (ms); avgqu-sz 表示等待请求的队列的平均长度 ; svctm 表示平均每次设备执行 IO 操作的时间 ; util 表示一秒之中有百分之几用于 IO 操作。
使用 iostat 时,首要关注 CPU 中的 iowait% 所占的百分比,当 iowait 占了主要的百分比时,就要关注 IO 方面的消耗状况了。
JAVA 应用造成文件 IO 消耗严重主要是多个线程需要进行大量内容写入 ( 如频繁的日志写入 ) 的动作;或磁盘设备本身处理速度慢;或文件系统慢;或操作的文件本身已经很大造成。
5.1. 3 网络 IO 消耗分析
对分布式JAVA应用而言,网络IO的消耗非常值得关注,特别要注意网卡中断是不是均衡地分配到各CPU的(通过 cat /proc/interrupts查看)。对于网卡中断只分配到一个CPU的现象,google采用了修改kernel的方法进行修复;或是采用支持MSI-X8的网卡来修复
Linux中可采用sar来分析网络IO的消耗状况。输入 sar -n FULL 1 2,执行后以1秒为频率,共输出两次网络IO的消耗情况。输出信息主要有三部分,第一部分为网卡上成功接包和发包的信息;第二部分为网卡上失败的接包和发包信息;第三部分为sockets上的统计信息。对于JAVA应用而言,主要关注第三部分的tcpsck,udpsck。
5.1. 4 内存消耗分析
对JVM内存的分析,第四章已有介绍,对JVM以外的内存消耗,最为值得关注的是swap的消耗以及物理内存的消耗,这两方面的消耗都可基于os的命令来查看。
1. vmstat
在命令行中输入vmstat,输出信息和内存相关的主要是memory下的swpd,free,buff,cache以及swap下的si和so。其中,swpd指虚拟内存中已使用的部分(kb);free指空闲物理内存;cache表示用于缓存的内存;swap下的si指每秒从disk读至内存的数据量;so指每秒从内存写入disk的数据量。swpd过高通常是物理内存不够用,os将物理内存中的一部分数据转为放入硬盘上进行存储。
2. sar
sar -r 会返回物理内存,swap, buffer cache等使用情况,可以认为可用的物理内存为: dbmemfree+kbbuffers+kbcached.
sar 相比vmstat的好处是可以查询历史状况,以更加准确的分析趋势状况,例如: sar –r –f /tmp/log/sa/sa12
3. top
通过 top 可查看进程所消耗的内存量,不过 top 看到的 java 进程的消耗内存是包括了 JVM 已分配的内存加上 JAVA 应用所耗费的 JVM 以外的物理内存。
4. pidstat
pidstat –r –p [pid] [interval] [times]. 执行此命令可查看进程所占用的物理内存和虚拟内存的大小。
5.1.5 程序执行慢原因分析
1. 锁竞争激烈
如数据库连接池中连接数为 10 ,有 50 个或更多线程需要进行数据操作。
2. 未充分使用硬件资源
如机器为双核 CPU ,但程序中都是单线程串行的操作
3. 数据量增长
数据量增长通常是造成程序执行慢的典型原因,当数据库中单表的数据从 100 万上涨到 1 亿后,数据库的读写速度将大幅下降
此外,也可借助 JProfile 等商业工具,找出执行耗时比率最大的代码。
发表评论
-
技术文章精华合集(持续更新中)
2016-09-20 19:09 718Kafka深度解析 分库分表系列文章 来自 ... -
<<More Joel on Software>> 如何扮演程序经理的角色
2011-07-03 15:13 797制作伟大软体的秘方之 ... -
<<More Joel on Software>> 利诱管理法
2011-07-03 15:10 959利诱管理法 Joke: A poor J ... -
<<More Joel on Software>> The Joel Test: 软件开发成功 12 法则
2011-07-03 14:42 689作者: 周思博 (Joel Spols ... -
<<More Joel on Software>> 看起来简单, 实际上复杂
2011-07-03 14:41 761作者: 周思博 (Joel Spolsky) 译: Bo Y ... -
<<More Joel on Software>> 膨胀软件与80/20的谣传
2011-07-03 14:38 885作者: 周思博 (Joel Spols ... -
<<More Joel on Software>> 每日构建(daily build)是你的朋友
2011-07-03 14:37 852作者: 周思博 (Joel Spols ... -
<<More Joel on Software>> 五个为什么
2011-07-03 14:20 957五个为什么(译文) ... -
<<More Joel on Software>> 飙高音
2011-07-03 13:54 906飙高音(译文) 作者: 阮一峰 日期: 2009年 ... -
<<More Joel on Software>> 关于战略问题的通信之六
2011-07-03 13:51 769关于战略问题的通信之六(译文) 作者: 阮一峰 日 ... -
<<More Joel on Software>> 易用性是不够的
2011-07-03 13:41 738易用性是不够的(译文) 作者: 阮一峰 日期: 2 ... -
<<More Joel on Software>> 军事化管理法
2011-07-03 13:28 963高科技公司能否采用军事化管理?(译文) 作者: 阮一峰 ... -
<<More Joel on Software>> 寻找优秀的程序员
2011-07-03 13:24 1197=================== 寻找 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第七章 构建可伸缩的系统
2011-05-29 12:09 1105通常将通过升级或增加单机机器的硬件来支撑访问量及数据量增长的方 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第六章 构建高可用的系统
2011-05-28 11:02 1200对于互联网或企业中的大型应用而言,多数要求做到 7*24 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第五章 性能调优(二)
2011-05-22 21:34 10905.2 调优 找出性 ... -
读书笔记:《分布式JAVA应用 基础与实践》 第四章 分布式JAVA应用与JDK类库
2011-05-21 11:23 11774.1 集合包 ArrayList, Li ... -
读书笔记:《分布式JAVA应用 基础与实践》 第三章 3.3 JVM线程资源同步及交互机制(二)
2011-05-17 21:52 938接下来网上没有,貌似 ... -
《分布式JAVA应用 基础与实践》 第三章 3.3 JVM线程资源同步及交互机制(一)
2011-05-17 19:09 8903.3 JVM线程资源同步及交互机制 Java程序采用 ... -
《分布式JAVA应用 基础与实践》 第三章 3.2 JVM内存管理(四)
2011-05-17 19:00 9253.2.4 JVM内存状况查看 ...
相关推荐
Java分布式应用学习笔记01分布式Java应用和SOA
Java分布式学习笔记01分布式Java应用
linux运维笔记:分布式文件系统GlusterFS.docx
性能优化手册是一套java性能学习研究小技巧,包含内容:Java性能优化、JVM性能优化、服务器性能优化、数据库性能优化、前端性能优化等。 内容包括但不限于: String 性能优化的 3 个小技巧 HashMap 7 种遍历方式...
ORACLE DBA工作笔记 运维数据迁移与性能调优 清晰版 。。。
Java分布式应用学习笔记
自己的读书笔记,这是《大型网站系统与Java中间件实践》的第一章的读书笔记。主要讲解了分布式系统的基本知识。
读书笔记:第一章电子商务基础知识.pdf
Java 虚拟机学习笔记: Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...
文是学习大型分布式网站架构的技术总结。对架构一个高性能,高可用,可伸缩,可扩展的...一部分为读书笔记,一部分是个人经验总结。对大型分布式网站架构有很好的参考价值。(如果感觉对大家有帮助,请帮忙点推荐,谢谢
这篇文章主要讲述分布式时代和中间件相关知识,包括服务化、HSF、Notify和TDDL。同时里面有我们经常遇见的编码错误等相关问题,希望文章对你有所帮助!在系统发展的过程中,架构师的眼光至关重要,作为程序员,只要把...
大型分布式网站架构设计与实践+笔记.zip 1.Cache缓存 2.持久化存储 3.消息系统MQ 4.垂直化搜索引擎 5.其他基础设施
Java分布式应用学习笔记07线程池应用
Java基础笔记, 第一章:编程基础 第二章:数组 第三章:面向对象程序开发 第四章:异常机制 第五章:多线程技术 第六章:常用类API 第七章:集合框架(容器)+其他类对象使用 第八章:IO流 第九章:GUI编程 第十章...
ORACLE学习笔记:日常应用、深入管理、性能优化.part1
Oracle性能调优笔记
学生读书笔记共享-学生读书笔记共享系统-学生读书笔记共享系统源码-学生读书笔记共享管理系统-学生读书笔记共享管理系统java代码-学生读书笔记共享系统设计与实现-基于springboot的学生读书笔记共享系统-基于Web的...
读书笔记 类型: 课程学习 名称: 计算机应用基础 时间:2006.7.7 体裁:说明文 " 知识内容与结构 "备 注 " "一.知识整体结构层次1说明: " " "计算机基础知识 " " "计算机软件 (系统软件——操作系统) " " ...
分布式系统原理与范例读书笔记