今天遇到测试服务器比较卡,调用调用超时,响应很慢,成功率低的问题,然后想着去处理这个问题。

本着开发的精神,摒弃网管的水平,寻找问题的根源。

主要从如下几个方面入手:

1:查询服务器硬件等情况(一般不会)

2:查看网络是否正常,是否因为网络的原因导致服务器缓慢,是否nginx/apache类的代理原因。

3:查询服务器日志是否正常,如果是Tomcat,则看下容器日志是否正常,应用日志是否正常等

4:查询服务器是否正常,本文讲述的是服务器查看方面的情况

排查方法:

一: top命令查询哪些进程导致了服务器处理器及内存使用情况

  top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

  top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.

  比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;

  而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。

一:执行命令,查询哪些进程导致了服务器CPU高或者内存高等问题(下图只是写博客的时候,从服务器中截图,非实时排查的时候的图,图仅供参考)

查询过程中,可以通过此命令,排查是CPU高还是内存高。

如果是CPU高,则看对应的CPU高的进程问题的线程列表。

如果是内存使用高,则看对应内存高的进程的线程列表,定位问题。

top

二:使用top -Hp  pid查询具体的进程中的线程使用情况(本次主要讲解CPU的问题)

       假使上图中的PID为529的JAVA进程占用CPU 比较高,那么我们就需要查询下这个进程下哪个线程占用了高。

可以通过命令top -Hp 529来查询线程列表,列表如下

假如上图中,看到859的线程占用的CPU很高,那么可以看到 PID是 529 ,CPU使用率,内存使用率等

使用在线工具,直接转换 859 转换 为35b  在线进制转换工具

三:杀JavaCore找出对应的线程信息

获取javacore和heapdump文件的方法有两种:
第一种:
系统发生内存溢出,在目录下会生产javacoreheapdump文件生成(最常见的一种)

第二种:
手动触发生成javacoreheapdump文件

kill - 

在某些系统中,可以使用kill -3 来杀进程(部分系统或者容器不支持),获取到JavaCore线程信息,或者使用jstack来获取。

当时的主要发现mysql有较多的locked,所以试着查询资料及继续分析,具体资料如下

at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
- locked <0x00000000a1c98270> (a com.mysql.jdbc.util.ReadAheadInputStream)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3036)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3489)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3478)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4019)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)
at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1398)
- locked <0x00000000a1c753c0> (a com.mysql.jdbc.JDBC4Connection)
at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:856)
- locked <0x00000000a1c753c0> (a com.mysql.jdbc.JDBC4Connection)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322)
- locked <0x00000000a1c753c0> (a com.mysql.jdbc.JDBC4Connection)

四:根据生成的信息,分析CPU使用情况

查询资料及分析当时的情况

分析如下:

1:当时的环境,出现慢SQL的情况,定位发现,查询时间过长,发现SQL触发了性能安全机制,自动加入黑名单中,且数据库线程被自动杀死

2:通过网上的资料原因可能是操作系统bug。

3:解决方案:上网查询相关资料,增加数据库的链接时间,试着增加链接超时时间及stocket时间,进行测试

CPU占用高系统反应慢之问题定位的更多相关文章

  1. C# Winform程序CPU占用高的原因和解决方法

    程序CPU占用高的可能原因: 1.存在死循环: 为什么死循环会导致CPU占用高呢?      虽然分时操作系统是采用时间片的机制对CPU的时间进行管理的,也就是说到了一定时间它会自动从一个进程切换到下 ...

  2. Microsoft(C)注册服务器(32位)CPU占用高

    Microsoft(C)注册服务器(32位)CPU占用高 摘自:https://blog.csdn.net/jtsqrj/article/details/83034252 2018年10月12日 23 ...

  3. 如何在 Linux 中找出 CPU 占用高的进程

    1) 怎样使用 top 命令找出 Linux 中 CPU 占用高的进程 在所有监控 Linux 系统性能的工具中,Linux 的 top 命令是最好的也是最知名的一个.top 命令提供了 Linux ...

  4. 【面试普通人VS高手系列】CPU飙高系统反应慢怎么排查?

    面试过程中,场景类的问题更容易检测出一个开发人员的基本能力. 这不,一个小伙伴去阿里面试,第一面就遇到了关于"CPU飙高系统反应慢怎么排查"的问题? 对于这个问题,我们来看看普通人 ...

  5. 在 Linux 中找出 CPU 占用高的进程

    列出系统中 CPU 占用高的进程列表来确定.我认为只有两种方法能实现:使用 top 命令 和 ps 命令.出于一些理由,我更倾向于用 top 命令而不是 ps 命令.但是两个工具都能达到你要的目的,所 ...

  6. SQLSERVER排查CPU占用高的情况

    SQLSERVER排查CPU占用高的情况 今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高 ...

  7. centos7-java模拟cpu占用高及排查

    环境 centos7 1核2GB Java8 模拟cpu占用高 新建一个名为jvm-learn的springboot项目 模拟代码如下 import org.springframework.boot. ...

  8. SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests 一.查看当前的数据库用户连接有多少 USE ...

  9. 转载:SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的SQL语句 SQL Server 表变量的用法 究竟什么是敏捷测试--朱少民

随机推荐

  1. 手动实现自己的spring事务注解

    spring事务是基于同一个数据连接来实现的,认识到这一点是spring事务的关键,spring事务的关键点便在于在事务中不管执行几次db操作,始终使用的是同一个数据库连接.通过查看源码,我们可以看到 ...

  2. java第一次笔试+面试总结

    今天是自己第一次java笔试和面试,总体感觉比预期好一点. 笔试题第一面是问答题,主要考查java基础,一共有18题,我有6道题没有写出来.第二面主要是算法题,一共有8道题,我大概写出来4道题,第三面 ...

  3. sublime text3上设置 python 环境

    1. 打开Sublime text 3 安装package control 2. 安装 SublimeREPL Preferences -> package control 或者Ctrl+shi ...

  4. python中数组用法

    增加时a.append( 'a ')就可以了.只要按顺序加,就没有问题 . 使用时,完全可以使用下标: 代码如下 复制代码 a[0] a[1] 但出果引用不存在的下标,则会引发异常.这时,你需要先添加 ...

  5. vue-resource发送请求

    <!DOCTYPE html> <html> <head> <title>vue-resource</title> <meta cha ...

  6. Linux建立虚拟ip的方法

    文章来源 运维公会:Linux建立虚拟ip的方法   1.虚拟ip的介绍 虚拟IP地址(VIP) 是一个不与特定计算机或一个计算机中的网络接口卡(NIC)相连的IP地址.数据包被发送到这个VIP地址, ...

  7. Java中关于String类型的一些思考

    作为初学者在学习Java的时候,变量类型是不可避免会遇到的,在以往我们的印象中字符串String都是作为基本类型而存在的,但是在Java中String类型确是一个实实在在的引用类型,是可以通过new关 ...

  8. git命令——git log

    功能 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史. 完成这个任务最简单而又有效的方法是 使用git log 命令. 参数 不带任何参数 $ git log commit ca8 ...

  9. Dotnet站点多个路由对应同一个Action的总结

    需求:有些浏览器会屏蔽带有Ad字样的路径,此时需要创建多个路由指向同一个Action. 例如:原来 : http://lalalalalala.org:1506/api/advert/common   ...

  10. unity协程要点

    使用协程做计时功能应注意 1.协程中用到的组件,变量等被置空前,应该将协程置空 2.置空协程之前应停止协程 3.为了确保同一个协程同时只运行一次,可在协程开始前添加安全代码:判断改协程是否存在,存在则 ...