• 0
  • 0
分享
  • 吊打面试官系列之:Online出现问题,不要慌,排查方法给安排!
  • Carl_奕然 2022-08-02 16:24:47 字数 4340 阅读 14205 收藏 0

1、引言

由于最近Online环境爆出好几个问题,

导致开会被各位BOSS连续的盘问,

反正不是站着灵魂拷问,也不是坐着喝茶水闲聊。

具体咋样,脑补一下。

这让我彻夜难眠,辗转反侧,夜不能寝,饭不能吃,都消瘦了好几两肉!!

遥想当年,小鱼我什么时候背过Online的锅。

22.png

这说来也巧了…

前晚这Ali的小姐姐又找我撩骚 ,哦不,是聊天。

可能是知道我最近辗转反侧;

又对我思念心切…

我岂能放过这个机会…

于是乎牺牲我的睡眠时间,与她夜夜长谈。

最后整理出这篇博文《如何排查Online出现的问题》。

做过市场调研的,或者参与过主流产品的核心人员,都会了解到,现在市面上的产品,没有谁敢说自己的产品就是0缺陷;

之所以没曝出来或者影响有限:

①无非这些功能,我们不常使用,或者不涉及/不影响到主流功能,就可以忽略不计了;

②或者是产品影响力太小,几乎没啥人使用;

但是,Online环境出现问题,我们还是需要积极应对的,

毕竟流量就是上帝嘛!

那,接下来,就跟着小鱼一起,看看Online环境出现问题分类及排查方式。

2、环境问题

2.1 磁盘空间不足

操作步骤及查看内容:

1、 执行df -h 从总体查看磁盘状态

16.png

在这里,我们一般就看挂载点为根目录的/的容量,

这里只用到的了 25%,距离瓶颈还有很大空间。

2、如果这里的太大了,我们就需要进一步查看,那个目录大。执行du -sh*,查看/路径下的各个文件和目录的大小。

1.png

3、如果已知道那个目录文件很大,想看具体的文件内容,

执行ls -lh命令,会更详细的输出各文件的大小

15.png

>>>如果想刺激有点的话,可以执行 du-h*,很Nice的。

2.2 CPU与内存使用频率过高

这也是小鱼的项目中遇到过的,当时都达到90%了。

真不知道,当时CPU经历了什么…

75.png

好了,言归正传。

操作步骤及查看内容:

1、上来就直接 top:

看看都有哪些信息

3.png

我们可以看到,这里不仅仅有CPU的信息,还有PID所占资源的情况。

 - VIRT:表示使用的虚拟内存数量;

 - RES:表示使用的物理内存数量;

 - SHR:表示使用的共享内存数量;

 - S:表示进程的状态;

 - %CPU:表示CPU使用率;

 - %MEM:表示内存的使用率;

 - TIME:表示累计CPU的使用时长;

 - COMMAND:表示启动进程使用的命令行,Java 程序的话,可以看看 JVM 启动参数,看是否配置得合理

2、如果想看Java进程的情况,我们可以这样做。

①执行jps命令找到对应的PID;

95.png

②然后再 top -p 19063,专门看看这个Java进程的情况;

21.png

③如果想看到线程的,那么直接 top -p 19063 -H;

1.png

注:

①通过VIRT、RES和SHR三者,可以从内存角度看该进程的资源占用情况。

②S下的值,知道三个就足够了:

 - S:表示睡眠;

 - D:表示不可中断睡眠;

 - R:表示运行。

3、单独分析内存

直接使用 free -h,

87.png

参数的含义:

 - total:内存总数;

 - used:已经使用内存数;

 - free:完全空闲内存;

 - shared:多个进程共享的内存;

 - buffers:用于块设备数据缓冲,记录文件系统 metadata(目录,权限,属性等);

 - cached:用于文件内容的缓冲;

 - available:真正剩余的可被程序应用的内存数。

2.3 网络延迟

能出现网络延迟的,绝对是太正常不过了,

不信你问问某通,某信,

哪个没啥事不搞点网络故障啥的…

遇到问题,不要慌,先拿手机拍个照!

1.png

2.3.1 查看所有链接中的socket

查看所有连接中socket,

执行命令: netstat -a

2.png

2.3.2 查看所有tcp链接信息

查看所有tcp链接信息,

执行命令:netstat -tnpa

1.png

2.3.3 实时流量数据统计

