《Java Performance》笔记1——性能分析基础 2
4.内存使用率:
内存使用率的相关属性包括页面调度或页面交换、加锁、线程迁移中的让步式和抢占式上下文切换。
当应用运行所需的内存超过可用物理内存时,就会发生内存页面交换,系统在进行页面交换或使用虚拟内存时,应用会表现出明显的性能问题。为了应对这种可能出现的情况,通常要为系统配置swap空间,swap空间一般会在一个独立的磁盘分区上,当应用耗尽物理内存时,操作系统会将应用中最少运行的部分置换到磁盘上的swap空间,当访问应用被置换出去的数据时,就必须将它从磁盘置换进物理内存,而这种置换活动会对性能产生很大的影响,尤其是应用的响应性和吞吐量。
让步式上下文切换是指执行线程主动释放CPU,抢占式上下文切换是指线程因为分配的时间片用尽而被迫放弃CPU或被其他优先级更高的线程所抢占。
Java5之后的JVM增加了自旋锁优化机制,即线程通过忙循环自旋尝试获得锁,如果若干次忙循环自旋之后仍然没有成功,则挂起该线程,等待被唤醒再次尝试获取该锁。挂起和唤醒线程会导致操作系统的让步式上下文切换,因此锁竞争激烈的应用会表现出大量的让步式上下文切换,让步式上下文切换耗费的CPU时钟周期代价非常高(通常高达大约80000个时钟周期)。锁竞争监控一般性原则是,如果让步式上下文切换占去5%或更多可用时钟周期时,说明它遇到了锁竞争。
线程迁移是指待运行的线程在处理器之间迁移,大多数操作系统的CPU调度程序会将待运行线程分配给上次它运行的虚拟处理器,如果这个虚拟处理器忙,则调度程序就会将待运行线程迁移到其他可用虚拟处理器。线程迁移会因为新的虚拟处理器缓存中可能没有待运行线程所需的数据或状态信息而导致应用性能下降。多核系统上运行应用可能会发生大量的线程迁移,减少迁移的策略是创建处理器组并将应用分配给这些处理器组。
(1).Windows 内存使用率监控:
typeperf可以监控内存使用率,下面命令每隔5秒钟输出可用内存和页面调度:
typeperf -si 5 “\Memory\Available Mbytes” “\Memory\Pages/sec”
Windows内置的工具难以监控锁竞争,Windows的性能计数器可用监控上下文切换,但无法区分让步式和抢占式上下文切换,因此需要外部工具,如Intel VTune或AMD CodeAnalyst。
(2).Linux内存使用率监控:
Linux中可以使用vmstat命令监控内存使用率,vmstat输出的si表示内存页面换入量,so表示内存页面换出量,free表示可用的空闲内存。
Linux中可以使用sysstat包中的pidstat命令监控锁竞争,使用如下命令可以监控所有虚拟处理器的让步式上下文锁竞争:
pidstat -w
pidstat -w命令输出的cswch/s是让步式上下文切换。
若处理器为3.0GHz的CPU,通过pidstat -w命令监控发现共发生了1750次让步式上下文切换,则让步式上下文切换所浪费的时钟周期比例=1750*80000/3000000000=4.7%.
5.网络I/O使用率:
分布式应用的性能和扩展性受限于网络带宽或网络的I/O,例如若发送到系统网络接口硬件的消息量超过了它的处理能力,消息就会进入操作系统的缓冲区,从而导致应用延迟等。
(1).Linux网络I/O监控:
A.netstat或sysstat:
可以提供每秒发送和接收的包数,包括错误和冲突的包,但是不能提供网络使用率。
B.nicstat:
源码可以从http://sourceforge.net/projects/nicstat/files/下载,使用前需要编译。命令格式如下:
nicstat [-hnsz] [-i interface[,.....]] | [interval] [count]
其中-h是显示帮助信息,-n仅显示非本地接口,-s显示概要信息,-z跳过0值,-i interface是网络接口设备名,interval是报告输出的频率,count是报告的采样数。输出的%Util列就是网络使用率。
(2).Windows网络I/O监控:
Windows上监控网络I/O需要知道被监控网络接口的带宽和网络接口传递的数据量。
网络接口每秒传递的字节数可以通过typeperf -si 5 “\Network Interface(*)\Bytes Total/sec” 获得,单位是bytes/s。
网络带宽可以通过typeperf -si 5 “\Network Interface(*)\Current Bandwidth” 获得,单位是bit/s。
网络使用率=Bytes Total/sec/(Current Bandwidth / 8) * 100
或
网络使用率=(Bytes Total/sec * 8)/Current Bandwidth * 100
网络使用率提高的策略是使用非阻塞的网络I/O代替阻塞的网络I/O,对于非阻塞网络I/O在读请求时尽可能地多读取数据,在写请求时尽可能地多写入数据。
6.磁盘I/O使用率
对于频繁进行磁盘I/O的应用,如数据库、日志等,磁盘I/O对性能有着至关重要的影响。
Linux磁盘I/O监控:
Linux上安装sysstat包之后可以使用iostat命令监控磁盘,命令为:iostat -xm,输出的%util列就是磁盘I/O使用率。
改善磁盘I/O使用率策略:
(1).使用更快的存储设备。
(2).文件系统扩展到多个磁盘。
(3).使用操作系统缓存,开启磁盘缓存。
《Java Performance》笔记1——性能分析基础 2的更多相关文章
- 老李分享:《Java Performance》笔记1——性能分析基础 1
		老李分享:<Java Performance>笔记1——性能分析基础 1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ... 
