docker启动ES内存溢出的解决方案

在elasticsearch的config中加jvm.options文件,修改堆栈大小,默认是2GB,直接启动es即可,保证之前已经映射了配置文件。

-Xms5g
-Xmx5g

完整jvm.options文件如下:

## JVM configuration
################################################################
## IMPORTANT: JVM heap size
################################################################
##
## You should always set the min and max JVM heap
## size to the same value. For example, to set
## the heap to 4 GB, set:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms5g
-Xmx5g
################################################################
## Expert settings
################################################################
##
## All settings below this section are considered
## expert settings. Don't tamper with them unless
## you understand what you are doing
##
################################################################
## GC configuration
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
## optimizations
# pre-touch memory pages used by the JVM during initialization
-XX:+AlwaysPreTouch
## basic
# force the server VM (remove on 32-bit client JVMs)
-server
# explicitly set the stack size (reduce to 320k on 32-bit client JVMs)
-Xss1m
# set to headless, just in case
-Djava.awt.headless=true
# ensure UTF-8 encoding by default (e.g. filenames)
-Dfile.encoding=UTF-8
# use our provided JNA always versus the system one
-Djna.nosys=true
# use old-style file permissions on JDK9
-Djdk.io.permissionsUseCanonicalPath=true
# flags to configure Netty
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
# log4j 2
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
## heap dumps
# generate a heap dump when an allocation from the Java heap fails
# heap dumps are created in the working directory of the JVM
-XX:+HeapDumpOnOutOfMemoryError
# specify an alternative path for heap dumps
# ensure the directory exists and has sufficient space
#-XX:HeapDumpPath=${heap.dump.path}
## GC logging
#-XX:+PrintGCDetails
#-XX:+PrintGCTimeStamps
#-XX:+PrintGCDateStamps
#-XX:+PrintClassHistogram
#-XX:+PrintTenuringDistribution
#-XX:+PrintGCApplicationStoppedTime
# log GC status to a file with time stamps
# ensure the directory exists
#-Xloggc:${loggc}
# By default, the GC log file will not rotate.
# By uncommenting the lines below, the GC log file
# will be rotated every 128MB at most 32 times.
#-XX:+UseGCLogFileRotation
#-XX:NumberOfGCLogFiles=32
#-XX:GCLogFileSize=128M
# Elasticsearch 5.0.0 will throw an exception on unquoted field names in JSON.
# If documents were already indexed with unquoted fields in a previous version
# of Elasticsearch, some operations may throw errors.
#
# WARNING: This option will be removed in Elasticsearch 6.0.0 and is provided
# only for migration purposes.
#-Delasticsearch.json.allow_unquoted_field_names=true

补充:Docker 容器内存限制

Docker 内存限制

docker run -d -i -t -m 256M --memory-swap 512M --name centos2.12 centos /bin/bash

查看容器实例 内存限制:

限制容器内存大小;

docker run -d -i -t -m 256M --memory-swap 512M --name centos centos /bin/bash

-m, --memory
# 内存限制大小,单位可以为 b,k,M,g;最小为4M
--memory-swap
# 内存+交换分区大小总限制
--memory-reservation # 预留内存大小;容器在宿主机最小占用内存;
--oom-kill-disable
# out-of-memory 内存溢出;限制kill容器进程,默认没设置
--oom-score-adj
# 容器被 OOM killer 杀死的优先级,范围是[-1000, 1000],默认为 0
--memory-swappiness
# 用于设置容器的虚拟内存控制行为。值为 0~100 之间的整数
--kernel-memory
核心内存限制,最小为 4M。

1、memory 设置容器内存大小;

--memory-swap 不是交换分区,而是 memory + swap 的大小;
容器的交换分区 swap = memory-swap - memory

2、Docker 默认容器交换分区的大小和内存相同

memory-swap 不设置 或者设置为 0 ;
容器的交换分区 swap 大小就是 memory 的小大;
容器的进程使用最大内存 = memory + swap

3、memory-swap 设置

当 memory-swap 设置为 -1 时;
容器内存大小为 memory 设置的大小;
交换分区大小为宿主机 swap 大小;
容器进程能使用的最大内存 = memory + 宿主机 swap 大小;

4、内存溢出

--oom-kill-disable
限制 kill 容器进程; (必须设置在 memory 之后才有限;)
docker run -d -i -t -m 256M --oom-kill-disable --name Centos-1 centos /bin/bash

5、核心内存 & 用户内存

核心内存和用户内存不同的地方在于核心内存不能被交换出。

不能交换出去的特性使得容器可以通过消耗太多内存来堵塞一些系统服务。

核心内存包括:
stack pages(栈页面)
slab pages
socket memory pressure
tcp memory pressure

可以通过设置核心内存限制来约束这些内存。

