Linux项目排查命令经验总结
2021/11/8 7:10:16
本文主要是介绍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:进程状态
- -D:不可被唤醒的睡眠状态,通常用于 I/O 情况
- -R:该进程正在运行
- -S:该进程处于睡眠状态,可被唤醒
- -T:停止状态,可能是在后台暂停或进程处于除错状态
- -X:死掉的进程
- -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中
- -<:高优先级
- -N:低优先级
- L:被锁入内存
- -s:包含子进程
- -l:多线程(小写 L)
- -+:位于后台
- 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 秒刷新一次。命令的输出主要分为两部分:
- 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的;
- 第二部分从第六行开始,显示的是系统中进程的信息
内容 | 说明 |
---|---|
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%st | st(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项目排查命令经验总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法