`
youxinrencwx
  • 浏览: 71230 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java应用在多核服务器上压力不均衡问题

 
阅读更多

这篇blog的问题不能算是解决,仅仅只是一种分析和猜测,后续的一些行动可能会证明一些猜想,也可能什么都解决不了。如果有和我相同情况的同学,也知道是什么问题造成的,请不吝赐教。

问题:

上周周末,没有和同事们出去Outing,在家管孩子,去生产环境观察了一下集群机器的当前运行状态,发现应用在这些多核机器上压力极端不均匀。

Top一下大致状态如下:

http://www.flickr.com/photos/33194437@N03/3702676767/(没办法,blog无法上传,引用图片,只好给链接了)

峰值的时候,单CPU的使用率都到了80%,这种情况对于多核服务器来说是很不正常的使用。对于Java的开发者来说,多线程编程是无法控制线程如何在CPU上分配的,因为Java本身不实现线程机制,说是跨平台的语言,但是性能及特性会根据操作系统的实现有很大的差异,因此Java调优有时候需要对系统配置甚至内核作调优。

分析:

首先在测试环境下作了多次同样的压力测试,尝试了与线上一样的操作系统版本,相似的配置,但测试结果却是负载分配很均匀。

http://www.flickr.com/photos/33194437@N03/3703485402/(没办法,blog无法上传,引用图片,只好给链接了)

此时重新启动了一台问题机器,发现负载降下来了,同时也很均衡,也就是说在当前的压力下不应该有这样高的cpu消耗,同时也排除了硬件或者操作系统的一些配置问题。

CPU满负荷的情况下,很多时候会认为应该是循环造成的,对于单个CPU的消耗更是。通过Top H查看具体到底哪一个线程会长时间消耗CPU

http://www.flickr.com/photos/33194437@N03/3702676803/(没办法,blog无法上传,引用图片,只好给链接了)

可以看到PID13659的线程是“罪魁祸首”,但13659究竟在干什么,是应用的线程还是系统的线程,是否是陷入了死循环,不得而知。接着就按照Java的土办法,Kill -3 pid,然后看看输出日志。

根据线程号来查找dump出来的日志中nid,发现这个线程是VM Thread,也就是虚拟机线程。(这里作一下转换,将13659转换成为16进制就是0x355b

http://www.flickr.com/photos/33194437@N03/3703479942/(没办法,blog无法上传,引用图片,只好给链接了)

pstack看了一下这个线程的工作,结果如下:

Thread 2074 (Thread 1846541216 (LWP 13659)):

#00x0659fa65 in ObjectSynchronizer::deflate_idle_monitors ()

#10x065606e5 in SafepointSynchronize::begin ()

#20x06613e83 in VMThread::loop ()

#30x06613a6f in VMThread::run ()

#40x06506709 in java_start ()

#50x00aae3cc in start_thread () from /lib/tls/libpthread.so.0

#60x00a1896e in clone () from /lib/tls/libc.so.6

搜索了一下ObjectSynchronizer::deflate_idle_monitors,发现了sunbug库中有bug关于jdk1.6中由于这个方法导致运行期问题的说法:http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=803cb2d95886bffffffff9a626d3b9b28573?bug_id=6781744

然后就直接去openjdk官方网站去查找这个类的代码,大致了解一下他的作用,具体的代码链接如下:http://xref.jsecurity.net/openjdk-6/langtools/db/d8b/synchronizer_8cpp-source.html
主要工作应该是对资源对象的回收,在加上pstack的结果,应该大致知道是对线程资源的管理。但具体代码就没有进一步分析了。

接着就分析一下自己的应用:

压力测试(高强度、长时间)都做过,没有发现什么异常。

本身应用是否会存在的缺陷导致问题呢。有人说VM Thread兼顾着GC的工作,因此内存泄露,对象长期积压过多也可能影响,但其实在dump的结果可以看到,GC有单独的工作线程,同时我也观察到GC这些线程的工作时间长度,因此由于GC繁忙导致CPU上去,基本上来说可以排除。

其次在SIP项目中使用了JDK的线程池(ExecutorService)LinkedBlockingQueue。后者以前的文章里面提到在1.5版本里使用poll方法会有内存泄露,到1.6虽然没有内存泄露,但是临时锁对象增长的很快,会导致GC的频度增加。

行动:

上面零零散散的一些分析,最终让我决定有如下的行动:

1. 升级某一台服务器的JDK,当前是1.6.0_10-b33,打算升级到1.614版本。比较观察多台机器的表现,看是否升级了JDK可以解决问题。

2. 去除LinkedBlockingQueue作为消息队列,直接由生产者将生产结果按照算法分配给消费者线程,避免竞争,锁的消耗,同时也防止LinkedBlockingQueue带来的资源消耗。

3. 测试环境继续作长时间的压力测试,同时可以结合Jprofile之类的工具来分析长时间后可能出现的问题。

后话:

这年头真的啥都要学一点,求人不如求己。

SA,DBA,测试都需要能够去学习一些,起码在初期排查问题上自己能够做点啥,要不然别人也忙,自己又无从下手。就好比这次压力测试好不容易排上队,但是还是满足不了及时上线的需求,因此自己去LoadRunner压,好歹给出一个零时的报告先大家看着。应用的异常有时候是应用本身设计问题,也可能是开发语言的问题,也可能是操作系统的问题,因此要去定位这种比较复杂的问题,真的需要有耐心去好好的学习各种知识,现在看来知识还是匮乏啊,要不然就可以分析出openjdk中可能存在的问题。

分享到:
评论

相关推荐

    多核技术.rar(内含6个文档)

    Intel作为全球领先的半导体制造商,其多核处理器广泛应用于个人电脑和服务器。文档可能涵盖了Intel的多核架构、缓存系统、能效优化以及如何利用Intel的多核处理器实现高性能计算等内容。 其次,"提高多核处理器线程...

    Java-Thread-Affinity,将Java线程绑定到给定的内核.zip

    - **负载均衡**:在多线程服务器应用中,可以根据核心的负载情况动态调整线程绑定,确保资源的均匀分配。 - **减少竞态条件**:在某些同步问题上,绑定线程到特定核心可以降低竞争同一资源的概率,有助于减少竞态...

    java实现多线程的网络并发服务器.pdf

    多线程服务器可以利用线程池管理线程,快速响应新请求,同时在多核处理器上实现负载均衡,提升系统性能。 3. **任务与分析**: 在这个课程设计中,主要目标是创建一个使用Java编程语言实现的多线程网络服务器。这...

    构建高性能的大型分布式java应用

    它通过在多台服务器之间共享数据,减少了对数据库的访问压力。常见的分布式缓存技术包括Redis、Memcached等。 **7.3 分布式文件系统** 分布式文件系统 (Distributed File System, DFS) 是一种文件管理系统,它能够...

    多线程与多核编程文档

    在计算机科学领域,多线程和多核编程是提高程序执行效率和系统资源利用率的关键技术。随着硬件技术的发展,多核心处理器已经成为主流,这使得并发处理成为可能,从而实现更高效的计算。本文档将深入探讨多线程和多核...

    小豪商城服务器资源

    综上所述,"小豪商城服务器资源"涵盖了从基础设施到应用层的全方位技术栈,涉及服务器硬件、操作系统、Web服务、数据库、缓存、负载均衡、分布式架构、安全防护以及运维自动化等多个层面。这些技术的合理运用和优化...

    Java多线程技术在WebGIS客户端小程序中的应用.zip

    综上所述,Java多线程技术在WebGIS客户端小程序中的应用不仅提升了系统的性能和响应速度,还优化了用户体验,是构建高效WebGIS不可或缺的技术手段。在设计和实现过程中,开发者需要深入理解和熟练掌握Java的多线程...

    高并发高性能服务器

    1. **负载均衡**:通过负载均衡技术,可以将来自不同用户的请求分散到多个服务器上,避免单个服务器过载,确保整体系统的稳定性和响应速度。常见的负载均衡策略有轮询、权重分配、最少连接数等。 2. **缓存机制**:...

    Java并发编程与高并发解决方案-学习笔记-www.itmuch.com.pdf

    3. **负载均衡**:通过负载均衡技术分摊请求到不同的服务器,以分散单个服务器的压力。 4. **异步处理**:利用消息队列等技术将耗时任务异步处理,提高系统的响应速度。 5. **无状态设计**:设计无状态的服务,可以...

    java_如何利用Java开发高性能、高并发Web应用

    在Java世界中,开发高性能、高并发的Web应用程序是一项关键任务,这关乎到系统的稳定性、扩展性和用户体验。本文将深入探讨如何借助Java技术栈来实现这一目标。 首先,选择合适的框架至关重要。Spring Boot是一个...

    Java架构方面面试及学习笔记.rar

    2. **并发多线程**:在多核处理器和高并发环境下,理解Java的并发处理至关重要。Java并发库提供了如ExecutorService、Semaphore、CountDownLatch等工具,学习如何正确使用它们能有效提高系统并发能力。 3. **Dubbo*...

    Java并发编程与高并发解决方案笔记-基础篇.docx

    - **负载均衡**:通过负载均衡器将请求分发到多个服务器,均衡服务端压力。 掌握以上基础知识是Java并发编程和解决高并发问题的关键。在实际开发中,还需要根据具体业务场景灵活运用,并结合性能测试进行调优,以...

    JAVA架构师知识整理.zip_by2kc_jvm_书籍_微服务_架构

    并发处理是Java架构中的另一个重要方面,尤其是在多核处理器环境下。Java提供了丰富的并发工具和API,如线程池、synchronized关键字、volatile变量、Lock接口等,用于构建高效、安全的并发程序。 Netty是一个高性能...

    服务器测试流程.docx

    【服务器测试流程详解】 在IT领域,服务器的测试流程至关重要,因为它确保了系统的稳定性和可靠性。以下是一个详细的服务器测试流程,涵盖了硬件配置、...测试过程中需要注意文档记录,以便分析问题和优化服务器配置。

    JAVA核心面试知识整理.rar

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。为了在Java面试中脱颖而出,了解并掌握核心的Java技术至关重要。这个压缩包"JAVA核心面试知识整理.rar"包含了多个关键主题,让我们逐一...

    sun公司的网络游戏服务器资料

    Sun公司,全称为Sun Microsystems,是一家在20世纪90年代至21世纪初极富影响力的IT企业,尤其以其Java编程语言和强大的服务器硬件而闻名。Sun公司的网络游戏服务器资料是针对那些希望构建和运行在线游戏服务的专业...

    网络游戏-网络社区信息发表时间的更新方法、装置及服务器.zip

    此外,考虑到网络延迟和同步问题,可能还会应用到分布式一致性算法,如Paxos或Raft,确保不同服务器之间的时间戳保持一致,避免出现信息的不一致。同时,为了保证服务的可用性和可扩展性,分布式系统的设计也是关键...

    JAVA+spingcloud+linux教学笔记

    1. **Java**: Java是全球最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。学习Java的基础包括语法、面向对象编程概念(类、对象、继承、封装、多态)、异常处理、集合框架(List、Set、Map)等。进阶...

    nginx应用部署+性能优化

    在现代Web应用开发中,Nginx是一个广泛使用的反向代理服务器和负载均衡器,尤其在Spring Boot应用的部署和性能调优中扮演着关键角色。Spring Boot以其简洁的配置和快速的开发能力,成为了Java开发者首选的微服务框架...

Global site tag (gtag.js) - Google Analytics