线上问题排查思路及相关命令

本文详细介绍了如何监控服务器磁盘使用情况、文件夹大小、磁盘I/O性能,包括检查日志、内存、网络、DOS攻击和应用线程,以及如何处理慢SQL、死锁和内存管理。此外,还提供了清理Docker资源的实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器

磁盘

常用参数

  • -h:使用人类可读的形式展示

整个服务器磁盘占用情况

查看服务器磁盘是否快满了,如果满了会导致应用挂起。

df -h

示例:

[root@localhost lli]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda3       197G  118G   80G  60% /
devtmpfs        3.9G     0  3.9G   0% /dev
tmpfs           3.9G   16K  3.9G   1% /dev/shm
tmpfs           3.9G   26M  3.8G   1% /run
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup

某个目录下文件夹大小

查看具体文件夹占用情况,配合文件大小命令查找出大文件用于删除,缓解磁盘压力。

du -sh *

示例:

[root@localhost minio-lli]# du -sh *
0       config
1.3G    data
50M     minio
4.0K    minio.log
4.0K    nohup.out

查看文件大小

文件大小命令查找出大文件用于删除,缓解磁盘压力。

ls -lh

示例:

[root@localhost minio-lli]# ls -lh
total 50M
drwx------ 3 root root   19 Mar 22 15:18 config
drwxrwxrwx 5 root root   55 Mar 22 15:23 data
-rwxrwxrwx 1 root root  50M Sep 11  2020 minio
-rw-r--r-- 1 root root 1.4K Mar 22 15:23 minio.log
-rwxrwxrwx 1 root root 1.5K Sep 15  2020 nohup.out

磁盘IO性能

查看某个进程的磁盘读写

pidstat -d 1

针对单个进程进行查看,可以显示正在使用磁盘的进程

pidstat -p $PID -d 1

日志

  • OOM Killer 系统内存满的时候,会杀掉一个分数高的进程,一般内存越大分数越高

    • 查看命令`dmesg -T ` 进一步 `dmesg -T | grep Kill`  
      
  • 部署在Linux下的程序,日志很多,而且实时滚动,可以通过以下方式快速查找自己自己想要的内容:

    cat log.txt | grep 'ERROR' -A 5
    
    意思是,在log.txt文件中,查找ERROR字符,并显示ERROR所在行的之后5行
    
    cat log.txt | grep 'ERROR' -B 5  之前5行
    
    cat log.txt | grep 'ERROR' -C 5 前后5行
    
    cat log.txt | grep -v 'ERROR' 排除ERROR所在的行
    
    cat error.log|grep -n " java.lang.reflect.InvocationTargetException"
    

CPU

  • top查看整体情况,M按照内存使用率排序,P按照CPU使用率排序,E、e改变显示的单位。
  • top -p pid 查看指定应用情况。

内存

  • 相关命令同上

  • free -h 
    

网络

DOS攻击

SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:

netstat -nap | grep SYN_RECV

查看TCP连接状态

首先利用以下查看tcp总连接数,判断连接数是否正常:

netstat -anoe|grep 8000|wc -l 查看8000  

然后利用如下命令判断各个状态的连接数是否正常:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

根据上述信息,如果TIME_WAIT 状态数量过多,可利用如下命令查看连接CLOSE_WAIT最多的IP地址,再结合业务分析问题:

netstat -n|grep TIME_WAIT|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -10

应用

  • jps -v 查看所有java应用及其jvm参数

线程

查找繁忙线程

这里要注意下,线程数量,太多的话可能会导致内存溢出

top -Hp pid

查询线程详细信息

  • 先利用 printf '%x\n' tid 将tid换为十六进制:xid。
  • 利用 jstack pid|grep xid -A 30查询线程信息
  • 获取线程快照jstack -l pid > 文件名称.txt

内存

  • jmap -heap pid 查看指定pid的堆内存和配置信息,会触发gc

获取内存快照

