目录
(6)如果现场数据库很慢,排查问题可以把数据库导出一份到本地,在本地排查
一、线上问题排查总结
系统资源异常 | ● 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连接的数量,然后对连接数较多的进程逐一排查 |
1、看服务容器是否正常运行 docker ps -a 看下对应的容器状态、启动时间。状态不对或者启动时间在秒级的大多是没起来
2、看一下错误日志. docker logs -f --tail 300 xxxx[应用名]。 找到异常信息,先自己分析一下
3、如果没有报错日志,但是服务运行中突然挂了,大概率是内存满了,查一下内存使用情况,并且看一下操作系统的日志
3.1内存使用情况命令: free -h
3.2查看系统日志的命令: tail -fn 300 /var/log/messages 历史日志看messages-xxx 日期后缀的文件
3.2.1系统日志有no space left on device 表示磁盘满了,看一下[df -h ]磁盘使用情况。 [du . -h --max-depth=1] 追一下是哪个目录占用较大,再针对性清理。如果是开发测试环境[docker rm $(docker ps -aq)]和[docker rmi $(docker images -aq)] 清理一下后再看。
3.2.2 系统日志有oom kill 等字样,则看下[free -h]内存。Linux操作系统在内存不足时,为保障系统正常运行,会主动kill 一个优先级较低的进程
4、如果是中间件(含数据库)连不上, 先从客户端的机器上[telnet ip port] 看下能不能连得上, 确认网络是好的。 如果不行在中间件服务端机器上也执行一下,确认服务本身是可用的。
5、[ps -ef ] 除了可以看运行的进程,还可以看运行的用户,涉及用户权限是可以看一下目标进程是哪个用户运行的
6、[ps -ef ] 第三列是父进程ID, [ps -ef | grep 父进程ID ] 可以看到运行参数。运行参数的workdir可以反查所在的容器
(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堆栈要小心,能不用就不用,免得卡死