虽然上面的两个命令很方便,

但是,针对小鱼我这种懒人来说,

查看实时流量,还是觉得不太直观,所以,

我就想到了这个超级命令:iftop -P,输入后,瞬间把牛皮癣给治愈了。

2.png

参数解析:

中间的 <= => 这两个左右箭头,表示的是流量的方向。

 - TX:发送流量;

 - RX:接收流量;

 - TOTAL:总流量;

 - Cumm:运行 iftop 到目前时间的总流量;

 - peak:流量峰值;

 - rates:分别表示过去 2s 10s 40s 的平均流量。

当然,这种网络延迟问题,更多的是交给运维大佬去解决,毕竟,在我们这花费半个小时得出的结论,在运维大佬哪里,2分钟就知道了。

3、程序问题

程序问题的排查,绝对是Ali小姐姐明目张胆的给我温暖,

所以,我在这里,要特别的感谢这位小姐姐。

当然,我也是牺牲了我的睡眠时间来陪她聊天,哦,是谈论工作…

毕竟…

1.png

3.1 Java程序问题分析

这部分主要分享小姐姐给我的温暖 ,例子。

内存罢工,触发的报警。

执行步骤及截图内容:

1、使用jmap -dump分析堆内存中的快照,未发现有大对象问题

2.png

2、使用 jmap -heap 查看堆内存设置与当前使用情况,堆内存设置的是 6G

Attaching to process ID 127, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
 
using thread-local object allocation.
Parallel GC with 4 thread(s)
 
Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 6442450944 (6144.0MB)
   NewSize                  = 2147483648 (2048.0MB)
   MaxNewSize               = 2147483648 (2048.0MB)
   OldSize                  = 4294967296 (4096.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)
 
Heap Usage:
PS Young Generation
Eden Space:
   capacity = 2117074944 (2019.0MB)
   used     = 1150960080 (1097.6410675048828MB)
   free     = 966114864 (921.3589324951172MB)
   54.36558036180698% used
From Space:
   capacity = 15204352 (14.5MB)
   used     = 13860864 (13.21875MB)
   free     = 1343488 (1.28125MB)
   91.16379310344827% used
To Space:
   capacity = 15204352 (14.5MB)
   used     = 0 (0.0MB)
   free     = 15204352 (14.5MB)
   0.0% used
PS Old Generation
   capacity = 4294967296 (4096.0MB)
   used     = 188289400 (179.56676483154297MB)
   free     = 4106677896 (3916.433235168457MB)
   4.383954219520092% used
 
23604 interned Strings occupying 2341024 bytes.

这个信息有点长,我截图有点费劲,索性就把内容copy出来了…

3、使用 jstack 查看 jvm 线程运行信息,

上传到 fastthread.io 网站,仔细一瞅,这线程不是多一点呢。

1.png

一个线程需要占用大约 1M 的空间吧,而且不是占用 jvm 的内存空间,而是会占用操作系统空闲的内存空间。

机器内存是 8G,堆内存占了 6G,线程数这么多快超过 2G 了,再加上操作系统里其他程序占用的内存,

内存告警很正常,甚至可能 OOM~ ~

所以,一方面我们可以减少线程数,

另一方面可以把堆内存配置得小一点,使得堆内存加上线程占用的操作系统内存,不要超过 8G。

4、本地无法debug的调试技巧

这里,主要就推荐阿里的arthas这款工具了。

推荐理由:大家都知道了,我就不说了

2.png

操作步骤,就简单说一下:

 - 先申请个线上机器的约等于root的权限;

 - 在机器上下载arthas工具;

            >>>>>下载地址:https://alibaba.github.io/arthas/arthas-boot.jar

 - 使用 watch 命令可以实时观察一个方法的入参和出参。

 - 使用 trace 命令可以跟踪某个方法的耗时,而且可以深入这个方法所调用的方法的各个耗时。

这两个功能,平时的调试,也够满足的了,

但是这款功能,确实很强大的,包含但不仅限于:

 - dashboard 全局监控;

 - thread 查看所有线程信息,包括状态和 CPU 使用率;

 - thread -b 甚至可以直接定位到死锁信息;

 - jad 命令进行反编译;

更多的功能,小鱼就不在这里说了,免得有人说我又打广告了…

关于arthas更多内容,详细阅读官网文档。

5、总结

说到这里,吊打面试官系列的Online环境问题排查,就差不多写到这里。

