Linux教程

Linux项目排查命令经验总结

本文主要是介绍Linux项目排查命令经验总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

网络排查命令

项目部署后得不到预期结果,往往是由于网络故障原因,下面介绍一些网络故障排查命令

ping命令

网络排查第一步,查看对方主机是否存在,毕竟也有可能把ip输错或者把私有地址当成公网ip地址的情况,ping命令用于查看主机网络

用法如下:

ping ip地址

例如

ping 120.25.xxx.xxx
PING 120.25.xxx.xxx (120.25.xxx.xxx) 56(84) bytes of data.//如果只有这一行没有下面的那就是主机网络有问题
64 bytes from 120.25.xxx.xxx: icmp_seq=1 ttl=56 time=26.4 ms
64 bytes from 120.25.xxx.xxx: icmp_seq=2 ttl=56 time=26.4 ms
^C

上面那种输出就是网络可达,否则就是对方主机不存在,提醒最后那个^C就是Ctrl+C可以在shell上终止ping命令,ip也可以换成域名,都是一样的,这里就不演示了

当然ip其实也可以网络测速,可以指定每次给对方主机发的数据包大小,不过很少用,可以自己去了解

telnet命令

此命令用于模拟一个客户端,用于跟服务端进行交互,示例

telnet 120.25.xxx.xxx 8888

120.25.xxx.xxx是一个ip地址,这里换成域名也可以,8888是端口,这个命令不详细介绍,因为有更好用的nc命

nc命令

nc命令即netcat指令,是linux下的一个工具包,需要安装

yum install nc//centos
apt-get install nc//ubuntu

这个命令常用于模拟一个客户端或者模拟一个服务端,用于交互,是开发者最方便的一个工具了,nc命令默认使用TCP协议,如果加上==-u==参数会使用UDP协议

参数

  • -l用于指定nc将处于侦听模式,指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接
  • -s指定发送数据的源IP地址,适用于多网卡机
  • -u指定nc使用UDP协议,默认为TCP
  • -v输出交互或出错信息,调试时尤为有用
  • -w超时秒数,后面跟数字

nc模拟一个服务端

nc -v -l 127.0.0.1 8888

以上命令启动了一个服务端,监听8888端口,ip也可以不输入,默认本机,也可以使用其他公网ip,如果想被外网访问可以使用0.0.0.0或者直接ifconfig命令显示出的私有ip

示例:

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# nc -v -l 127.0.0.1 996
Listening on localhost 996
Connection received on localhost 36262
hmqsb

nc命令模拟一个客户端

nc -v 127.0.0.1 996

连对应ip上的996端口

