网站访问突然变慢一系列解决思路

Posted 浮生(FS)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网站访问突然变慢一系列解决思路相关的知识,希望对你有一定的参考价值。

1. 首先看下机器的CPU资源是否过高,如果CPU资源过高会导致网站响应变慢,如果是那么需要看下哪个服务占用了CPU的资源,然后详细排查过高的原因

1) 通过top命令找出占用CPU高的PID

2) 通过ps aux | grep pid 可以进一步确定这个pid运行的是什么服务

3)查看线程列表ps -mp pid -o THREAD,tid,time,观察这个服务的哪几个线程占用了CPU

4) 打印堆栈信息看具体原因jstack pid | grep tid -A 30

2. 查看系统是否存在大量的TIME_WAIT状态的连接,因为这些连接还占用着socket的连接,而如果你的服务器配置的socket连接数不多又恰巧都被TIME_WAIT占用了那就会造成网站假死状态,这个时候需要查下系统配置的TIME_WAIT链接失效时间,如果时间太长了,设置短一点30秒就可以了,然后可以再看下服务器配置的socket连接数是不是不太够。

1) 查看链接状态命令:netstat -an

2) socket链接数tomcat:查看server.xml的acceptCount参数

3) 设置TIME_WAIT失效,不同系统配置方式不同,下面是linux系统为例,需要调整内核参数:/etc/sysctl.conf 

vim /etc/sysctl.conf

添加以下配置文件:

net.ipv4.tcp_syncookies = 1(1表示开启 syn cookies 。当出现 syn 等待队列溢出时,启用 cookies 来处理,可防范少量 syn ***,默认为 0 ,表示关闭)
net.ipv4.tcp_tw_reuse = 1(1 表示开启重用。允许将 time-wait sockets 重新用于新的 tcp 连接,默认为 0 ,表示关闭;)
net.ipv4.tcp_tw_recycle = 1(1 表示开启 tcp 连接中 time-wait sockets 的快速回收,默认为 0 ,表示关闭。)
net.ipv4.tcp_fin_timeout = 30(修改系统默认的 timeout 时间)
修改完毕后执行:/sbin/sysctl -p 让参数生效,调优完成

3. 查看数据库是否有死锁,或者是否有慢查询日志

4. 如果上面都不是,最后只能通过查看各种日志是否有异常信息,看看从日志上能否发现什么端倪

 

最后,如果事情紧急,请直接采用重启大法,先重启看问题是否解决,解决了后面在慢慢查问题,下面是一个比较简单的案例以及排查过程。

 

模拟cpu占用高

新建一个名为jvm-learn的springboot项目

模拟代码如下

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class JvmLearnApplication 

    public static void main(String[] args) 
        SpringApplication.run(JvmLearnApplication.class, args);
    

    @GetMapping("cpu")
    public void cpu() 
        while (true) 
            // 利用死循环来制造cpu飙升的场景
        
    


打包

在项目根目录下执行如下命令:

mvn clean package -Dmaven.test.skip=true

启动jar包

nohup java -jar jvm-learn-0.0.1-SNAPSHOT.jar &

访问

curl localhost:8080/cpu

排查

查看占用cpu高的进程 

top

如下图:可看出PID为7149的java进程占用cpu最高,达到了98%

 查看进程中最耗cpu的子线程

top -p 7149 -H

如下图:可看出PID为7166的线程占用cpu最高,达到了97.7%

将最耗cpu的线程id转换为16进制输出

 printf "%x \\n" 7166

 

 查询具体出现问题的代码位置

jstack 7149 | grep 1bfe -A 30

 如下图:可看出是JVMLearnApplication类的第18行出现问题

 

查询JVM中的大对象top

tomcat线程id=15815
jmap -histo:live 15815 | head -17

class name表示:

[C is a char[]
[S is a short[]
[I is a int[]
[B is a byte[]
[[I is a int[][]

也可以导出一份dump日志,然后利用MAT工具去分析

以上是关于网站访问突然变慢一系列解决思路的主要内容,如果未能解决你的问题,请参考以下文章

asp.net网站外网访问突然变慢,服务器本地访问很快,怎么办?

WordPress响应时间突然变慢了怎么回事

spring boot 做的网站访问隔几秒会慢一次,想不出来是啥问题

个人用户的网站速度变慢,但他们可以切换浏览器?

面试题----网页/应用访问慢突然变慢,如何定位问题

关于电脑突然变慢