吊打面试官系列,会持续更新。

内容很劲爆,图片很给力。

当然,Online环境出现问题,不仅仅局限于小鱼举的这些例子。

例如:环境配置不同;版本部署代码遗漏等等。

鲁迅说过:如果一切事物都是完美的,那它一定是不完美的。

所以,遇到问题,发现问题,我们及时应对:
有些能规避的,在前期规避就好,
实在无法规避的,就让暴风雨来得更猛烈些吧!

46.png

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   前言  jmeter 这个工具既可以做接口的功能测试,也可以做自动化测试,还可以做性能测试,其主要用途就是用于性能测试。但是,有些公司和个人,就想用 jmeter 来做接口自动化测试。  你有没有想过呢?  下面我就给大家讲讲,用 jmeter 如何做接口自动化测试。  jmeter 与接口自动化测试  如果要你用 jmeter 来做接口自动化测试,你是不是把几乎每一个测试用例,都是用一个取样器来实现?  相信很多人都是这么想的,也是这么干的。  但是,很遗憾,你这种,是初级入门做法。你能实现所有的测试用例都被执行,但是,你写脚本和维护脚本的时间,可能比你用手工执行所有的测试用例时间还要长...
            0 0 1159
            分享
          •   实现优先级队列最常用的数据结构是堆,堆的常见实现有二叉堆、斐波那契堆、二项堆等。  二叉堆  堆是一种完全二叉树,我们以小根堆为例,小根堆的性质就是,每个节点都小于其左孩子和右孩子,不难发现,这种二叉树,根的值是最小的。  堆有以下几种操作:堆的初始化、修改某个值(规定修改之后的值小于等于原来的值)、插入某个值、取出根节点(即取出该优先队列中的优先级最高的值)。  在进行这几种操作的时候,要维护堆的性质。  堆的存储  我们不难发现以下结论:在一棵完全二叉树中,假设节点下标从0开始,那么点i的左孩子的下标为 (i<<1)+1,右孩子的下标为(i<<1)+2 ,父节点...
            0 0 770
            分享
          •   在软件测试的发展历史上,曾发生过很多次因为软件出现bug而造成的重大事故,小编特别整理了历史上震惊全球的5个经典案例↓↓↓↓↓↓图源:网络  众所周知,软件测试是一项比较细致的工作,很多时候会显得有些枯燥。因此,除了专业技能和业务知识外,还需要从业人员具备良好的耐心、专注力和责任感,非常考验从业人员的心理素质和业务能力。  关于一名优秀软件测试工程师所必备的专业素质!本文总结出以下几点:  1.具备严谨、耐心、认真、负责的态度  作为一名软件测试工程师,必须要对你所测的产品负责,需要以严谨的态度,不放过每一个细节,尽可能找出所有的bug。虽然不能做到完全没有bug,但作为一名负责任的测试人...
            0 0 878
            分享
          • 一、概述所谓回归测试就是当软件发生改变时,重新测试已经通过测试的测试区域,以验证修改的正确性及其影响。在软件开发生命周期中,软件发生改变,就会带来问题,改变可能是源于发现了错误并做了修改,也有可能是因为集成或维护阶段加入了新模块。错误跟踪与管理系统不完善,对错误的理解不透彻,只修正了错误的外在表现,从而造成修改失败;修改还有可能产生副作用,从而导致软件未被修改的部分产生新的问题;新加入的代码还有可能对原有代码带来影响。因此,我们就必须重新测试,以便确定修改是否达到了预期的目的。同时,为了验证修改的正确性及其影响就需要进行回归测试。回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有...
            1 0 1683
            分享
          •   一段声称展示 iPhone 15 Pro 保护壳的新视频清楚地显示了静音开关是如何被"动作"按钮取代的。自 Apple Watch Ultra 推出该功能以来,有关新控制按钮的传言越来越多。继泄露 iPhone 15 普通系列的颜色之后,可靠的泄密者 Sonny Dickson 又在一段新视频中展示了 iPhone 15 Pro。  不过,手机壳上的"操作"按钮非常清晰,位于音量控制上方,取代了原来的静音开关。  早在 2022 年 10 月,分析师郭明錤(Ming-Chi Kuo)就声称,iPhone 15 Pro 上的所有控制按钮(音量和静音)都...
            0 0 1049
            分享
      • 51testing软件测试圈微信