- 页面请求,不定时无响应
现象:前端页面,有时会打不开;有时个别请求无返回信息;f12 查看请求,提示“no-referrer-when-downgrade”
分析过程:
1、查看请求对应的服务端是否正常(查看服务器日志),发现服务端对于请求可以正常响应;从前端来看,同一个请求,有时有返回信息,有时无返回信息
2、查看nginx access 日志,发现部分请求返回http 499;同一个uri,有返回http 200 和http 499
3、查看nginx upstream 配置,发现配置中存在一个无效的服务端地址
结论:
nginx 不会检测upstream 中配置的服务器是否有效,当配置了无效的服务端地址时,请求通过nginx 转发到该无效的服务器时,就会造成请求不可用,nginx 会将该请求的响应封装为 http 499
- dubbo 提示线程池已满
现象:dubbo 提示线程池已满;前端显示服务不稳定
分析过程:
1、查看dubbo 服务日志,日志仅显示线程池已满
2、查看服务对应的 error 日志,发现zookeeper 分布式锁有时会释放失败,然后去查看zookeeper 日志,未发现异常
3、阿里云监控报警,数据库CPU 占比超过90%
结论:
查询某列表未使用缓存,导致大量请求(每分钟5W次左右)在短时间内访问数据库(本身查询速度没问题,但是请求量太大),造成数据库瓶颈,并对正常的写业务造成影响,大量对于数据库的访问,都在排队,造成响应时间过长,dubbo服务线程池压满
解决方案:
1、按需对查询增加 redis 缓存,JVM 缓存,nginx 缓存
2、对数据库进行读写分离处理,防止下一次大量请求导致的数据库瓶颈问题
- HttpClient 多线程异常
现象:
java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
原因:多线程状态下,公用一个HttpClient对象,一个请求未结束,再次发起新的请求,就会报这个错
解决方法:
1、低版本的HttpClient,可以使用 ThreadSafeClientConnManager 来代替 BasicClientConnManager
ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager();
cm.setMaxTotal(20);
HttpClient client = new DefaultHttpClient(cm, httpParams);
2、高版本的HttpClient,可以使用 PoolingHttpClientConnectionManager
PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager();
pcm.setMaxTotal(20);
CloseableHttpClient client = HttpClients.custom().setConnectionManager(pcm).build();
- MySql 存储空间清理
数据文件的清理:使用 truncate table_name 来清理数据量多的表
使用delete 的话,不会释放磁盘空间,需要使用:optimize table tab_name 来释放。
注意:optimize 会锁表,应在空闲时期进行处理
select sum(data_length + index_length + data_free) / 1024 / 1024 from information_schema.tables;
查询数据文件所占空间
- 挖矿病毒 minerd
解决方案:
挖矿病毒伪装为 ntp 进程,但正常的ntp进程名为ntpd
rm -rf /var/spool/cron/crontabs
rm -rf ~/.ssh/KHK75NEOiq
rm -rf /opt/KHK75NEOiq33
rm -rf /opt/*
rm -rf /etc/init.d/ntp
rm -rf /usr/sbin/ntp
rm -rf /usr/local/etc
pkill minerd
kill -9 (/usr/sbin/ntp的进程号)
- java 进程CPU和内存分析
1、top 命令查看cpu和内存占用较大的进程pid
2、根据进程pid,查看内部线程占用cpu情况
ps -mp 1316 -o THREAD,tid,time | sort -rn | less
(sort -rn 以数值的方式进行逆序排列)
3、找出占用cpu比较高的TID,需要将TID转换为十六进制,例如:printf "%x\n" 1731,结果 6c3
4、使用 jstack 1316 查看具体对应的线程
5、使用 jstat -gcutil 1316 1000 100 查看jvm内存和gc情况
- zookeeper 数据清理
./bin/zkCleanup.sh -n 50 使用 zookeeper 自带的清理脚本,可清理 log 和 snapshot,-n 50 是指保留50个文件(注意:是log和snapshot各保留50个的意思)
zookeeper 版本在3.4 以上的,也可以在配置中配置自动清理(zoo.cfg):
autopurge.snapRetainCount=50 # 保留50个
autopurge.purgeInterval=72 # 自动清理间隔,单位:小时