这是我参与新手入门的第1篇文章
感谢掘金这次活动,让我有机会可以静下心来开始做“想做却一直没做”的事情 - 写作
背景
相信大家的程序大部分都是运行在服务上,而服务器的系统大部分都是Linux系统
在日常的开发、部署、调试以及线上问题调查过程中或多或少的会遇到一些问题需要定位
本文主要列举一些在平时运维过程中常见的场景以及shell命令,希望可以给大家在Linux运维项目的过程中带来一些帮助
分析思路
当我们的程序在服务器上异常时,主要分为以下三步走
- 程序检查
- 调查服务日志
- 系统资源检查
程序检查
首先我们发现异常后第一步要做的就是检查自己的程序是否是正常的,主要用到一下几个命令
ps命令
ps命令是个比较强大的进程查看命令,用于报告当前系统的进程状态,在日常应用中应该是比较多的,配合管道有很多应用场景
他的对应参数很多,最常用的是搭配aux使用
ps aux
代表显示以用户为主显示机器上所有的程序
-【场景1】查看指定进程信息
ps aux | grep nginx
查看nginx相关的进程信息
-【场景2】查看admin用户运行的进程数量
ps -ef | awk '{if ($1 == "admin") count++} END {print count}'
利用管道结合grep 和 awk可以有很多种操作
dmesg
通过ps 命令我发现我的进程不在了,我也没有主动去kill, 那就可以利用dmesg命令来检查一下
dmesg可以把内核与硬件交互的相关信息打印到终端,能发现一些TCP或硬盘的故障,以及一些程序内存问题
-【场景1】Java程序异常退出了,怎么排查
通过dmesg命令查看是否有内存泄漏问题,系统OOM杀掉了进程
- dmesg 打印时间问题
这个是我实际遇到过也是很多同学在问的问题,就是不会显示时间,这很难区分历史事件和实时事件
可以通过以下方式添加时间
RedHat5 echo 1 > /sys/module/printk/parameters/printk_time
RedHat6echo Y > /sys/module/printk/parameters/time
这样的话我还可以基于dmesg信息按时间增加相关监控,及时发现问题
调查服务日志
在确定服务正常运行,但是运行结果不符合预期,这时候我们就要看一下自己的服务日志了,看是否有error或者warning报出,这就涉及到文件操作, Linux文件操作三板斧:grep, sed, awk
grep命令
文本搜索命令,用于对文本进行检索
- 【场景1】查看匹配文本的上下文
有些error日志我们需要看他的上下文,可以用一下几个参数
grep -B 10 "error" test.log
-A n: 匹配文本的后n行
-B n: 匹配文本的前n行
-C n: 匹配文本的前后各n行 - 【场景2】统计文本出现的数量
grep -c "warining" test.log
输出匹配的数字 - 【场景3】递归查找子目录
grep -nr error ./log/
-r 代表地柜查找当前目录及子目录下包含匹配字符的文件
-n 代表打印匹配后的行数
sed命令
sed主要用来自动编辑一个或多个文件,可以减少重复性的操作
- 【场景1】替换文件中的所有匹配文本
sed -i 's/delete/deleted/g' demo.txt
”s/”表示将”delete”替换为”deleted”,“/g”表示执行全面替换,否则只替换一个
- 【场景2】删除指定内容
删除包含“test”的行
sed -i '/test/d' demo.txt
awk命令
awk是一种编程语言, 也是linux处理文本和数据的一种方式,在我们调查问题的过程中可以结合管道使用。
sed和awk 相关的场景较多,此处先不展开去讲,大家感兴趣的话可以单开一章详细去讲
系统资源检查
如果以上几点都没有定位到问题,那就要从系统资源入手去检查一下是否存在系统层面的问题
CPU
一般常用的几个命令:
#查看系统CPU使用情况
top
#查看cpu的统计信息
pidstat -u 1 -p $pid
#查看cpu使用情况及平均负载
vmstat 1
- 【场景】查看cpu占用前3的程序
ps auxw|head -1;ps auxw|sort -rn -k3|head -3
磁盘
#查看io信息
iotop
#查看磁盘挂载信息
df -h
#查看io的详细信息
iostat -d -x -k 1 10
#查看文件和目录磁盘使用的空间
du -sh ./
内存
#查看内存的整体占用
free -m
#查看内存占用前3的进程
ps auxw | head -1;ps auxw|sort -rn -k4|head -3
#查看虚拟内存状态,以及进程、内存、I/O等系统整体运行状态
vmstat 3 3
#查看进程的内存映像信息
pmap -d $pid
网络
网络问题是Linux中比较难定位的,涉及的干扰因素太多,此处只列举几个较为常用的命令
#网络信息
netstat -s
#查看指定端口所在进程 (解决端口冲突、无法访问等问题)
netstat -anp | grep “:22”
#抓指定协议的报文
tcpdump -nn -c 5 -i eth0 icmp/tcp/udp/http
#监视发往指定主机或端口的报文
tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst X.X.X.X dst port 22
通过以上几步,大部分程序的问题基本上都可以定位到,程序的问题就需要自己去debug调查,系统的问题找相关的OP进行解决
最后附上Linux命令查询网站
时间仓促,很多细节可能没有讲的特别清楚,大家如果感兴趣的话,针对于每个子模块我可以再写文章详细的讲解,多谢理解~
我是爱篮球、爱coding的程序员伍六
关注我,给你带来更多你想看的干货 ❤