本文主要是介绍网站访问突然变慢一系列解决思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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工具去分析
这篇关于网站访问突然变慢一系列解决思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!