`

多线程并发情况下造成cpu 99%排查和分析

阅读更多
问题描述:
生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高。

问题分析:
1,程序属于CPU密集型,和开发沟通过,排除此类情况。
2,程序代码有问题,出现死循环,可能性极大。

问题解决:
1,开发那边无法排查代码某个模块有问题,从日志上也无法分析得出。
2,记得原来通过strace跟踪的方法解决了一台PHP服务器CPU占用高的问题,但是通过这种方法无效,经过google搜索,发现可以通过下面的方法进行解决,那就尝试下吧。

解决过程:
1,根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。

2,找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:
[root@localhost logs]# ps -mp 2633 -o THREAD,tid,time | sort -rn

显示结果如下:
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     10.5  19    - -         -      -  3626 00:12:48
root     10.1  19    - -         -      -  3593 00:12:16

找到了耗时最高的线程3626,占用CPU时间有12分钟了!

将需要的线程ID转换为16进制格式:
[root@localhost logs]# printf "%x\n" 3626
e18

最后打印线程的堆栈信息:
[root@localhost logs]# jstack 2633 |grep e18 -A 30


将输出的信息发给开发部进行确认,这样就能找出有问题的代码。
通过最近几天的监控,CPU已经安静下来了。

具体产生的原因
1.并发情况下 static变量线程不安全发生 多线程同时操作statci变量 该变量是hashmap是非线性安全的在这种情况下 hashmap put的时候进行resize会产生闭环链路 死循环
见http://coolshell.cn/articles/9606.html分析
解决方案:
1.在需要共享的代码块加同步锁 synchronized 同时使用ConcurrentHashMap代替HashMap
分享到:
评论

相关推荐

    java 多线程并发实例

    - volatile:修饰变量,确保多线程环境下的可见性和有序性,但不保证原子性。在实例中,可能用于共享标志的设置与读取。 - wait()、notify()和notifyAll():这些方法存在于Object类中,用于线程间的通信。在线程A...

    多线程并发处理的简单实现

    这种方式提高了线程的效率,因为线程不会在无事可做的情况下浪费CPU时间。 在实际应用中,Python的`concurrent.futures`模块提供了线程池的实现,如`ThreadPoolExecutor`类,可以方便地创建和管理工作者线程。Java...

    多线程并发技术

    在实践中,比如在"实战Java高并发程序设计"课程中,讲师会通过具体的案例分析和代码实战来讲解如何使用这些并发编程的新特性来解决实际问题。这个课程会教授学生如何编写高效的并发代码,如何进行并发调试,以及如何...

    WEBAPI多线程并发测试工具

    **标题与描述解析** ...以上是基于给定信息生成的API测试和多线程并发测试相关的详细知识点,涵盖了从理论基础到实践操作的多个层面。对于开发和维护高质量的Web API服务,这些知识都是必不可少的。

    基于Qt的多线程并发服务器

    "基于Qt的多线程并发服务器"是一个典型的解决方案,它利用了Qt库的强大功能,特别是其对多线程的支持,来处理来自多个客户端的并发请求。下面我们将深入探讨这个主题。 首先,Qt是一个跨平台的应用程序开发框架,...

    Linux下基于socket多线程并发通信的实现.pdf

    本文首先对socket的基本情况进行概述,然后对Linux下基于socket多线程并发通信的编程进行分析,最后提出“Linux下基于socket多线程并发通信的实现”。 在Linux系统中,socket是最基础的操作单元,可以为不同主机...

    并发服务器-多线程服务器详解

    ### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...

    Tesseract OCR多线程并发识别案例

    4. **并发控制**:为了避免多线程间的竞态条件和资源冲突,可能需要使用锁或其他同步机制,如`threading.Lock`。例如,在写入识别结果到文件或数据库时,需要确保同一时刻只有一个线程在操作。 5. **错误处理**:多...

    Java_多线程与并发编程总结.doc

    在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这使得线程间通信更加便捷。Java中的多线程编程则基于这种操作系统级别的并发模型。 Java虚拟机(JVM)为每一个...

    多线程并发编程在Netty中的应用分析

    ### 多线程并发编程在Netty中的应用分析 #### JAVA内存模型与多线程编程 ##### 1.1. 硬件的发展和多任务处理 随着硬件技术的不断进步,尤其是多核处理器的普及及其成本的降低,现代操作系统几乎都具备了支持多...

    java多线程和并发.pdf

    - 在多核CPU环境下,多线程可以充分利用CPU资源,提高程序执行效率。 然而,多线程也引入了新的问题,例如: - 访问冲突和锁竞争可能导致程序执行效率降低。 - 死锁问题的发生可能会让系统进入停滞状态。 - 锁粒度...

    多线程并发服务器(毕业设计)

    在IT领域,多线程并发服务器是网络编程中的一个重要概念,尤其在高并发场景下,如网站、在线游戏和实时数据处理系统等。这个毕业设计的主题是“多线程并发服务器”,采用C++语言实现,这表明我们将在讨论中涵盖C++...

    教你找出 运行java项目,使cpu 100%,如何排查出是哪个jar包的哪个线程导致的

    如果你对`jstack`不熟悉,可以参考CSDN博主的文章,如`jstack_justry_deng的博客-CSDN博客_jstack.url`和`【线上问题排查】CPU100%和内存100%排查_码农BookSea的博客-CSDN博客.url`,这些文章提供了更多关于如何解读...

    多线程并发编程在Netty的应用分析

    《多线程并发编程在Netty中的应用分析》 ...在阅读《多线程并发编程在Netty中的应用分析》这份文档时,建议重点关注Netty的线程模型、事件驱动模型、ByteBuf内存管理以及异步编程机制,这些是理解和应用Netty的关键点。

    多线程,高并发.zip

    在IT领域,多线程和高并发是两个关键概念,特别是在Java编程中,它们对于构建高效、可扩展的系统至关重要。下面将详细解释这两个概念及其在Java中的实现和应用。 多线程是指在一个应用程序中同时运行多个独立的执行...

    Windows下基于socket多线程并发通信的实现

    本文介绍了在Windows 操作系统下基于TCP/IP 协议Socket 套接口的通信机制以及多线程编程知识与技巧,并给出多线程方式实现多用户与服务端(C/S)并发通信模型的详细算法,最后展现了用C++编写的多用户与服务器通信的...

    Python-Python3爬虫系列的理论验证比较同步依序下载多进程并发多线程并发和asyncio异步编程之间的效率差别

    本主题将深入探讨Python3中四种不同的并发模型:同步依序下载、多进程(multiprocessing)、多线程(multithreading)以及asyncio异步编程,并通过理论分析和实际案例对比它们之间的效率差异。 1. 同步依序下载: ...

    C#多线程开发之并发编程经典实例.zip

    11. **死锁与活锁**:死锁是两个或更多线程互相等待对方释放资源,造成无法继续的情况;活锁则是线程不断重试导致无法前进。避免这些情况需要合理设计线程同步策略。 12. **线程异常处理**:主线程不会捕获子线程的...

    C#(Csharp)多线程HTTP并发请求(HttpWebRequest)采集蜘蛛

    7. **性能优化**:通过调整并发请求数量(_reqCount),可以根据服务器的承受能力以及程序的内存和CPU使用情况来优化性能。同时,合理设置超时、重试策略以及错误处理机制也是保证爬虫稳定运行的关键。 总之,C#的多...

Global site tag (gtag.js) - Google Analytics