问题来源
logstash在数据量少的情况下,是正常抽取数据的,但当多台服务器一起启动logstash去抽取大量数据的时候,logstash就会出现Your application used more memory than the safety cap of 1G的问题,进而抽取程序就停掉了;
问题说明
从报错的提示来看,很明显就是内存溢出的问题(logstash的默认服务分配内存的1g),数据抽取缓存堆积太多,导致原本分配的堆内存空间不足,需要扩大服务的内存空间以解决内存溢出的问题;
解决方法
- 在logstash5.X版本以前,可以直接修改logstash的配置文件logstash.lib.sh,它的文件路径:/opt/logstash/bin;
修改内容:
LS_HEAP_SIZE=”${LS_HEAP_SIZE:=1g}”
将其中的1g修改成32g,扩大es处理服务空间,修改之后的文件如下:
LS_HEAP_SIZE=”${LS_HEAP_SIZE:=32g}” - 在logstash5.X版本之后,修改的方式有所变动,需要修改es的配置文件,而不是logstash配置文件;
修改方式:
在es的bin目录下,找到elasticsearch启动文件,在头部新增命令语句:export ES_HEAP_SIZE=32g
说明:
ES_HEAP_SIZE的大小可根据生产环境的大小进行修改,一般不超过32g;
新问题出现
当在elasticsearch设置了32g的分配内存之后,启动的时候发现又报错了,以下就是报错的内容:
1. Error: encountered environment variables that are no longer supported
2. Use jvm.options or ES_JAVA_OPTS to configure the JVM
3. ES_HEAP_SIZE=32g: set -Xms32g and -Xmx16g in jvm.options or add “-Xms32g -Xmx32g” to ES_JAVA_OPTS
解决方式:
从报错的提示来看,jvm里面没有16g的配置,所以提供了两种方式去修改:
1. 修改config目录下的jvm.options文件,修改配置:-Xms32g -Xmx32g
2. 直接在elasticsearch启动文件里面添加配置:ES_JAVA_OPTS=”-Xms32g -Xmx32g”
如果第一种修改方式不起作用,可选择第二种进行修改;
解决结果
修改成功上面的配置之后,重新启动es,然后多台服务器一起去运行logstash导入数据的时候,再也没有出现那些奇葩的问题了,perfect,希望对有遇到这些问题的程序猿有所帮助~