本文记录一次很诡异的bug (进程莫名被终止)的发现过程,而且详细记录了问题背后的缘由,以及解决方案。java
此项目是一个接口的自动化测试平台,须要接入自动化工程(每一个自动化工程对应一个被测应用工程),每一个自动化工程都是独立运行的进程。
自动化工程用的是springboot, 利用maven插件运行,mvn spring-boot:run 。
该平台接入了不少自动化工程,在一台linux机器上运行着不少个自动化工程的进程。linux
偶尔会莫名的出现自动化工程的进行被杀掉的状况,须要在平台上从新操做,启动该自动化工程以后,才能继续运行任务。
直到系统规模扩大,自动化工程数目变多,自动化用例变多,运行任务时间变长,自动化工程被莫名终止的几率加大。spring
[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
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
swap space是磁盘上的一块区域,能够是一个分区,也能够是一个文件,或者是他们的组合。
简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,
这样系统就有更多的物理内存为各个进程服务,而当系统须要访问swap上存储的内容时,
再将swap上的数据加载到内存中,这就是咱们常说的swap out和swap in。apache
但这些内存不少时候只是在启动的时候用一下,后面的运行过程当中不多再用到这些内存。有了swap后,
系统就能够将这部分不这么使用的内存数据保存到swap上去,从而释放出更多的物理内存供系统使用。ubuntu
会将内存中的数据保存到swap分区上,等下次系统启动的时候,再将数据加载到内存中,这样能够加快系统的启动速度,
因此若是要使用休眠的功能,必需要配置swap分区,而且大小必定要大于等于物理内存segmentfault
这时能够经过配置足够的swap空间来达到目标,虽然慢一点,但至少能够运行。springboot
或者有进程存在内存泄漏等,当内存不够的时候,就会触发内核的OOM killer,
根据OOM killer的配置,某些进程会被kill掉或者系统直接重启(默认状况是优先kill耗内存最多的那个进程),
不过有了swap后,能够拿swap当内存用,虽然速度慢了点,但至少给了咱们一个去debug、kill进程或者保存当前工做进度的机会。bash
因此若是能将不怎么经常使用的内存数据移动到swap上,就会有更多的物理内存用于cache,从而提升系统总体性能。app
若是不停的读写swap,那么对系统的性能确定有影响,尤为是当系统内存很吃紧的时候,读写swap空间发生的频率会很高,
致使系统运行很慢,像死了同样,这个时候添加物理内存是惟一的解决办法。maven
再打开时小卡一下,由于须要将swap上的数据从新加载到内存中来。
Linux交换空间(swap space)
#先建立一个新的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'
技术上的问题总会有缘由的,就看你找不找获得。
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处连接和本声明。posted from openWrite