目录
线上问题排查总结
(1)排查服务器
(2)排查数据库
(3)排查慢sql
(4)排查网速
(5)增加日志打印
(6)如果现场数据库很慢,排查问题可以把数据库导出一份到本地,在本地排查
(7)排查端口占用
注意事项:
一、线上问题排查总结
系统资源异常 | ● CPU占用过高 ● 物理内存富余量极少 ● 磁盘I/O占用过高 ● 发生换入换出过多 ● 网络链接数过多 ● 可以通过top、iostat、vmstat、netstat工具获取到相应情况。 |
内部服务异常 | ● Java堆满 - 使用jstat工具查看Java堆的占用率 ○ Java堆是“Java虚拟机”从操作系统申请到的一大块内存,用于存放Java程序运行中创建的对象。 ○ 当Java堆满或者较满的情况下,会触发“Java虚拟机”的“垃圾收集”操作,将所有“不可达对象”(即程序逻辑不能引用到的对象)清理掉。 ○ 有时,由于程序逻辑或者Java堆参数设置的问题,会导致“可达对象”(即程序逻辑可以引用到的对象)占满了Java堆。 ○ 这时,Java虚拟机就会无休止地做“垃圾回收”操作,使得整个Java程序会进入卡死状态。 ● 日志出现异常信息 ○ 日志中会记录一些异常信息,例如超时、操作失败等信息,其中可能含有系统故障的关键信息。 ● 死锁、死循环、数据结构异常(过大或者被破坏)、集中等待外部服务回应等现象 ○ 可采用jstack工具可以获取可能有用的线索 |
方法总结如下:
(1)排查服务器
系统空间
df -h
free -h
如果是buff/cache占用了大量内存,需要手动释放下:
echo 3 > /proc/sys/vm/drop_caches
free -g | 检查剩余物理内存 |
iostat -d 1 | 检查磁盘I/O情况 |
netstat -aonp | grep tcp| wc -l | 查看各种状态的TCP连接数量和。如果总数较小(例如小于500),则排除连接数占用过多问题 |
netstat -natp|awk '{print $7}' |sort|uniq -c|sort -rn | 按照PID统计TCP连接的数量,然后对连接数较多的进程逐一排查 |
(2)排查数据库
排查数据库服务器,内存占用,磁盘占用
(3)排查慢sql
explain sql
尝试加索引
- 索引优化
- 通过执行计划,查看是否走到索引
(1)索引是否有区分度, 前提是有索引 (单字段索引、联合索引)
(2)是否忽略左匹配原则
(3)采用前缀模糊查询等坏语句
(4)没有做类型转换,导致未走到索引,比如使用$
(5)使用了不等号
(6)大量子查询(多用join,避免临时表)
(7)在where子句中使用表达式操作、函数操作等
1.针对查询条件,尽量在明细表中冗余部分查询条件字段,尽量避免明细表与其他表做关联
2.数据库设计上不允许出现NULL值,使用空字符串替代
3.页面上涉及的查询条件必须设计索引
4.历史有效数据(已删除的数据),定期做数据归档,避免因为无效历史数据占用大量查询
5.连接的时候以小表驱动大表
6.查询出现类型转换,索引失效
7.排序字段需要增加索引
8.SQL语句不要使用<> 会丢失索引
9.统计类数据,不要拿明细数据汇总,应该按照周期(天、周)汇总一些数据,供统计页面使用
10.统计查询类页面,尽量保证接口调用次数少
(4)排查网速
看网络是否畅通,服务器之间是否可以互相访问
(5)增加日志打印
有些问题不好排查,可以增加日志打印信息
(6)如果现场数据库很慢,排查问题可以把数据库导出一份到本地,在本地排查
(7)排查端口占用
netstat -ntlp |grep 9023
lsof -i:9023
kill -9 PID
二、注意事项:
(1)修改线上数据表,脚本修复数据,一定要先备份数据
(2)线上dump堆栈要小心,能不用就不用,免得卡死