文章目录
事故一,jvm频繁full gc
- 大对象(运营商数据;数据库查询未加查询条件,结果集过大;第三方接口或异步消息)
- 死循环;
- 大对象;
- String.intern()
- 并发量()
排查方法:
jmap -heap 查看进程jvm的使用情况
jmap -histo pid 统计对象的数量
jmap -dump:live dump堆对象
jstack 快速连续几次输出(建议shellfor循环,sleep 1秒)
jstat -gcutil pid 2
查询是否有慢sql
select * from information_schema.`PROCESSLIST` t where t.INFO is not null ORDER BY t.TIME desc;
针对慢查询sql生产kill语句;
select CONCAT('kill -9 ',t.ID,';') from information_schema.`PROCESSLIST` t where t.INFO is not null ORDER BY t.TIME desc;
统计tcp的数量
netstat -na|grep ESTABLISHED|wc -l
pstree -a|wc -l 统计当前进程总数
ulimit -a 查看用户支持线程数
事故二:内存泄露
内存溢出:程序没有足够的内存使用时,内存溢出后程序基本上就无法正常运行;
内存泄露:当程序不能及时释放内存,导致占用内存逐渐增加,就是内存泄露;
static 常量拼接内容String.intern()
堆外内存,人脸ocr服务,照片上传
事故三:幂等问题
额度重复恢复,推入消息队列,做幂等处理
用户重复下单,临时表,redis分布式锁
事故四:缓存雪崩
- 同一时间大批量到期导致,批量刷入缓存时间,+随机数
事故五:redis链接未释放
- 代码生成器开启事务,导致redis链接未及时释放,无连接可用;
- 缓存共用,keys * ,大对象存储使用导致redis不可用;
事故六:磁盘IO导致线程阻塞,cpu彪高
特征:
- cpu占用过高,gc频繁;
2,发现log4j的线程占用过高;
3,日志文件过大(几十g),同时日志输出延迟;
禁止System.out.println,禁止console输出,日志切割
4,log4j1.* 并发死锁
事故七:无可用线程可创建
1,appuser启动的项目,默认只有1024,通过ulimit查看
2,一台ecs部署多个tomcat,请求量稍微大些的时候会出现该问题
ps:注意下文件句柄数
vim /etc/security/limits.d/90-nproc.conf
appuser soft nproc 10240
appuser hard nproc 10240
事故八:高并发情况下短连接释放过慢
操作系统默认 240 秒后,才会关闭处于 time_wait 状态的连接
vim/etc/sysctl.conf
#编辑文件,加入以下内容:
net.ipv4.tcp_syncookies =1#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse =1#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle =1#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout=30#修改系統默认的 TIMEOUT 时间。
#然后执行以下命令让参数生效
/sbin/sysctl -p
事故九:数据库死锁问题
1,常见高峰期给慢sql添加索引或修改表结构,表锁导致无法insert
事故十:域名劫持
前端h5,引导到联通的广告
更换https
事故十一:宽带资源耗尽
前端访问过慢,10mb带宽升级到100mb
将前端资源都放入到cdn
事故十二: 静态锁导致的并发问题
额度重构,分表后批量生成主键id,静态方法加锁,多线程调用
1,去掉静态方法
2,使用雪花算法
事故十三: tomcat配置问题
- maxPostSize=“0” 之前0为不限制,升级一次tomcat版本到7.0.70,0变为了0;
- 多个tomcat部署到一台实例
tomcat优化:
- nio ;
- 线程池数量& acceptCount ;
- gzip压缩
- catalina.out 日志切割
终极日志切割
vim /etc/logrotate.d/auth
/app/auth/apache-tomcat-8.5.28/logs/catalina.out {
copytruncate
dateext
daily
rotate 10
missingok
notifempty
compress
delaycompress
}
事故十四 数据库
- 多个业务库共用一个实例;->核心业务库独立;
- 慢sql,无索引;
- 修改库表结构时,锁死;
事故十五:redis的key已过期,但还能获取
当redis的cpu过高的时候,定期删除就不一定启动作用;
定期删除& 惰性删除
定期删除: 定期从redis中获取数据,检查并删除,cpu过高时就无法执行,有很大概率能拿到未删除的key
惰性删除:每次get的时候主动去校验
事故十六 同一个用户启动多个dubbo项目;
- dubbo的缓存文件是共享的,同一个用户会导致.dubbo文件被覆盖
事故十七 定时任务中创建线程池;
- 导致资源打满,cpu彪高;
事故十八,默认超时时间 60秒
导致系统群雪崩;
1, 业务板块拆分并独立域名;
2,架构树形化;
事故十九 宽带资源耗尽
外网100mb的宽带
- 静态资源cdn;
- 开启tomcat/ng压缩,增加带宽;