线上环境排查问题的思路与技巧

由于应用本身、相关组件、运营网络、硬件故障等的原因,线上服务出现问题是常有的事儿,除了日常coding,解决开发、测试、发布、运行等阶段的各种技术问题是每一个开发必备的实战技能。排查出问题并找到根本原因加以解决是一件很有意思的事情。在这里总结一下实际工作中的套路(随着经验的增加也会不断更新本文),以便指导自己今后的实践。

排查之前

  1. 线上环境出现问题是正常的。随着业务和技术的发展,应用系统已经变得异常复杂,一次用户请求可能要经过不同客户端发送请求、DNS解析、网络、负载均衡、反向代理、服务器(物理机、虚拟机、容器平台)、数据库等。业务复杂一点的可能还要用到各种中间件(消息队列、缓存等),而线上环境为了保证高可用、高效率,又多采用集群、分布式等部署,这都增加了排查问题的难度。这中间哪一个过程出现问题,都可能会导致服务不可用。因此,出现问题后不用慌,保持好的心态,解决问题就行。

  2. 首要目标是恢复系统。飞机在发生紧急情况时,飞行员的首要任务是保持飞机飞行,相比保证乘客与飞机的安全着陆,故障定位和排除是次要目标。所以恢复线上系统可用性是首要目标(每一秒损失的都是银子…),而不是立马找到它发生的原因。

排查思路

应用层

  • 前、后端应用是否正常运行?
  • 应用最近是否有过上线变更操作?
  • 软件、硬件环境最近是否有变更?
  • 应用日志是否有异常?
  • 重启是否能解决问题?(可能会破坏问题现场)

中间件

  • 负载均衡是否正常?
  • 反向代理日志是否正常?
  • 其它组件(查看日志、控制台等)?

数据库层

  • 数据库应用是否正常运行?
  • telnet端口是否连通?
  • tnsping监听是否正常(连通性、延迟)?
  • 数据库是否存在锁库锁表?
  • 本地、远程执行相应SQL是否正常?

网络层

  • 网络配置最近是否有变更?
  • 服务器间ping的连通性?
  • 网络是否有丢包、延迟过长?
  • traceroute是否正常?

硬件层

  • 联系硬件工程师排查 -_-

常用工具/命令

查看linux服务器CPU、内存、磁盘、网络、应用日志等

命令 作用
top 查看CPU、内存使用率
df -h 查看磁盘使用情况
free -m 查看内存使用情况
ps -ef | grep java 查看java应用进程
curl 123.125.115.110 80 检测本机与123.125.115.110主机上80端口的连通性
nslookup google.com 查看当前服务器是否能解析域名google.com
netstat -nap | grep 12114 查看进程id为12114的应用类型及占用端口号
netstat -nap | grep 3306 查看占用端口3306的应用类型
tail -f albus.log 实时监控日志文件albus.log的内容
cat albus.log | head -n 200 查看日志文件albus.log的最前200行
cat albus.log | tail -n 200 查看日志文件albus.log的最后200行
cat albus.log | grep “error” 返回日志文件albus.log中包含”error”的所有行
find /usr -name ‘mysql’ 查找usr目录下包含关键字mysql的相关内容

linux防火墙

命令 作用
systemctl status firewalld 查看服务器防火墙状态
systemctl start firewalld.service 开启防火墙
systemctl stop firewalld.service 关闭防火墙
systemctl disable firewalld.service 禁止防火墙
firewall-cmd –reload 重启防火墙
firewall-cmd –list-ports 查看服务器上已开放的端口
firewall-cmd –zone=public –add-port=80/tcp –permanent 永久开放80端口
firewall-cmd –zone=public –remove-port=80/tcp –permanent 永久关闭80端口

文件权限修改

命令 作用
sudo chmod -R 777 /var/www/ 设置所用用户在目录/var/www/下可读写、执行
chown -R nginx lib 将lib文件夹的拥有者递归更改为nginx
chgrp -R nginx lib 将lib文件夹(递归)的所属用户组更改为nginx

常用vi命令

命令 作用
dd 编辑模式下,删除当前行
dG 编辑模式下,删除当前行之后的所有行
:q! 命令模式下,不保存文件并强制退出
:wq! 命令模式下,强制保存文件并退出
/1080 命令模式下,回车,查找关键字1080,n向前查找,N向后查找

其它命令

命令 作用
pwd 显示当前路径
cat /etc/passwd 查看所有用户
lsb_release -a 查看Linux发行版本
passwd root
touch /.autorelabel
exec /sbin/init
修改root密码

Oracle锁表

常用语句 作用
select b.owner, b.object_name, a.session_id, a.locked_mode
from v$locked_object a, dba_objects b
where b.object_id = a.object_id;
查看哪些表被锁
select b.username, b.sid, b.serial#, logon_time
from v$locked_object a, v$session b
where a.session_id = b.sid
order by b.logon_time;
查看sid、serial
alter system kill session’1025,41’; 杀掉对应进程(‘sid,serial’)

MySQL锁表

常用语句 作用
SHOW PROCESSLIST; 查看正在执行的查询进程
KILL 3; 杀掉id=3的进程

参考:

你所需要掌握的问题排查知识