jmap -dump:live,format=b,file=/home/xxx.hprof  pid

监控内存的OOM

# 内存OOM时,自动生成dump文件 
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/

GC

日志

建议日志格式如下:

  • 业务
<!--日志格式 时间|级别|链路id|应用名|服务器ip|租户id|用户id|线程名称|logger名称|业务消息 -->
<property name="BIZ_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{traceId}|${APP_NAME}|%serverIp|%X{tenantId}|%X{accountId}|%thread|%logger{30}|%msg%n"/>

可以用MDC解决,使用MDC实现日志链路跟踪

  • 指标
<property name="METRICS_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS}|${APP_NAME}|%X{className}|%X{methodName}|%X{responseStatus}|%X{timeConsume}|%X{traceId}|%X{errorCode}|%msg%n"/>
  • 错误
 <property name="ERROR_LOG_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{traceId}|${APP_NAME}|%serverIp|%X{tenantId}|%X{accountId}|%thread|%logger{30}|%msg%n"/>

MySQL

慢SQL

查询当前事务情况

-- 当前运行的所有事务
select *  from information_schema.innodb_trx;
-- 当前出现的锁
SELECT * FROM information_schema.INNODB_LOCKS;
-- 锁等待的对应关系
select *  from information_schema.INNODB_LOCK_WAITS;

查看慢SQL是否开启

# 查询慢SQL查询是否开启
show variables like 'slow_query_log';
# 查询慢SQL的时间
show variables like 'long_query_time';
# 查看慢SQL存放路径,一般:/home/mysql/data3016/mysql/slow_query.log
show variables like 'slow_query_log_file';

开启慢SQL

方式一:修改配置文件,重启生效.

slow_query_log = 'ON'
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1

方式二:命令设置,实时生效,重启失效。

set global slow_query_log='ON'; #开启慢SQL查询
set global slow_query_log_file='/usr/local/mysql/data/slow.log';
set global long_query_time=1; #注意

https://dev.mysql.com/doc/refman/8.0/en/using-system-variables.html显示修改全局long_query_time变量仅对新会话生效而对当前会话不起作用

自带的慢sql分析

/www/server/mysql/bin/mysqldumpslow -s r -t 10 /www/server/data/mysql-slow.log

连接过多监控

show processlist;

常出现too many connections异常,数据库连接到达最大连接数。默认:151

通过set global max_connections=XXX增大最大连接数。

死锁

关键日志:Deadlock found when trying to get lock; try restarting transaction ;

获取事务隔离级别

select @@tx_isolation

查询数据库死锁日志

show engine innodb status

长事务查询

查找持续时间超过 60s 的事务

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60

Redis

内存不足

连接过多

慢命令

网络延迟

其他中间件类似的排查方式。

Docker

删除 Docker 中的镜像(image)和容器(container)以释放磁盘空间

可以按照以下步骤进行操作:

列出 Docker 镜像和容器
在命令行中执行以下命令,列出当前系统中的所有 Docker 镜像和容器:

docker images
docker ps -a

停止并删除容器
如果有运行中的容器,需要先停止它们,然后再删除。使用以下命令停止和删除容器:

# 停止所有正在运行的容器
docker stop $(docker ps -q)

# 删除所有容器(包括停止状态的)
docker rm $(docker ps -aq)

删除不需要的镜像
接下来,可以删除不再需要的 Docker 镜像。执行以下命令删除特定镜像或者清理无用镜像:

# 删除特定镜像(使用镜像的 ID 或者名称)
docker rmi image_id_or_name

# 清理无用镜像(即没有被任何容器使用的镜像)
docker image prune

清理 Docker 占用的磁盘空间
使用以下命令可以清理 Docker 占用的磁盘空间,包括未使用的镜像、容器和其他资源:

docker system prune

请谨慎操作,确保你要删除的镜像和容器是不需要的,以免造成数据丢失。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lakernote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值