- 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选
		Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ... 
- java学习笔记15--多线程编程基础2
		本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ... 
- java学习笔记14--多线程编程基础1
		本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ... 
- 「功能笔记」性能分析工具gprof使用笔记
		根据网上信息整理所成. 功能与优劣 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,它使用检测方法,在编译过程中在函数入口处插入计数器用于收集 ... 
- Java集合--ArrayList,LinkedList性能分析
		转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308900.html 第1部分 List概括 先回顾一下List的框架图 (01) List 是一个接口 ... 
- java常用容器简要性能分析(List。Map。Set)
		嗯,实习的时候看到这个,感觉蛮好,这里摘录学习,生活加油: 我曾经害怕别人嘲笑的目光,后来,发现他们的目光不会在我身上停留太久,人们更愿意把目光放在自己身上. 知乎上看到,讲给自己. List Lis ... 
- LR之性能分析基础
		1.判断测试结果有效性 2.分析要点提示 3.Analysis主要提供的6大类分析图 4.分析流程 
- 深入理解JAVA虚拟机之JVM性能篇---基础知识点(运行时数据区域)
		一. 运行数据区域划分 各个数据区域功能如下: 1. 程序计数器: 较小的一块内存空间,可以看做是当前线程所执行的字节码的行号指示器,每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立 ... 
随机推荐
- DevExpress 控件使用之GridControl基本属性设置
			DEV控件:gridControl常用属性设置 1.隐藏最上面的GroupPanel(实现方法两种) ①代码实现:gridView1.OptionsView.ShowGroupPane ... 
- 学习git的使用--在当地的简单命令--01
			<----------git安装完成后操作-----------------> git config --global user.name "scy"添加用户名git ... 
- 轻松理解python中的闭包和装饰器 (下)
			在 上篇 我们讲了python将函数做为返回值和闭包的概念,下面我们继续讲解函数做参数和装饰器,这个功能相当方便实用,可以极大地简化代码,就让我们go on吧! 能接受函数做参数的函数我们称之为高阶函 ... 
- Android  Monkey压力测试介绍
			monkey:通过Monkey程序模拟用户触摸屏幕.滑动Trackball. 按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常. Monkey的构架 Monkey的参数 Monke ... 
- ASP.NET Core MVC上传、导入、导出知多少
			前言 本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天才研究批量导入功能,本节顺便简单搞搞导入.导出,等博主弄妥当了再来和大家一并分享. .NET Core MVC上传 ... 
- Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
			摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “看看星空,会觉得自己很渺小,可能我们在宇宙中从来就是一个偶然.所以,无论什么事情,仔细想一 ... 
- nginx负载均衡2
			负载均衡2 网站是发展初期,nginx只代理了后端一台服务器,但由于网站名气大涨访问的人越来越多一台服务器实在是顶不住,于是我们加了多台服务器,那么多台服务器又怎么配置代理呢,这里以两台服务器为案例, ... 
- intellij idea 常用快捷键mac版
			login.jsp文件中的html标签都是大写格式的,看着很不舒服,就改了一下,全部用的快捷键修改成小写的,也因此整理了一下常用的快捷键. shift + Command + u 大小写转换. alt ... 
- Tp框架之模型层
			数据模型层是专门针对数据库来操作的 我们在home模块用一下数据模型层 先把配置修改好 我们先来打开这个文件 然后再打开think里面的主配置,把那里面关于数据库的部分,复制到home下的配置文件,然 ... 
- nodejs第二天之Buffer类
			2.1一个更好的操作二进制数据的类,我们在操作文件或者网络数据的时候,其实操作就是二进制数据,Node为我们提供了一个更加方便去操作这种数据流的类Buffer,它是一个全局的类. 2.2三种调用方式 ... 