每个进程都要消耗一些栈页面,通过限制核心内存,可以在核心内存使用过多时阻止新进程被创建。

docker run -d -i -t -m 500M --kernel-memory 128M --name Centos-2 centos /bin/bash
限制容器内存 256M;限制核心内存 128M 。
docker run -d -i -t --kernel-memory 128M --name Centos-3 centos /bin/bash
内存为宿主机memory大小, 限制核心内存 128M

6、Swappiness 内存回收页

容器的内核可以交换出一定比例的匿名页。

--memory-swappiness就是用来设置这个比例的。
--memory-swappiness可以设置为从 0 到 100。
# 0 表示关闭匿名页面交换。
# 100 表示所有的匿名页都可以交换。默认情况下,如果不适用--memory-swappiness,则该值从父进程继承而来。
docker run -d -i -t --memory-swappiness=0 --name Centos-4 centos /bin/bash
将--memory-swappiness设置为 0 可以保持容器的工作集,避免交换代理的性能损失。

Swappiness 的值越大,表示越积极使用swap分区,越小表示越积极使用物理内存。默认值swappiness=60

sysctl vm.swappiness = 100
# cat /proc/sys/vm/swappiness

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • docker images本地迁移的实现

    最近在学习docker,经常遇到的一个问题是,在下载docker image的时候,由于众所周知的网络原因导致失败,虽然网上也有很多解决方案,比如使用Docker Hub Mirror 之类的国内镜像服务,不过由于个人原因(侥幸有一台国外的VM),我更倾向于不通过docker registry共享下载的image. 问题很明确: 不通过docker registry,将A机器上的docker image共享给其他机器,即docker镜像本地迁移. 方案也很简单: 使用docker的save 和

  • docker volumes 文件映射方式

    背景 在做区块链日志模块时,如果容器运行,需要把日志文件映射到宿主机上以方便查看.下面介绍一下我的实现方式. 实现 通过docker-compose配置文件volumes参数 配置文件示例: volumes: - /var/run/:/host/var/run/ - ./channel-artifacts:/var/hyperledger/configs - ./fabric_logs:/tmp/fabric_logs/ 把容器中/tmp/fabric_logs目录映射到宿主机当前目录下的./f

  • Docker images导出和导入操作

    之前已配置好基础镜像,其他地方也需要用到这些镜像时怎么办呢? 答案:镜像的导入和导出功能. 1.镜像的保存 [root@wxtest1607 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat8 3.0 90457edaf6ff 6 hours ago 1.036 GB [root@wxtest1607 lixr]# docker save 9045 > tomcat8-apr.tar [root@wxtest1607 li

  • 删除docker images中为none的镜像操作

    由于平时一直使用docker build 命令才生成一个镜像,有时候由于代码跟新频繁就会产生很多的none的image,最近想着清除一下. 于是就写了以下脚本: docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm docker images|grep non

  • 解决docker images 镜像消失的问题

    1.50,93存在镜像消失情况 [root@h50 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 24G 0 24G 0% /dev tmpfs 24G 0 24G 0% /dev/shm tmpfs 24G 428M 24G 2% /run tmpfs 24G 0 24G 0% /sys/fs/cgroup /dev/mapper/cl-root 50G 43G 8.0G 85% / root剩下85% overlay 50G 43G 8.0G 85% /v

  • Docker环境下升级PostgreSQL的步骤方法详解

    前段时间接到了要升级数据库的需求,在公司大佬的指导下搞定了升级的方案,在此记录一下. 查阅PostgreSQL 官方文档 可以得知,官方提供了两种方式对数据库进行升级--pg_dumpall与pg_upgrade. pg_dumpall是将数据库转储成一个脚本文件,然后在新版数据库中可以直接导入.这种方式操作简单,跟着官方文档就能轻松操作,但是明显只适用于数据量较少的情况,在我的测试环境里,导入一个2g的数据库用了将近10分钟. 所以我这里选用的是 pg_upgrade,这种方式是直接将数据文件

  • 本地Docker安装Postgres 12 + pgadmin的方法 (支持Apple M1)

    介绍 项目最近要升级Posgres数据库, 从9.6升级到12+.为了做一些migration测试,我本地要安装几个版本的Postgres,最方便的就是 用Docker安装了,没有版本冲突的问题,好管理,方便删除. 另外建议使用docker-compose,或者stack,简单说就是可以data存在本地,这样每次重新启动,数据不会丢,可以重复使用.如果 是做integration testing,则可以每次启动一个新的DB. 下面docker-compose文件里面还有pgAdmin,这样使用P

  • docker run -v 挂载数据卷异常,容器状态一直是restarting的解决

    出现的问题: docker run 加上 -v 参数之后,容器就一直是 restarting 状态,去掉 -v 参数就可以正常运行 查找问题: 使用 docker logs 'containerId' 这个containerId,就是docker run之后返回的containerId 可以看到,是权限拒绝的问题 解决问题: docker run时加上参数 :加上--privileged=true 例如: docker run -dit -e MYSQL_ROOT_PASSWORD=123456

  • docker启动ES内存溢出的解决方案

    在elasticsearch的config中加jvm.options文件,修改堆栈大小,默认是2GB,直接启动es即可,保证之前已经映射了配置文件. -Xms5g -Xmx5g 完整jvm.options文件如下: ## JVM configuration ################################################################ ## IMPORTANT: JVM heap size ############################

  • Python内存泄漏和内存溢出的解决方案

    一.内存泄漏 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题. 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了"内存泄露". 1.内存泄露的原因 对于 python 这种支持垃圾回收的语言来说,怎么还会有内存泄露? 概括来说,有以下三种原因: 所用到的用 C 语言开发的底层模块中出现了内存泄露. 代码中用到了全局的 list. dict 或其它容器,不停的往这些容器中插入对象,而忘记了在使用完

  • Spring Cloud Gateway 内存溢出的解决方案

    记 Spring Cloud Gateway 内存溢出查询过程 环境配置: org.springframework.boot : 2.1.4.RELEASE org.springframework.cloud :Greenwich.SR1 事故记录: 由于网关存在 RequestBody 丢失的情况,顾采用了网上的通用解决方案,使用如下方式解决: @Bean public RouteLocator tpauditRoutes(RouteLocatorBuilder builder) { retu

  • JVM Metaspace内存溢出问题解决方案

    一. 现象 前段时间公司线上环境的一个Java应用因为OOM的异常报警,导致整个服务不可用被拉出集群,本地模拟重现的现象如下: 当时的解决方案是增加metaspace的容量:-XX:MaxMetaspaceSize=500m,从原来默认的256m改为500m,虽然没有再出现oom,但这个只是临时解决方案,通过公司的监控系统观察metaspace的使用情况还是在上升,而且后面随着业务访问量越来越大还是有可能达到阈值. 二. 分析 Metaspace元空间主要是存储类的元数据信息,我们的应用里加载的

  • docker启动elasticsearch时内存不足问题及解决方法

    问题 docker安装并启动elasticsearch时内存不足 系统centos8(阿里云ecs服务器) [root@iZ2zeczvvb79boy368xppwZ ~]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 安装过程 docker pull elasticsearch:6.4.0 修改虚拟机内存(貌似没有效果) sysctl -w vm.max_map_count=262144 使用docker run命令

  • docker版es、milvus、minio启动命令详解

    1.es启动命令: docker run -itd -e TAKE_FILE_OWNERSHIP=1111 -v /data/elasticsearch/data:/usr/share/elasticsearch/data -p 9200:9200 --name es elasticsearch:6.4.2 需要添加环境变量 TAKE_FILE_OWNERSHIP,值随意. 含义请参考我的另一篇文章://www.jb51.net/article/200198.htm 挂载目录用来存储es的数据.

  • 解决MyEclipse下启动项目时JBoss内存溢出的问题

    配置1: -Xms64m -Xmx512m 配置2: -c default -b 0.0.0.0 -Xmx1024M -Xms512M -XX:MaxPermSize=256m 以上这篇解决MyEclipse下启动项目时JBoss内存溢出的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Android 使用帧动画内存溢出解决方案

    Android 使用帧动画内存溢出解决方案 最近在项目遇到的动画效果不好实现,就让UI切成图,采用帧动画实现效果,但是在使用animation-list时,图片也就11张,每张图片大概560k左右,结果内存溢出,崩溃 了,自己用了三张都崩溃:拿代码说: 1.anin_searh.xml <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://

  • Android编程之内存溢出解决方案(OOM)实例总结

    本文实例总结了Android编程之内存溢出解决方案(OOM).分享给大家供大家参考,具体如下: 在最近做的工程中发现加载的图片太多或图片过大时经常出现OOM问题,找网上资料也提供了很多方法,但自己感觉有点乱,特此,今天在不同型号的三款安卓手机上做了测试,因为有效果也有结果,今天小马就做个详细的总结,以供朋友们共同交流学习,也供自己以后在解决OOM问题上有所提高,提前讲下,片幅有点长,涉及的东西太多,大家耐心看,肯定有收获的,里面的很多东西小马也是学习参考网络资料使用的,先来简单讲下下: 一般我们

  • JAVA内存溢出解决方案图解

    这篇文章主要介绍了JAVA内存溢出解决方案图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.在apache-tomcat-7.0.70\bin\catalina.bat(Linux 系统则在catalina.sh) 文件下的 echo Using CATALINA_BASE: "%CATALINA_BASE%" 上面插入以下代码 set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=256

随机推荐