由于应用本身、相关组件、运营网络、硬件故障等的原因,线上服务出现问题是常有的事儿,除了日常coding,解决开发、测试、发布、运行等阶段的各种技术问题是每一个开发必备的实战技能。排查出问题并找到根本原因加以解决是一件很有意思的事情。在这里总结一下实际工作中的套路,以便指导自己今后的实践。
排查之前
线上环境出现问题是正常的。随着业务和技术的发展,应用系统已经变得异常复杂,一次用户请求可能要经过不同客户端发送请求、DNS解析、网络、负载均衡、反向代理、服务器(物理机、虚拟机、容器平台)、数据库等。业务复杂一点的可能还要用到各种中间件(消息队列、缓存等),而线上环境为了保证高可用、高效率,又多采用集群、分布式等部署,这都增加了排查问题的难度。这中间哪一个过程出现问题,都可能会导致服务不可用。因此,出现问题后不用慌,保持好的心态,解决问题就行。
首要目标是恢复系统。飞机在发生紧急情况时,飞行员的首要任务是保持飞机飞行,相比保证乘客与飞机的安全着陆,故障定位和排除是次要目标。所以恢复线上系统可用性是首要目标(每一秒损失的都是银子…),而不是立马找到它发生的原因。
排查思路
应用层
- 前、后端应用是否正常运行?
- 应用最近是否有过上线变更操作?
- 软件、硬件环境最近是否有变更?
- 应用日志是否有异常?
- 重启是否能解决问题?(可能会破坏问题现场)
中间件
- 负载均衡是否正常?
- 反向代理日志是否正常?
- 其它组件(查看日志、控制台等)?
数据库层
- 数据库应用是否正常运行?
- 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 | 编辑模式(执行vi 后按i 键)下,删除当前行 |
dG | 编辑模式下,删除当前行之后的所有行 |
:q! | 命令模式(编辑完成后按Esc 键)下,不保存文件并强制退出 |
:wq! | 命令模式下,强制保存文件并退出 |
/1080 | 命令模式下,回车,查找关键字1080,n向前查找,N向后查找 |
其它命令
命令 | 作用 |
---|---|
pwd | 显示当前路径 |
cat /etc/passwd | 查看所有用户 |
lsb_release -a | 查看Linux发行版本 |
passwd root touch /.autorelabel exec /sbin/init |
修改root密码 |
rz 上传(Receive ZMODEM) sz 下载(Send ZMODEM) |
上传下载(需提前安装yum install lrzsz) |
sftp root@127.0.0.1 -oPort=22 | sftp连接远程服务器,-oPort指定端口号 |
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 |
– sid,serial alter system kill session ‘547,36734’; |
杀掉对应进程(‘sid,serial’) |
MySQL
常用语句 | 作用 |
---|---|
SHOW PROCESSLIST; | 查看正在执行的查询进程 |
KILL 3; | 杀掉id=3的进程 |
批量删除MySQL进程
SELECT CONCAT('KILL ', id, ';') FROM information_schema.processlist;
select concat('KILL ',id,';') from information_schema.processlist where user='root' into outfile '/tmp/a.txt';
source /tmp/a.txt;