`
chinese.darren
  • 浏览: 101156 次
  • 性别: 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亲和力”设置中获得较好的性能。
分享到:
评论

相关推荐

    Android内核驱动——内存管理

    ### Android内核驱动——内存管理 #### 一、LowMemoryKiller概述 在Android系统中,内存管理是一项至关重要的任务,特别是在资源有限的移动设备上。为了确保系统的稳定性和响应速度,Android内核引入了一种名为`...

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

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

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

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

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

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

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

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

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

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

    【荐】mysql服务性能优化—my.cnf_my.ini配置说明详解(16G内存)

    ### MySQL服务性能优化——my.cnf/my.ini配置详解 #### 背景介绍 本文档旨在详细介绍一套已在生产环境中经过验证、适用于16GB内存环境下的MySQL服务性能优化方案。通过对my.cnf/my.ini配置文件的各项关键参数进行...

    高性能mysql——高清版

    数据库性能监控和定期维护也是确保高性能的关键。监控工具可以帮助管理员实时了解数据库的状态,而定期的维护任务如重建索引、优化表结构、清理日志文件等都是保证数据库长时间稳定运行的必要措施。 10. 高可用性和...

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

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

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

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

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

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

    Tomcat开启JMX功能,使jdk自带的JVisvualVM工具连接JVM,轻松进行性能分析(csdn)————.pdf

    连接成功后,JVisualVM会显示与Tomcat相关的各种监控信息,包括CPU使用率、内存分配、线程状态、类加载情况等。你可以实时查看这些数据,帮助识别和解决性能瓶颈。 总的来说,通过开启Tomcat的JMX功能并利用...

    实战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性能调优监控工具详解

    在Java开发过程中,特别是在企业级应用中,经常会遇到各种性能瓶颈问题,如内存溢出(`OutOfMemoryError`)、内存泄露、线程死锁、锁争用等问题。这些问题如果不能及时有效地解决,不仅会影响系统的稳定性与响应速度...

    线程分析工具jca436.jar

    《IBM线程与监控堆分析器——jca436.jar深度解析》 在Java开发过程中,线程问题一直是困扰开发者的重要难题。死锁、线程挂死等问题可能导致应用程序性能下降,甚至出现系统崩溃。为了解决这些问题,IBM提供了一款...

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

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

Global site tag (gtag.js) - Google Analytics