1. 前言
本文记录linux中排查问题时常用的shell命令,备忘。
相关文档:《shell命令之系统管理》
2. 查看资源使用情况
2.1. 查看CPU负载
1 | top |
一个逻辑CPU可以处理一个线程,一般当 load average 超过逻辑CPU数量的70%,就可以认为 CPU 的负载较高。
2.2. 查看内存占用
查看内容总的占用情况
1 | free -h |
查看哪个进程占用内存较多
1 | top # 然后输入大写的M |
2.3. 查看磁盘空间占用
1 | du -sh * # 不包含隐藏文件 |
2.4. 查看磁盘空间占用(快速版)
当文件比较多时,du执行速度太慢,这时可以使用它的升级版ncdu(NCurses Disk Usage)
1、安装ncdu
1 | yum install -y ncdu |
ncdu二进制安装方法
1 | # wget https://dev.yorhel.nl/download/ncdu-2.2.1.tar.gz |
2、扫描指定目录磁盘空间占用
1 | ncdu /home/voidking |
3、全局扫描磁盘空间占用
1 | ncdu / --exclude=/data/mntnfs |
等到扫描结束后,通过上下按键和Enter按键,可以查看每一个目录的磁盘空间占用情况。
2.5. 查看磁盘IO负载
1 | iostat -x |
在iostat命令的输出中,磁盘IO请求队列长度对应的是avgqu-sz字段,表示平均每秒的I/O请求队列长度。它可以用来判断系统的磁盘IO瓶颈情况,如果该值超过了磁盘的最大IO队列长度,就说明磁盘IO请求队列积压了,系统IO性能可能会受到影响。
一般来说,当avgqu-sz值超过1时,就可能会有IO瓶颈的风险。
2.6. 查看进程的磁盘IO
1 | iotop |
iotop工作方式非常类似于 top 命令,但它专门对 I/O 进行监控。
iotop 可以为运行中的进程提供实时的磁盘I/O报告,并且通过报告每个进程/线程的磁盘I/O使用情况,帮助我们找出哪个进程/线程在导致磁盘I/O的相关问题。
2.7. 记录进程的磁盘IO
使用 iotop 可以查看进程的磁盘IO,但是,这种查看是实时的,阅后即无。
如果想要记录进程的磁盘IO,可以配置使用一些监控工具,不过会比较复杂。
最简单的记录方法,是将 iotop 的结果输出到控制台,然后重定向存储到文件。
同时,因为 iotop 命令是一个持续命令,随意需要配合 timeout 来使用。
例如,如果我们需要记录60s内的数据,那么命令为:
1 | timeout 60 iotop -botqqq > iotop_output.txt |
如果需要长时间记录,可以使用定时任务:
1 | * * * * * timeout 3 iotop -botqqq > /data/iotop/iotop-`date +\%Y\%m\%d\%H\%M\%S`.log |
3. 查看网络情况
3.1. 查看网络负载
1 | iftop |
详情参考《iftop命令》
3.2. 查看会话数
1 | ss |
输出示例:
1 | State Recv-Q Send-Q Local Address:Port Peer Address:Port |
- State: 显示套接字的状态,比如 LISTEN 表示正在监听连接,ESTAB 表示连接已经建立。
- Recv-Q: 接收队列的大小。
- Send-Q: 发送队列的大小。
- Local Address:Port: 本地 IP 地址和端口号。
- Peer Address:Port: 远程 IP 地址和端口号。
3.3. 查看本机IP地址
1、查看本机当前namespace所有IP地址ifconfig
或者 ip address
2、获取某个网卡的IP地址ifconfig eth0 | awk 'NR==2{print $2}'
3.4. 查看外网出口IP
curl myip.ipip.net
3.5. 查看局域网所有IP
需求:查看当前局域网已经分配的IP,已知局域网为192.168.56.0/24
1、通过扫描更新arp缓存
1 | # 执行快,但是某些情况下无法更新arp缓存 |
2、查看本地arp缓存
1 | cat /proc/net/arp | awk '{print $1}' | grep '192.168' | sort |
3.6. 根据IP排序
需求:/proc/net/arp中的内容,根据IP进行排序
1 | cat /proc/net/arp | grep 192.168.56 | sort -t'.' -k1n,1 -k2n,2 -k3n,3 -k4n,4 |
3.7. 测试mtu值
MTU是Maximum Transmission Unit的缩写,表示最大传输单元,MTU的单位是字节。大部分网络设备的MTU都是1500。
把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率。
把数据包长度加上数据包头28字节,就得到MTU的值。
1 | ping -c 3 -s 1472 -M do www.baidu.com |
3.8. 带宽测试
1、安装测试工具iperf
1 | yum install -y iperf |
2、启动iperf服务端
1 | iperf -s |
3、使用iperf客户端测试网速
1 | iperf -c 192.168.56.112 -i 3 |
4. 查看进程和端口
4.1. 查看进程和线程
1 | # 查看所有进程 |
4.2. 根据端口找进程
已知端口号(例如22),怎样查找对应的进程(PID)?怎样找到该进程启动命令?
方法一:使用lsof
1 | lsof -i:22 |
方法二:使用netstat
1 | netstat -nlp | grep ":22" |
4.3. 查看端口是否可以正常连接
1 | nc -v 192.168.56.101 8080 |
4.4. 查看进程资源占用
1、查看进程的实时资源占用
1 | top -p 12234 |
2、查看进程从启动到此刻的资源占用平均值
1 | ps aux | grep 12345 |
参考文档:
4.5. 根据TCP连接查找进程
redis主机(192.168.56.101),redis连接数被用完了。
1 | 127.0.0.1:6379> info clients |
查看哪些主机在连接redis主机:
1 | netstat -ano | grep 6379 |
发现一台 192.168.56.102 有大量的连接。
登录 192.168.56.102 主机,执行:
1 | lsof -i @192.168.56.101:6379 |
找到连接redis的具体的进程。
5. 查看日志
5.1. 查看系统日志
1 | dmesg -T |
dmesg用于显示内核环境下的系统日志,包括内核启动时的信息、硬件检测信息、内核模块加载信息、内核错误等。通常用于诊断系统启动和运行时出现的问题。dmesg命令显示的日志信息来自系统内核环缓冲区,因此是最新的系统日志。
journalctl -xb
命令用于查看 systemd 日志,输出系统启动时的所有日志信息,包括内核消息、系统服务和应用程序的日志信息。其中,-x 参数显示完整的日志信息,-b 参数表示显示系统启动时的日志信息。
通过 journalctl -xb
命令,可以查看系统启动时的各个服务启动情况,应用程序启动情况,以及其他系统级别的消息。可以用来诊断系统启动过程中的错误和问题。
更多journalctl的用法,参考文档《systemctl命令》。
5.2. 查看重启前的系统日志
/var/log目录下存在dmesg日志文件:
1 | dmesg |
dmesg 日志文件中保存的是本次重启后的日志,而 dmesg.0 是这次重启前的 dmesg 日志,dmesg.1.gz 是上次重启前的 dmesg 日志,依次类推。
1 | journalctl -k -b -1 |
5.3. 查看OOM日志
方法一:
1 | dmesg -T |
方法二:
1 | grep "Out of memory" /var/log/messages |
方法三:
1 | egrep -i -r 'killed process' /var/log |
参考文档:Linux进程被杀掉(OOM killer),查看系统日志
6. 检查磁盘和文件系统
6.1. 测试磁盘读写性能
测试读取性能:
1 | dd if=/path/to/testfile of=/dev/null bs=1M count=1000 |
从 /path/to/testfile 测试文件中读取数据并将其丢弃,将结果输出到/dev/null,以避免干扰测试。bs=1M指定每个数据块的大小为1MB,count=1000指定要读取的数据块数量。
测试写入性能:
1 | dd if=/dev/zero of=/path/to/testfile bs=1M count=1000 conv=fdatasync |
将/path/to/testfile替换为要进行测试的文件路径,bs=1M和count=1000指定了数据块的大小和数量,conv=fdatasync确保数据同步写入磁盘。
6.2. 修复文件系统
fsck(file system check)是一个用于检查和修复文件系统中错误的命令。它可以检测和修复文件系统中的逻辑错误、链接错误、磁盘损坏、超级块错误等。fsck通过扫描文件系统和相关数据结构,以确定文件系统的状态,并尝试修复错误。它可以改善文件系统的健康状态和性能,并保护用户数据。
文件系统出错时的表现:
- 系统无法启动。
- 系统上的文件损坏(通常您可能会看到输入/输出错误)。
- 连接的驱动器(包括闪存驱动器/SD 卡)未按预期工作。
1、卸载挂载
1 | umount /dev/sdb |
2、检查并修复文件系统
1 | fsck -y /dev/sdb |
6.3. 检测磁盘坏扇区
badblocks是一个用于检测坏磁盘扇区的命令。它通过扫描磁盘或磁盘分区,并标记坏扇区。坏扇区可能会导致数据丢失或读写错误,因此通过badblocks命令可以帮助识别和排除这些扇区。badblocks可以在文件系统创建之前或之后使用,以确保磁盘或分区没有坏扇区。
1、检测整个磁盘并输出到文件
1 | badblocks -s -v -o /root/bb-sdb.log /dev/sdb |
如果报错:badblocks: Value too large for defined data type invalid end block (15625879552): must be 32-bit value
那么需要修改命令为:
1 | badblocks -b 5120 -s -v -o /root/bb-sdb.log /dev/sdb |
-b
参数默认为512,意思为512字节一扇区,对于大硬盘需要把这个参数修改为5120,那么就能顺利执行了。最后得到的结果也要除以10,就是真正的坏道位置了。
2、暴力写测试整个磁盘
1 | badblocks -s -w /dev/sdb |
参考文档:badblocks
7. 查看安全情况
7.1. 查看异常进程
1 | top |
7.2. 查看登录记录
查看登录记录:
1 | last |
查看登录失败记录:
1 | lastb |
CentOS专用查看登录失败记录:
1 | grep "Failed password" /var/log/secure |
Ubuntu/Debian专用查看登录失败记录:
1 | grep "Failed password" /var/log/auth.log |