ES分片报unassigned原因为ALLOCATION_FAILED(由于分片分配失败导致未分配)

  • Post author:
  • Post category:其他



现象

:单节点ES,interface-index-2019.04.26的索引主分片有unassigned,所以ES健康值显示Red,后面的索引日志没有收集到ES中。

查看原因:

错误原因:

"unassigned_info":  {
	"reason":   "ALLOCATION_FAILED",
	"at":   "2019-04-28T05:02:37.262Z",
	"details":   "failed recovery, failure IndexShardRecoveryException[failed to recovery from gateway]; nested: EngineCreationFailureException[failed to open reader on writer]; nested: IOException[Map failed: MMapIndexInput(path=" / home / data / es / log / elasticsearch - elk / data / elasticsearch - elk / nodes / 0 / indices / interface - index - 2019.04 .26 / 2 / index / _80t_Lucene50_0.tim ") [this may be caused by lack of enough unfragmented virtual address space or too restrictive virtual memory limits enforced by the operating system, preventing us to map a chunk of 101169045 bytes. Please review 'ulimit -v', 'ulimit -m' (both should return 'unlimited'), and 'sysctl vm.max_map_count'. More information: http://blog.thetaphi.de/2012/07/use-lucenes-mmapdirectory-on-64bit.html]]; "
}

用老夫的工地英语翻译大概意思为:

这可能是由于缺乏足够的未分割的虚拟地址空间或操作系统强制执行的虚拟内存限制太严格造成的,阻止我们映射一个101169045字节的数据块,请检查“ulimit -v”、“ulimit -m”(都应该返回“unlimited”)和“sysctl vm.max_map_count”

unassigned_info显示的details可以看出ulimit怎么怎么滴。。。

我直接在xshell执行:(会话级别)

ulimit -v unlimited
ulimit -m unlimited

重启ES可以看到27,28号的索引也创建了,一切恢复正常。


ulimit

ulimit命令用来限制系统用户对shell资源的访问。


解释如下:

假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。

而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联 系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

`

作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。


语法:

ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆叠大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]


参数:

-a  显示目前资源限制的设定。

-c <core文件上限>  设定core文件的最大值,单位为区块。

-d <数据节区大小>  程序数据节区的最大值,单位为KB。

-f <文件大小>  shell所能建立的最大文件,单位为区块。

-H  设定资源的硬性限制,也就是管理员所设下的限制。

-m <内存大小>  指定可使用内存的上限,单位为KB。

-n <文件数目>  指定同一时间最多可开启的文件数。

-p <缓冲区大小>  指定管道缓冲区的大小,单位512字节。

-s <堆叠大小>  指定堆叠的上限,单位为KB。

-S  设定资源的弹性限制。

-t <CPU时间>  指定CPU使用时间的上限,单位为秒。

-u <程序数目>  用户最多可开启的程序数目。

-v <虚拟内存大小>  指定可使用的虚拟内存上限,单位为KB。


实例如下:

[root@localhost ~]# ulimit -a

core file size          (blocks, -c) 0           #core文件的最大值为100 blocks。

data seg size           (kbytes, -d) unlimited   #进程的数据段可以任意大。

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited   #文件可以任意大。

pending signals                 (-i) 98304       #最多有98304个待处理的信号。

max locked memory       (kbytes, -l) 32          #一个任务锁住的物理内存的最大值为32KB。

max memory size         (kbytes, -m) unlimited   #一个任务的常驻物理内存的最大值。

open files                      (-n) 1024        #一个任务最多可以同时打开1024的文件。

pipe size            (512 bytes, -p) 8           #管道的最大空间为4096字节。

POSIX message queues     (bytes, -q) 819200      #POSIX的消息队列的最大值为819200字节。

real-time priority              (-r) 0

stack size              (kbytes, -s) 10240       #进程的栈的最大值为10240字节。

cpu time               (seconds, -t) unlimited   #进程使用的CPU时间。

max user processes              (-u) 98304       #当前用户同时打开的进程(包括线程)的最大个数为98304。

virtual memory          (kbytes, -v) unlimited   #没有限制进程的最大地址空间。

file locks                      (-x) unlimited   #所能锁住的文件的最大个数没有限制。

ulimit命令参考:


Linux – ulimit命令详解


Linux/Unix ulimit命令详解



版权声明:本文为qq_39669058原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。