文件描述符和 MMap (File Descriptors and MMap)edit

Lucene 使用了非常大量的文件。 同时,Elasticsearch 在节点和 HTTP 客户端之间进行通信也使用了大量的套接字(sockets)。 所有这一切都需要足够的文件描述符。

可悲的是,许多现代的 Linux 发行版本,每个进程默认只允许 1024 个文件描述符。 这对即使是一个小的 Elasticsearch 节点来说都实在是低了,更不用说处理数百个索引的节点。

你应该增加文件描述符的数量到一个很大的值,比如 64,000。 这个过程非常困难,它高度依赖于你的特定操作系统和发行版本。 请参考操作系统文档来确定如何最好地修改允许的文件描述符数量。

一旦你认为已经改变了它,检查 Elasticsearch,以确保它确实有足够的文件描述符:

GET /_nodes/process

{
   "cluster_name": "elasticsearch__zach",
   "nodes": {
      "TGn9iO2_QQKb0kavcLbnDw": {
         "name": "Zach",
         "transport_address": "inet[/192.168.1.131:9300]",
         "host": "zacharys-air",
         "ip": "192.168.1.131",
         "version": "2.0.0-SNAPSHOT",
         "build": "612f461",
         "http_address": "inet[/192.168.1.131:9200]",
         "process": {
            "refresh_interval_in_millis": 1000,
            "id": 19808,
            "max_file_descriptors": 64000, 
            "mlockall": true
         }
      }
   }
}

max_file_descriptors 字段显示 Elasticsearch 进程可以访问的可用文件描述符数量。

Elasticsearch 对各种文件混合使用了 NioFs( 注:非阻塞文件系统)和 MMapFs(注:内存映射文件系统)。 请确保配置了最大映射数量,以便有足够的虚拟内存可用于 mmapp 文件。这可以暂时设置:

sysctl -w vm.max_map_count=262144

或者你可以通过修改/etc/sysctl.conf文件中的vm.max_map_count来永久设置它。