`
chinese.darren
  • 浏览: 99558 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

性能监控/优化系列——内存/线程/锁相关

阅读更多

 1. 内存的分页(paging)、交换(swapping)、锁和线程的上下文切换(分为voluntary and involuntary context switching)需要监控。两种上下文的区别:voluntary ——voluntarily takes itself off the CPU;involuntary ——占用时间期满或优先级更高的线程取代。

2. 如果一个java程序或JVM在发生内存交换(swapping)表明有性能问题需要关注。
3. 当发现JVM的垃圾回收时间很长时,很可能是内存不足发生swapping。如果JVM运行在内存不足的机器上,它的内存堆可能会被交换出去,当做垃圾回收的时候需要遍历整个堆的内存,所以会要求处在磁盘中的数据给交换到内存,这个时候会产生很大的延迟,导致很多线程会停止运行。(一般情况下,当内存不够时,OS内核page scanner会去扫描内存,将那些不再使用的内存提供给需要的应用程序,如果不能找到足够的内存就会把最近最少被使用的内存page交换到磁盘。可获得的内存越少page scan rate就越高。
4. 从上面几点可以看出:当page scanner扫描的次数(Solaris下可以用vmstat,对应的列为‘sr)不为0(增多)且free内存有下降的趋势,那么交换swapping就会发生,性能就会开始下降。
Solaris下vmstat命令
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr cd f0 s0 -- in sy cs us sy id
1 0 0 499792 154720 1 1697 0 0 0 0 0 0 0 0 12 811 612 1761 90 7 4
1 0 0 498856 44052 1 3214 0 0 0 0 0 0 0 0 12 1290 2185 3078 66 18 15
3 0 0 501188 17212 1 1400 2 2092 4911 0 37694 0 53 0 12 5262 3387 1485 52 27 21
1 0 0 500696 20344 26 2562 13 4265 7553 0 9220 0 66 0 12 1192 3007 2733 71 17 12
1 0 0 499976 20108 3 3146 24 3032 10009 0 10971 0 63 0 6 1346 1317 3358 78 15 7
1 0 0 743664 25908 61 1706 70 8882 10017 0 19866 0 78 0 52 1213 595 688 70 12 18
5. 关于锁,Java5之前的锁机制是直接代理了OS的锁元素(delegate Java monitor operations directly to operating system monitors, or mutex primitives),这样会提高system CPU utilization,因为system mutex primitives涉及到系统调用,也由于直接代理的因素需要OS级别的命令就可以查看到Java应用的锁竞争状况。但是,Java5之后有了变化,不再直接依赖OS的锁机制,而是在用户代码级别实现了锁逻辑,因此监控方法发生了变化。Java5的锁实现如下:spin in a tight loop trying to acquire a lock, if not successful after a number of tight loop spins, park the thread and wait to be notified when to try acquiring the lock again,也就是说,在一个循环中去获取锁,如果几次没有成功,那么就停止(parking)线程进行等待,直到被通知为止。
6. Java的锁竞争引起了线程上下文切换,CPU利用率很高,反过来讲,如果发现上下文切换过高,那么很可能是锁竞争导致的。The act of parking a thread along with awaking a thread results in an operating system voluntary context switch,从CPU时钟周期基本来讲,这是一个代价很高的操作,每个上下文交换需要80000以上个clock cycle。一般经验值:experiencing 5% or more of its available clock cycles in voluntary context switches(这个可以以1s时间周期为计算)很可能存在锁竞争。事实上,当该值达到3% to 5%就应该进行相关的排查工作。
7. 上述百分比的计算方法:如果一台机器的主频为3g,也就是30亿个时钟周期每秒,那么计算公式如下:Solaris——1s内上下文切换数*80000/30亿;Linux——1s内上下文切换数/虚拟处理器数*80000/30亿(为什么要除以虚拟处理器数:因为pidstat -w所统计的是所有处理的上下文切换数,每个处理器(核)都有自己的时钟,而Solaris中统计是平均每个核的上下文切换数,所以不需要在做除法)。
Solaris下mpstat命令
$ mpstat 5
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 4 0 1 479 357 8201 87 658 304 0 6376 86 4 0 10
1 3 0 1 107 3 8258 97 768 294 0 5526 85 4 0 10
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 551 379 8179 91 717 284 0 6225 85 5 0 10
1 2 0 0 2292 2 8247 120 715 428 0 7062 84 5 0 10
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 562 377 8007 98 700 276 0 6493 85 5 0 10
1 0 0 0 2550 4 8133 137 689 417 0 6627 86 4 0 11
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 544 378 7931 90 707 258 0 6609 87 5 0 8
1 0 0 0 2428 1 8061 125 704 409 0 6045 88 3 0 9
Linux下pidstat命令
$ pidstat -w -I -p 9391 5
Linux 2.6.24-server (payton) 07/10/2008
08:57:19 AM PID cswch/s nvcswch/s Command
08:57:26 AM 9391 3645 322 java
08:57:31 AM 9391 3512 292 java
08:57:36 AM 9391 3499 310 java
8. 常用命令:mpstat 3(Solaris)/pidstat -w -I -p 9391 5(linux版本2.6.23及以上
9.Java程序常用排查锁竞争问题的方法:periodically take thread dumps and look for threads that tend to be blocked on the same lock across several thread dumps。
10. 工具:Oracle Solaris Studio Performance Analyzer(Solaris和Linux)方便锁问题的排查,甚至它能够捕获到CPU缓存的miss率,另外常用的有jstack/pstack命令。
11. Involuntary上下文切换的暗示, High involuntary context switches表明有多于虚拟处理器数的轻量级进程准备去运行,这时伴随着高的运行队列和CPU利用率。优化方法:减少put到CPU的负载,增加CPU,优化数据结构和算法。还有一个可以操作的方法是:linux下使用taskset命令修改进程的“CPU亲和力”,也就是使用taskset充分利用多核CPU,让CPU的使用率均衡到每个cpu上。
12. 线程迁移,通常情况下,CPU调度器会将ready-to-run的线程放到它最后一次被执行的虚拟处理器上,如果该处理器繁忙,那么这个线程会被迁移到其他处理器上。这种线程迁移会影响到性能,因为线程所需要的数据可能在另外的虚拟处理器cache中不存在,故会产生stall延时。
Solaris上mpstat命令的migr”列监控线程是否发生了迁移。优化方法:creating processor sets and assigning Java applications to those processor sets,实际就是上面提到的taskset命令能够做的事情。经验值:在多处理器环境下,如果每秒大于500个迁移可以从“CPU亲和力”设置中获得较好的性能。
分享到:
评论

相关推荐

    实战Java虚拟机——JVM故障诊断与性能优化.pdf

    4. **性能监控与调优工具**:JDK自带的一些工具,如jconsole、jvisualvm、jmap、jstack等,是JVM性能分析的重要辅助。书中可能详细讲解了这些工具的使用方法和分析技巧。 5. **JVM参数设置**:了解并合理设置JVM...

    关系型数据库应用的性能优化——基于SQL Server平台.pdf

    《关系型数据库应用的性能优化——基于SQL Server平台》 关系型数据库在现代信息系统中扮演着核心角色,而SQL Server作为广泛使用的数据库管理系统,其性能优化对于提升整体系统效率至关重要。本文将深入探讨如何在...

    Jprofile资料——使用JConsole实现JBoss性能监控

    在Java应用开发和运维中,性能监控是至关重要的一个环节,尤其对于大型的企业级应用服务器如JBoss来说。本文将详细讲解如何利用JConsole工具来实现对JBoss服务器的性能监控,以确保系统的稳定性和效率。 JConsole是...

    实战Java虚拟机——JVM故障诊断与性能优化

    4. **性能监控与调优工具**:如JConsole、VisualVM等,这些工具可以帮助开发者实时监控JVM状态,分析CPU、内存、线程等资源的使用情况,从而发现潜在的问题。 5. **异常诊断**:书中会介绍如何通过日志、堆转储...

    Java程序性能优化 让你的Java程序更快、更稳定

    Java程序性能优化是每个开发人员都需要关注的重要领域,它涵盖了多个方面,旨在提高代码执行效率,减少资源消耗,以及提升应用程序的稳定性和响应速度。在本文中,我们将深入探讨Java性能优化的关键点,帮助你的Java...

    delphi7 多线程测试(40个线程)

    在编程领域,多线程是一种常见且强大的...通过理解线程管理、资源竞争以及合理的设计策略,可以优化多线程应用的性能。在实际项目中,开发者应根据具体情况调整线程数量,平衡并行度和系统资源利用率,以达到最佳性能。

    从0开始开发 基础库(配置文件读写、日志、多线程、多进程、锁、对象引用计数、内存池、免锁消息队列、免锁数据缓冲区、进.zip

    本压缩包“从0开始开发 基础库”涵盖了多个重要的编程概念和技术,包括配置文件读写、日志记录、多线程与多进程操作、同步机制如锁、对象引用计数、内存池以及两种优化数据结构——免锁消息队列和免锁数据缓冲区。...

    安卓Android源码——手机远程监控.rar

    10. **性能优化**:为保证远程监控的流畅性和低延迟,开发者可能进行了性能优化,例如利用多线程处理,减少CPU和内存占用,优化图像编码效率等。 以上是对"安卓Android源码——手机远程监控"这一主题可能涉及的关键...

    实战JAVA虚拟机 JVM故障诊断与性能优化

    6. **JVM性能监控工具**:如JConsole、VisualVM和JMX,这些工具能帮助开发者实时监控JVM的状态,包括CPU使用率、内存分配、线程状态等,从而发现问题并进行调优。 7. **性能调优**:包括JVM参数调整、代码优化、...

    安卓Android源码——多线程断点下载.zip

    10. **性能优化**:为了减少系统资源的消耗,源码可能会包含一些性能优化策略,如限制并发线程的数量、动态调整下载速度等。 以上就是关于“安卓Android源码——多线程断点下载.zip”文件可能涉及的关键知识点。这...

    ASP.NET源码——多线程数据采集器源码(C347 2.0).zip

    7. **性能监控和调优**:为了优化数据采集器的性能,开发者可能需要监控线程的活动,包括CPU使用率、内存消耗以及线程的生命周期。这可能涉及Windows性能计数器或自定义日志记录。 8. **数据处理和存储**:数据采集...

    Java虚拟机-jvm故障诊断与性能优化-源码

    4. **性能监控工具** - **JVisualVM**:内置丰富的JVM监控和分析功能,如CPU、内存、线程等。 - **JConsole**:提供GUI界面,监控JVM的各种性能指标。 - **JMX**:Java管理扩展,允许远程监控和管理应用程序。 5...

    太细了,堪称完美总结:“Java性能调优六大工具”之Windows工具(csdn)————程序.pdf

    【Java性能调优六大工具】中的Windows工具主要包括Windows任务管理器和perfmon性能监控工具,它们都是在Windows平台上用于监测和优化Java应用性能的重要手段。 首先,**Windows任务管理器**是最常见也是最直观的...

    Android源码——远程视频监控程序源码.7z

    8. **性能优化**:由于视频流的数据量大,对内存和CPU的消耗较高,因此需要进行性能优化,比如合理使用缓存、降低分辨率或码率等。 9. **兼容性测试**:由于Android设备的多样性和系统版本的差异,程序需要进行广泛...

    易语言源码内存监控显示.rar

    内存监控显示是程序开发中的一个重要环节,尤其是在调试和性能优化阶段。这个项目可能是为了教用户如何在易语言中实现内存监控功能,以便观察程序运行时内存的变化情况。内存监控能够帮助开发者定位内存泄漏、非法...

    libevent多线程

    1. **线程模型**:Libevent支持两种多线程模型——基于共享内存和基于消息传递。在共享内存模型中,所有线程共享同一个事件基础结构,通过锁和其他同步机制来防止数据竞争。而在消息传递模型中,线程间通过消息队列...

    Android优化技术详解

    总结来说,"Android优化技术详解"涵盖了内存管理、UI优化、多线程处理、资源优化、网络优化、电池管理以及性能监控等多个层面。开发者需全面掌握这些技能,以打造出运行流畅、用户体验优秀的Android应用。通过不断...

    Linux 获取CPU和内存的大小

    在Linux操作系统中,监控CPU和内存的使用情况是系统管理员日常任务的重要部分,这有助于优化系统性能、排查问题以及合理分配资源。以下是一些获取CPU和内存大小以及使用率的方法。 **一、CPU信息** 1. **查看CPU...

    \"系统稳定性及性能优化\"分享总结

    本文将基于“系统稳定性及性能优化”的主题进行深入探讨,结合提供的资源——《系统稳定性及性能优化.pdf》文件,来分享相关的知识点。 首先,系统稳定性主要涉及系统在长时间运行过程中的健壮性、容错性和可恢复性...

    美团精选合辑——后台系列1

    文章探讨了Java中的锁机制,包括内置锁、乐观锁、读写锁等,以及在并发编程中的应用,这对于优化多线程程序的性能至关重要。 9. **境外业务性能优化实践** 针对海外市场的业务,美团进行了性能优化,可能涉及网络...

Global site tag (gtag.js) - Google Analytics