诡异bug的解决过程是什么样的

发布时间:2021-10-20 16:10:13 作者:柒染
来源:亿速云 阅读:139

今天就跟大家聊聊有关诡异bug的解决过程是什么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

本文记录一次很诡异的bug (进程莫名被终止)的发现过程,并且详细记录了问题背后的原因,以及解决方案。

背景

此项目是一个接口的自动化测试平台,需要接入自动化工程(每个自动化工程对应一个被测应用工程),每个自动化工程都是独立运行的进程。 自动化工程用的是springboot, 利用maven插件运行,mvn spring-boot:run 。 该平台接入了很多自动化工程,在一台linux机器上运行着很多个自动化工程的进程。

现象

偶尔会莫名的出现自动化工程的进行被杀掉的情况,需要在平台上重新操作,启动该自动化工程之后,才能继续运行任务。 直到系统规模扩大,自动化工程数目变多,自动化用例变多,运行任务时间变长,自动化工程被莫名终止的概率加大。

分析

  1. 查看log, 发现自动化工程被终止的log信息如下:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 09:32 min
[INFO] Finished at: 2019-08-15T17:39:55+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.2.0.M5:run (default-cli) on project coupon_batch-Test: Application finished with exit code: 137 -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
  1. 分析log产生的原因,google : ERROR: Maven JVM terminated unexpectedly with exit code 137

For reference the status code 137 (128 + 9) typically means (can differ between flavours of unix). That the process was terminated by receipt of a signal. In this case signal 9 which is SIGKILL and unblockable kill. If this is the case the underlying machine/OS needs more virtual memory. This can be added by either adding physical memory or swap space as appropriate. You should try to increase the virtual memory of your machine. Note:This also explains why a Jenkins restart (temporarily) fixes the issue. Jenkins Maven Build 137 Error

  1. 至此找到问题原因:linux swap 分区不足,导致该进程被linux OOM Killer杀掉。

解决问题需要的背景知识

1. 什么是swap?

swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。 简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上, 这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时, 再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。

2. 为什么需要swap ?

  1. 对于一些大型的应用程序(如LibreOffice、video editor等),在启动的过程中会使用大量的内存, 但这些内存很多时候只是在启动的时候用一下,后面的运行过程中很少再用到这些内存。有了swap后, 系统就可以将这部分不这么使用的内存数据保存到swap上去,从而释放出更多的物理内存供系统使用。

  2. 很多发行版(如ubuntu)的休眠功能依赖于swap分区,当系统休眠的时候, 会将内存中的数据保存到swap分区上,等下次系统启动的时候,再将数据加载到内存中,这样可以加快系统的启动速度, 所以如果要使用休眠的功能,必须要配置swap分区,并且大小一定要大于等于物理内存

  3. 在某些情况下,物理内存有限,但又想运行耗内存的程序怎么办? 这时可以通过配置足够的swap空间来达到目标,虽然慢一点,但至少可以运行。

  4. 虽然大部分情况下,物理内存都是够用的,但是总有一些意想不到的状况,比如某个进程需要的内存超过了预期, 或者有进程存在内存泄漏等,当内存不够的时候,就会触发内核的OOM killer, 根据OOM killer的配置,某些进程会被kill掉或者系统直接重启(默认情况是优先kill耗内存最多的那个进程), 不过有了swap后,可以拿swap当内存用,虽然速度慢了点,但至少给了我们一个去debug、kill进程或者保存当前工作进度的机会。

  5. 如果看过Linux内存管理,就会知道系统会尽可能多的将空闲内存用于cache,以加快系统的I/O速度, 所以如果能将不怎么常用的内存数据移动到swap上,就会有更多的物理内存用于cache,从而提高系统整体性能。

3. swap的缺点

  1. 上面介绍了swap的优点,那swap的缺点呢?swap是存放在磁盘上的,磁盘的速度和内存比较起来慢了好几个数量级, 如果不停的读写swap,那么对系统的性能肯定有影响,尤其是当系统内存很吃紧的时候,读写swap空间发生的频率会很高, 导致系统运行很慢,像死了一样,这个时候添加物理内存是唯一的解决办法。

  2. 由于系统会自动将不常用的内存数据移到swap上,对桌面程序来说,有可能会导致最小化一个程序后, 再打开时小卡一下,因为需要将swap上的数据重新加载到内存中来。

Linux交换空间(swap space)

采用的解决方案: 增加swap文件

#先创建一个新的512M的文件,用来作为swap文件,文件路径可以随便
#fallocate这个命令依赖于文件系统,有些老的文件系统不支持这个命令,比如ext2,
#这种情况下可以用dd来实现同样的效果:
#sudo dd if=/dev/zero of=/mnt/512MiB.swap bs=1024 count=524288
#fallocate和dd的区别在于:
#fallocate是先声明这么多,然后在具体用到的时候文件系统才分配真正的物理磁盘空间,就是用一点分配一点,
#而dd是一开始就实实在在的写了512m的数据到物理磁盘空间。
#所以作为测试来说fallocate方便些,因为刚开始不用写任何数据,要快
dev@dev:~$ sudo fallocate -l 512m /mnt/512MiB.swap

#修改文件的权限,避免其他用户对这个文件进行误操作
dev@dev:~$ sudo chmod 600 /mnt/512MiB.swap

#格式化为swap文件
dev@dev:~$ sudo mkswap /mnt/512MiB.swap

#将新的文件加入到系统中
dev@dev:~$ sudo swapon /mnt/512MiB.swap

#这时候可以看到新的swap文件已经被加入到系统中了,类型为file
#这里可以看到由于优先级最高,第一个swap分区/dev/dm-1已经被使用了24K
dev@dev:~$ swapon -s
Filename                Type        Size    Used    Priority
/dev/dm-1               partition   524284  24      -1
/dev/sdb1               partition   2096124 0       -2
/mnt/512MiB.swap        file        524284  0       -3

#从free命令的输出可以看到,经过前面两轮添加swap分区和文件,
#现在系统的交换空间已经变成3G(3144692K)了
dev@dev:~$ free
              total        used        free      shared  buff/cache   available
Mem:         500192       39112        9564        1996      451516      430820
Swap:       3144692          24     3144668

#同样为了保证系统重启后会自动加载我们新的swap文件,需要修改/etc/fstab文件
dev@dev:~$ sudo sh -c 'echo "/mnt/512MiB.swap none  swap    sw   0    0" >> /etc/fstab'

进阶: OOM Killer 配置

理解和配置 Linux 下的 OOM Killer

技术上的问题总会有原因的,就看你找不找得到。 技术的问题如果深究的话,有很多可以学习的地方,一个bug就是一个学习机会。

看完上述内容,你们对诡异bug的解决过程是什么样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. 诡异的精度diff追查
  2. 解决FastJson 1.2.39的bug

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

bug

上一篇:Spring最常用的类注解有哪些

下一篇:怎么进行Lock总结

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》