线上问题排查总结

目录

线上问题排查总结

(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连接的数量,然后对连接数较多的进程逐一排查

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. 通过执行计划,查看是否走到索引

(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堆栈要小心,能不用就不用,免得卡死

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值