美文网首页架构设计@工程设计@服务稳定性之路
内网系统修改密码引起的线程阻塞问题解析

内网系统修改密码引起的线程阻塞问题解析

作者: spring_coderman | 来源:发表于2019-08-26 16:02 被阅读0次

背景:

随着内网单设备登录的推广,顺便解决了扫码登录不改密码的问题,但是经过上线之后很多人集中修改了密码,并发不高但是依然对后端产生了一定的冲击和影响。

现象:

登录的web系统调用后端登录服务超时,且收到钉钉报警。用户修改密码之后无法登录gitlab相对严重。

服务依赖路径:

登录 web→登录的后端服务-->同步ldap服务器的服务→ldap服务器

现场保留&问题分析:

由于修改密码会触发同步到ldap服务器的操作,所以没有直接看登录相关工程的日志,直接到同步ldap服务器的服务的日志里面查看,发现controller代码中只有打印入参,没有出参,说明线程出现阻塞了。

1.使用命令查看服务器现状:top
2.使用命令查看同步ldap服务器的服务的进程id:ps -ef | grep ldap
3.使用命令查看同步ldap服务器的服务的线程运行情况: top -H -p pid
以上均未发现CPU,内存占用特别高的情况,推测可能是由于线程出现阻塞导致无法响应请求,使用下面的命令查看所有线程堆栈状态:

  1. sudo jstack -l pid
    发现大量BLOCKED状态的线程:


    {69A1680B-674C-4BB8-860E-80A66F482695}_20190826160044.jpg

    5.根据日志和分析可知由于连接Ldap服务器超时或者迟迟无响应导致线程阻塞,进而上游无法响应用户,出现问题。根据代码和场景可知连接ldap服务器操作完之后会释放,所以不能做长连接或者连接池优化处理。

临时方案:

重启线上服务,出问题用户重新修改密码可正常登录gitlab。

目前状态:

已对登录 服务后端工程调用 同步ldap服务器的服务工程的代码做异步处理,解决超时问题。

下一步方案:

说明:由于这个问题之前就出现过,在别的服务中做过类似优化,因为ldap服务器无法快速响应调用方,导致超时报错,线程阻塞,正常情况下大概能支持的量是1分钟2-4个调用量。
1.联系运维查找ldap链接问题
2.调用方做异步定时+限流处理,也就是说异步仅仅解决了登录web工程→登录后端工程的超时问题,但是如果同时有超过20个人在1分钟内发起修改密码则可能会导致这种情况出现。
线程状态相关:https://www.cnblogs.com/zyhxhx/p/4564953.html

思考

1.使用命令查看进程内线程数量
pstree -p pid |wc -l
2.使用命令查看进程内线程栈情况
jstack -l pid
3.使用命令查看进程内线程状态分布

 jstack -l pid  |  grep 'java.lang.Thread.State' | awk '{print $2 $3 $4 $5}' | sort | uniq -c

4.通过上面的命令就可以在服务无响应的时候发现进程内线程状态,帮助定位问题
5.出现这种情况是否可以进行报警呢,比如3中的命令结果如下:
12 RUNNABLE
15 TIMED_WAITING(onobjectmonitor)
8 TIMED_WAITING(parking)
3 TIMED_WAITING(sleeping)
3 WAITING(onobjectmonitor)
12 WAITING(parking)

没有BLOCKED,如果有的话超过一定值是否可以报警呢?

相关文章

  • 内网系统修改密码引起的线程阻塞问题解析

    背景: 随着内网单设备登录的推广,顺便解决了扫码登录不改密码的问题,但是经过上线之后很多人集中修改了密码,并发不高...

  • 线程池解析第一章-源码解析

    线程池解析第一章-源码解析线程池解析第二章-线程池源码问题总结 线程池基本介绍 为什么要使用线程池 对于系统和服务...

  • 关于Android线程与Handler的理解。

    概述 我们都知道,更新UI只能在主线程中操作,若是在子线程中访问UI控件,容易引起阻塞。问题来了,什么是主线程,什...

  • 深入分析 Java 乐观锁

    前言 激烈的锁竞争,会造成线程阻塞挂起,导致系统的上下文切换,增加系统的性能开销。那有没有不阻塞线程,且保证线程安...

  • Java-token

    token基础 生成token 解析token 问题 : 在退出登录 / 修改密码时怎样实现JWT Token失效...

  • 6.技术-mysql(六)-MVCC(多版本控制)实现

    一.背景 数据库为了实现读写并行,也就是说某一行数据在修改的时候会阻塞其他线程修改但不会阻塞读,其他线程还可以...

  • 真正理解NIO

    前言 高并发量引起的问题 一个使用传统阻塞I/O的系统,如果还是使用传统的一个请求对应一个线程这种模式,一旦有高并...

  • swift报错Fatal error: UnsafeMutabl

    这个问题是由多个线程同时修改数组引起的,是个线程安全问题。 解决办法: 1.修改数组在同步队列中 let queu...

  • 《2.6密码修改界面功能设计》

    (1)密码修改界面功能的效果图: (2)密码修改界面功能的描述 进入系统,通过点击“修改密码”,然后在密码修改界面...

  • 如何分析ANR Log的总结

    引起ANR问题的根本原因,总的来说可以归纳为两类: 应用进程自身引起的,例如:主线程阻塞、挂起、死循环应用进程的其...

网友评论

    本文标题:内网系统修改密码引起的线程阻塞问题解析

    本文链接:https://www.haomeiwen.com/subject/rocdectx.html