美文网首页
Linux 上接口卡顿异常排查(IO 异常)

Linux 上接口卡顿异常排查(IO 异常)

作者: pumpdev | 来源:发表于2025-07-13 08:38 被阅读0次

前提:
客户现场有一台服务器,由于现场断电,导致服务器强制重启了,重启之后web可以访问但接口异常卡顿。
排查故障:

  1. 第一个就怀疑是网络问题,因为服务只是重启了,web也能登录,所以怀疑是企业的路由器故障了,导致web卡顿,但是经过排查、测速,并不是这个原因

  2. 第二个怀疑是系统资源不足,但是排查了内存和磁盘占用之后发现并没有异常

    # 查看内存占用
    top
    # 查看磁盘占用
    df -h
    
  3. 第三个排查业务代码,使用阿里巴巴的Arthas工具

    # 由于我的服务是用docker部署,需要进入容器内进行监控
    docker exec -it my-web bash
    # 下载arthas包
    curl -O https://arthas.aliyun.com/arthas-boot.jar
    # 启动监控
    java -jar arthas-boot.jar
    # 启动之后根据提示选择对应的java进程 比如 1
    # 使用trace指令监控卡顿的接口函数,这个指令可以记录函数的调用耗时
    trace com.chemcyber.web.myflow.screen.service.impl.FlowManageScreenServiceImpl getOperationTicket
    
    1752453447181_d.png

    经过排查,找到了查询慢的sql,拿到数据库里面直接执行,发现竟然时快时慢。。。真是头大

  4. 第四步,经过不断的网上查找,以及提问AI,建议我排查一下系统IO,于是

    # 监控IO占用
    iostat -x 1
    
    image.png

    可以看到IO占用竟高达99%,到这里总算是找到了大致的方向了,于是继续排查

    iotop -oP
    

    可以看到是mysql占用了大量的IO(这个截图找不到了),经过一顿搜索,卡顿的原因是服务器异常断电重启后,MySQL自动进行崩溃修复,因此占用大量IO,以下是临时缓解办法(记得修改之前先查询当前配置,方便后续恢复回去)。

    -- MySQL临时降低写入压力
    SET GLOBAL innodb_flush_log_at_trx_commit = 2;
    SET GLOBAL sync_binlog = 0;
    
    -- 优化InnoDB配置
    SET GLOBAL innodb_io_capacity = 2000;
    SET GLOBAL innodb_io_capacity_max = 4000;
    
    -- MySQL关键调整(立即生效)
    SET GLOBAL innodb_io_capacity=4000;
    SET GLOBAL innodb_flush_neighbors=0;  -- SSD必须关闭
    SET GLOBAL innodb_adaptive_flushing=ON;
    -- 增加缓冲池
    SET GLOBAL innodb_buffer_pool_size = 12G;  # 建议物理内存的50-70%
    
  5. 再次查看IO状态,发现一顿操作下来,IO占用竟然没有丝毫改善。。。

    # 查询磁盘写入速度(该命令会创建一个名为testfile的1GB文件,并将零值数据写入该文件。通过使用oflag=direct参数,可以绕过操作系统缓存,直接测试磁盘的写入性能)
    dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
    # 等待命令执行完成。在完成后,dd命令将显示读取的数据量、所用的时间和读取速度等信息。
    
image.png

磁盘写入速度只有100MB/S,这里判断可能是磁盘故障了,没办法了,只能等mysql自动修复了,第二天再看看。

  1. 一觉睡醒后,第二天果然恢复正常了(记得把之前改的mysql配置恢复回去)。
  2. 后续处理:排查服务器硬盘是否异常,需要更换硬盘,如果服务器做了Raid阵列(比如Raid5),可能是有其中一块盘坏了,导致整体写入速度变慢。

相关文章

  • rabbitmq io异常排查思路

    1、新建用户问题 场景:新建用户并连接rabbitmq,提示无法连接,报ioexception原因:可能是用户不具...

  • java线上问题排查总结

    Linux命令类 tail grep find top netstat btrace & greys 系统异常排查...

  • day 45 数据分析提升(2)

    基于前期准备工作,接下来就是异常排查步骤了,异常排查主要分三步: 1 判断是否异常; 2 最大概率法则归类; 3 ...

  • 性能异常排查

    一、定位问题 测试接口响应时间长,可能有以下几种问题: 代码质量差,jvm有大量blocked线程,可以通过jst...

  • 内存 异常排查

    jstack -- 用于分析虚拟机当前线时刻的 线程快照(当前执行的堆栈信息),对象的信息; 值得关注的线程: 死...

  • ClientAbortException 异常排查

    服务器报如下错误 通过错误信息org.apache.catalina.connector.ClientAbortE...

  • 异常&IO(File类)

    day19(异常&IO(File类)) 1_异常(异常的概述和分类) A:异常的概述异常就是Java程序在运行过程...

  • Cannot find executable for CFBun

    问题描述 Xcode Console 中有 异常 Log 问题排查 经分析,Console 中 异常 Log 的都...

  • netty线上问题排查

    记一次压测异常排查

  • Linux网络异常排查思路与方法

    处理问题时必定不能盲狙,将所有解决办法都试上一遍。这生产环境中,解决出现的问题是最优先的事情,当然前提是这问题会影...

网友评论

      本文标题:Linux 上接口卡顿异常排查(IO 异常)

      本文链接:https://www.haomeiwen.com/subject/eltlnjtx.html