对应服务端示例:

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# nc -v 127.0.0.1 996
Connection to 127.0.0.1 996 port [tcp/*] succeeded!
hmqsb

文本中发送hmqsb,服务端可以收到,注意ip也可以用域名代替,这个工具包只要对用端口建立了连接nc服务端就能够收到文本信息

nc命令收发文件

nc命令除了可以用来模拟客户端跟服务端还可以用来收发文件,不过发送文件只能是客户端,接收文件只能是服务端

  • 服务端接收文件

    nc -l ip port >文件名
    nc -v -l 12345 > myIndex.html
    
  • 客户端发送文件

    nc ip port <文件名
    nc -v 127.0.0.1 123456 < myIndex.html
    

netstat命令

netstat跟nc命令一样实用,主要用于查看网络连接状态、端口信息等等

参数

  • -a:表示用来显示所有的选项,不使用时,默认不显示LISTEN相关选项
  • -t:表示仅显示跟TCP协议相关的链接
  • -u:仅显示UDP协议相关的选项
  • -n:不显示别名,仅显示数字形式
  • -l:仅显示出处于监听状态的服务
  • -p:显示相关链接的程序名
  • -r:显示路由信息
  • -e:显示扩展信息,例如UID等
  • -s:将各个协议进行统计
  • -c:每隔一段时间固定执行该netstat指令

示例:

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# netstat -anptl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1/init              
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      412/systemd-resolve 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      84393/sshd: /usr/sb 
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      590/nginx: master p 
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      630/mysqld          
tcp        0      0 127.0.0.1:39237         0.0.0.0:*               LISTEN      88589/node          
tcp        0      0 172.19.23.202:51356     100.100.30.26:80        ESTABLISHED 773/AliYunDun       
tcp        0      0 127.0.0.1:57948         127.0.0.1:39237         ESTABLISHED 88501/sshd: root@no 
tcp        0    364 172.19.23.202:22        120.85.135.67:3848      ESTABLISHED 88501/sshd: root@no 
tcp        0      0 172.19.23.202:52290     100.100.45.106:443      TIME_WAIT   -                   
tcp        0      0 127.0.0.1:39237         127.0.0.1:57950         ESTABLISHED 88670/node          
tcp        0      0 127.0.0.1:39237         127.0.0.1:57948         ESTABLISHED 88589/node          
tcp        0      0 127.0.0.1:57950         127.0.0.1:39237         ESTABLISHED 88501/sshd: root@no 
tcp6       0      0 :::3306                 :::*                    LISTEN      630/mysqld          
tcp6       0      0 :::8000                 :::*                    LISTEN      590/nginx: master p 

查看特定的端口示例:

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# netstat -anptl | grep 3306
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      630/mysqld          
tcp6       0      0 :::3306                 :::*                    LISTEN      630/mysqld 

tcpdump网络抓包

tcpdump是网络状况分析和跟踪工具,是可以用来抓包的实用命令,使用前需要对TCP/IP有所熟悉,因为过滤使用的信息都是TCP/IP格式。对标windows系统的Wireshark工具

这个工具很实用也很复杂,本文中如果要写那就很臃肿了,而且我删改了几次发现怎么写都不如这位老哥写得好,这里我就直接偷懒啦

最详细的tcpdump指南

curl命令

这个命令用于模拟http协议请求,我用的其实比较少

基础用法一

curl 某个URL

会将那个URL的内容在shell中显示

GET用法二

curl -X GET https://haokan.baidu.com/v?pd=wisenatural&vid=15447834748877649430

向该服务器获取该请求

POST用法三

curl -X POST -d 'zxdsb' 'https://www.baidu.com/'

向服务器提交post请求,内容为"zxdsb"

主机资源查看命令

ps命令

命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息,ps 命令的基本格式如下

[root@localhost ~]# ps aux
#查看系统中所有的进程,使用 BS 操作系统格式
[root@localhost ~]# ps -le
#查看系统中所有的进程,使用 Linux 标准命令格式

参数

  • a:显示一个终端的所有进程,除会话引线外
  • u:显示进程的归属用户及内存的使用情况
  • x:显示没有控制终端的进程
  • -l:长格式显示更加详细的信息
  • -e:显示所有进程

大家如果执行 “man ps” 命令,则会发现 ps 命令的帮助为了适应不同的类 UNIX 系统,可用格式非常多,不方便记忆。所以,我建议大家记忆几个固定选项即可。比如:

  • “ps aux” 可以查看系统中所有的进程
  • “ps -le” 可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级
  • “ps -l” 只能看到当前 Shell 产生的进程

记住以上三者即可,个人喜欢下面这么用

[root@localhost ~]# ps -le
F S UID PID PPID C  PRI Nl ADDR  SZ WCHAN TTY      TIME  CMD
4 S   0   1    0 0  80   0 -    718 -     ?    00:00:02  init
1 S   0   2    0 0  80   0 -      0 -     ?    00:00:00  kthreadd
1 S   0   3    2 0 -40   - -      0 -     ?    00:00:00  migration/0
1 S   0   4    2 0  80   0 -      0 -     ?    00:00:00  ksoflirqd/0
1 S   0   5    2 0 -40   - -      0 -     ?    00:00:00  migration/0

解释下上面的列信息

  • F:进程标志,说明进程的权限,常见的标志有两个
    • 1:进程可以被复制,但是不能被执行
    • 4:进程使用超级用户权限
  • S:进程状态
    1. -D:不可被唤醒的睡眠状态,通常用于 I/O 情况
    2. -R:该进程正在运行
    3. -S:该进程处于睡眠状态,可被唤醒
    4. -T:停止状态,可能是在后台暂停或进程处于除错状态
    5. -X:死掉的进程
    6. -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中
    7. -<:高优先级
    8. -N:低优先级
    9. L:被锁入内存
    10. -s:包含子进程
    11. -l:多线程(小写 L)
    12. -+:位于后台
  • UID:运行此进程的用户的 ID
  • PID:进程的 ID
  • PPID:父进程的 ID
  • C:该进程的 CPU 使用率,单位是百分比
  • PRI:程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行
  • NI:进程的优先级,数值越小,该进程越早被执行
  • ADDR:该进程在内存的哪个位置
  • SZ:该进程占用多大内存
  • WCHAN:该进程是否运行。"-"代表正在运行
  • TTY:该进程由哪个终端产生
  • TIME:该进程占用 CPU 的运算时间,注意不是系统时间
  • CMD:产生此进程的命令名

ps往往还跟grep一起使用,大家会发现在很多时候都会遇到grep这个指令,这个指令其实是一个管道,重定向输出到shell,让用户能够看到相关的输出,如果大家遇到这种情况

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# ps aux | grep xxx
root       89874  0.0  0.0   8900   660 pts/2    S+   17:19   0:00 grep --color=auto xxx

有个grep --color=auto xxx这么一个东西,这一行是grep本身带来的,如果没有其他xxx的行,那就代表当前系统没有跟xxx有关的进程

top命令

如果我现在有这么一种需求,我要看Linux下系统所有进程的情况,比如CPU使用率、内存等等,类似于window下的任务管理器,那么怎么办呢?可以说top就是Linux下的任务管理器。并且注意下ps命令虽然也可以观看某个进程情况,但ps不是实时的,只有top可以实时观察.

浅谈下经验,CPU使用率超过100%有可能是该进程有问题,也有可能是正常现象,比如mysql里面有多个线程,每个线程有占用着一个CPU,200%也是正常的,但是这并不意味着这就是可以忽略的,有可能是数据库没有优化造成的,关于CPU使用率的计算,这个要结合下平均负载

top命令格式及参数

[root@localhost ~]#top [选项]

选项:

  • -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒
  • -b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中
  • -n 次数:指定 top 命令执行的次数。一般和"-"选项合用
  • -p 进程PID:仅查看指定 ID 的进程
  • -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误
  • -u 用户名:只监听某个用户的进程

在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作,这句话就是说top运行时可以键盘直接按以下命令

  • ? 或 h:显示交互模式的帮助
  • P:按照 CPU 的使用率排序,默认就是此选项
  • M:按照内存的使用率排序
  • N:按照 PID 排序
  • T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序
  • k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号
  • r:按照 PID 给某个进程重设优先级(Nice)值
  • q:退出 top 命令
[root@localhost ~]# top
top - 12:26:46 up 1 day, 13:32, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 95 total, 1 running, 94 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.1%sy, 0.0%ni, 99.7%id, 0.1%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 625344k total, 571504k used, 53840k free, 65800k buffers
Swap: 524280k total, 0k used, 524280k free, 409280k cached
PID   USER PR NI VIRT  RES  SHR S %CPU %MEM   TIME+ COMMAND
19002 root 20  0 2656 1068  856 R  0.3  0.2 0:01.87 top
1     root 20  0 2872 1416 1200 S  0.0  0.2 0:02.55 init
2     root 20  0    0    0    0 S  0.0  0.0 0:00.03 kthreadd
3     root RT  0    0    0    0 S  0.0  0.0 0:00.00 migration/0
4     root 20  0    0    0    0 S  0.0  0.0 0:00.15 ksoftirqd/0
5     root RT  0    0    0    0 S  0.0  0.0 0:00.00 migration/0
6     root RT  0    0    0    0 S  0.0  0.0 0:10.01 watchdog/0
7     root 20  0    0    0    0 S  0.0  0.0 0:05.01 events/0
8     root 20  0    0    0    0 S  0.0  0.0 0:00.00 cgroup
9     root 20  0    0    0    0 S  0.0  0.0 0:00.00 khelper
10    root 20  0    0    0    0 S  0.0  0.0 0:00.00 netns
11    root 20  0    0    0    0 S  0.0  0.0 0:00.00 async/mgr
12    root 20  0    0    0    0 S  0.0  0.0 0:00.00 pm
13    root 20  0    0    0    0 S  0.0  0.0 0:01.70 sync_supers
14    root 20  0    0    0    0 S  0.0  0.0 0:00.63 bdi-default
15    root 20  0    0    0    0 S  0.0  0.0 0:00.00 kintegrityd/0
16    root 20  0    0    0    0 S  0.0  0.0 0:02.52 kblockd/0
17    root 20  0    0    0    0 S  0.0  0.0 0:00.00 kacpid
18    root 20  0    0    0    0 S  0.0  0.0 0:00.00 kacpi_notify

我们解释一下命令的输出。top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。命令的输出主要分为两部分:

  1. 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的;
  2. 第二部分从第六行开始,显示的是系统中进程的信息
内容说明
12:26:46系统当前时间
up 1 day, 13:32系统的运行时间.本机己经运行 1 天 13 小时 32 分钟
2 users当前登录了两个用户
load average: 0.00,0.00,0.00系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数)
Tasks: 95 total系统中的进程总数
1 running正在运行的进程数
94 sleeping睡眠的进程数
0 stopped正在停止的进程数
0 zombie僵尸进程数。如果不是 0,则需要手工检查僵尸进程
Cpu(s): 0.1 %us用户模式占用的 CPU 百分比
0.1%sy系统模式占用的 CPU 百分比
0.0%ni改变过优先级的用户进程占用的 CPU 百分比
99.7%id空闲 CPU 占用的 CPU 百分比
0.1%wa等待输入/输出的进程占用的 CPU 百分比
0.0%hi硬中断请求服务占用的 CPU 百分比
0.1%si软中断请求服务占用的 CPU 百分比
0.0%stst(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比
Mem: 625344k total物理内存的总量,单位为KB
571504k used己经使用的物理内存数量
53840k&ee空闲的物理内存数量。我们使用的是虚拟机,共分配了 628MB内存,所以只有53MB的空闲内存
65800k buffers作为缓冲的内存数量
Swap: 524280k total交换分区(虚拟内存)的总大小
Ok used已经使用的交换分区的大小
524280k free空闲交换分区的大小
409280k cached作为缓存的交换分区的大小

我们通过 top 命令的第一部分就可以判断服务器的健康状态。如果 1 分钟、5 分钟、15 分钟的平均负载高于 1,则证明系统压力较大。如果 CPU 的使用率过高或空闲率过低,则证明系统压力较大。如果物理内存的空闲内存过小,则也证明系统压力较大。

这时,我们就应该判断是什么进程占用了系统资源。如果是不必要的进程,就应该结束这些进程;如果是必需进程,那么我们该増加服务器资源(比如増加虚拟机内存),或者建立集群服务器。

top例一

如果只想让 top 命令查看某个进程,就可以使用 “-p 选项”。命令如下:

[root@localhost ~]# top -p 15273
#只查看 PID为 15273的apache进程
top - 14:28:47 up 1 day, 15:34, 3 users, load average: 0.00,0.00,0.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 625344k total, 574124k used, 51220k free, 67024k buffers
Swap: 524280k total, Ok used, 524280k free, 409344k cached
PID   USER PR NI VIRT  RES SHR S %CPU %MEM  TIME+  COMMAND
15273 daemon 20 0  4520 1192 580 S  0.0  0.2 0:00.00   httpd

top例二

[root@localhost ~]# top
top - 14:10:15 up 1 day, 15:15, 3 users, load average: 0.00,0.00, 0.00
Tasks: 97 total, 1 running, 96 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 625344k total, 574248k used, 51096k free, 66840k buffers
Swap: 524280k total, Ok used, 524280k free, 409324k cached
PID to kill:15273
//按"k"键,会提示输入要杀死进程的PID
PID     USER PR NI VIRT  RES SHR S %CPU %MEM   TIME+ COMMAND
15273 daemon 20  0 4520 1192 580 S  0.0 0.2  0:00.00 httpd
..省略部分输出...

top例三

如果在操作终端执行 top 命令,则并不能看到系统中所有的进程,默认看到的只是 CPU 占比靠前的进程。如果我们想要看到所有的进程,则可以把 top 命令的执行结果重定向到文件中。不过 top 命令是持续运行的,这时就需要使用 “-b” 和 “-n” 选项了。具体命令如下:

[root@localhost ~]# top -b -n 1 > /root/top.log
//让top命令只执行一次,然后把执行结果保存到top.log文件中,这样就能看到所有的进程了

lsof命令

lsof命令是一种查看进程的打开的句柄的命令,所谓句柄就是文件描述符,打开文件需要一个文件描述符,建立一个socket也需要,同一抽象为fd。通过该命令可以详细到被打开fd的路径

查看所有被打开的fd

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# lsof | more
COMMAND     PID   TID TASKCMD              USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
systemd       1                            root  cwd       DIR              252,1     4096          2 /
systemd       1                            root  rtd       DIR              252,1     4096          2 /
systemd       1                            root  txt       REG              252,1  1599584    1194953 /usr/lib/systemd/systemd
systemd       1                            root  mem       REG              252,1  1369352    1182665 /usr/lib/x86_64-linux-gnu/libm-2.31.so
systemd       1                            root  mem       REG              252,1   174272    1179993 /usr/lib/x86_64-linux-gnu/libudev.so.1.6.17
//.....省略输出

查看指定进程fd

例如我查看nginx进程,可以通过grep进行过滤

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# lsof -i | grep nginx
nginx       590            root    6u  IPv4  19327      0t0  TCP *:8000 (LISTEN)
nginx       590            root    7u  IPv6  19328      0t0  TCP *:8000 (LISTEN)
nginx       592        www-data    6u  IPv4  19327      0t0  TCP *:8000 (LISTEN)
nginx       592        www-data    7u  IPv6  19328      0t0  TCP *:8000 (LISTEN)

也可以使用PID

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# lsof -p 590
COMMAND PID USER   FD   TYPE       DEVICE SIZE/OFF    NODE NAME
nginx   590 root  cwd    DIR        252,1     4096       2 /
nginx   590 root  rtd    DIR        252,1     4096       2 /
nginx   590 root  txt    REG        252,1  1195152 1204977 /usr/sbin/nginx
nginx   590 root  mem    REG        252,1   180792 1446940 /usr/lib/nginx/modules/ngx_stream_module.so

==注意:==lsof命令只能查看当前用户有权限查看的进程fd信息,如果没有权限,会显示"Permission denied"

pidstat

pidstat用于监控或者指定进程占用的系统情况,包括CPU、内存、磁盘IO、线程切换线程数等等信息

  • -u:查看CPU相关性能
  • -w:查看上下文切换情况
  • -t:查看线程相关信息,通常跟w一起使用
  • -d:展示磁盘IO展示情况
  • -p:指定进程号
pidstat -urdtd -p 996//996是一个进程id

iostat查看IO状态

该命令用于监控CPU占用率、平均负载值及I/O读写速度等

root@iZbp1ge69gbpc9zmsq837oZ:/Code/goproject/src# iostat 
Linux 5.4.0-47-generic (iZbp1ge69gbpc9zmsq837oZ)        11/07/2021      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.48    0.00    0.34    0.01    0.00   99.17

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               0.50         0.71         4.10         0.00     687947    3970161          0

CPU数据表格

内容说明
%user用户进程消耗cpu的比例
%nice用户进程优先级调整消耗的cpu比例
%system系统内核消耗的cpu比例
%iowait等待磁盘io所消耗的cpu比例
%steal当虚拟处理器监视器在服务其他虚拟处理器时当前当前处理器非自愿等待的时间
%idle闲置cpu的比例(不包括等待磁盘I/O)

磁盘统计参数表格

内容说明
tps该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输"意思是"一次I/O请求”
kB_read/s每秒从设备(drive expressed)读取的数据量
kB_wrtn/s每秒向设备(drive expressed)写入的数据量
kB_dscd/s设备每秒的丢区数
kB_read读取的总数据量
kB_wrtn写入的总数量数据量,这些单位都为Kilobytes
kB_dscd设备丢区总数
这篇关于Linux项目排查命令经验总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!