最近做多职位简历召回时,使用多线程进行es数据召回,发现每次es召回的时间大概在1000ms,甚至导致RuntimeException。linux机器cpu核数等于8
一、分析原因
1、单线程进行es数据召回,耗时30ms左右,猜猜是由于多线程导致的
2、切回线程池多线程执行es数据召回,每条数据耗时1000ms左右,此时线程池配置如下:
private static ExecutorService THREAD_POOL = new ThreadPoolExecutor(40,40, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("es-recall-%d").build());
3、减少核心线程数,执行es数据召回,每条数据执行耗时在100ms左右,确定是由于多线程请求,导致es召回耗时变大,甚至超时,此时线程池配置如下:
private static ExecutorService THREAD_POOL = new ThreadPoolExecutor(10, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("resume-nsupin-recall-%d").build());
查阅官方文档,确认是由于多线程引起es查询线程阻塞导致的,官方解释以及解决方案,如下:
线程池 许多人喜欢调整线程池。无论什么原因,人们都对增加线程数无法抵抗。索引太多了?增加线程!搜索太多了?增加线程!节点空闲率低于 95%?增加线程! Elasticsearch 默认的线程设置已经是很合理的了。对于所有的线程池(除了 搜索 ),线程个数是根据 CPU 核心数设置的。 如果你有 8 个核,你可以同时运行的只有 8 个线程,只分配 8 个线程给任何特定的线程池是有道理的。 搜索线程池设置的大一点,配置为 int(( 核心数 * 3 )/ 2 )+ 1 。 你可能会认为某些线程可能会阻塞(如磁盘上的 I/O 操作),所以你才想加大线程的。对于 Elasticsearch 来说这并不是一个问题:因为大多数 I/O 的操作是由 Lucene 线程管理的,而不是 Elasticsearch。 此外,线程池通过传递彼此之间的工作配合。你不必再因为它正在等待磁盘写操作而担心网络线程阻塞, 因为网络线程早已把这个工作交给另外的线程池,并且网络进行了响应。 最后,你的处理器的计算能力是有限的,拥有更多的线程会导致你的处理器频繁切换线程上下文。 一个处理器同时只能运行一个线程。所以当它需要切换到其它不同的线程的时候,它会存储当前的状态(寄存器等等),然后加载另外一个线程。 如果幸运的话,这个切换发生在同一个核心,如果不幸的话,这个切换可能发生在不同的核心,这就需要在内核间总线上进行传输。 这个上下文的切换,会给 CPU 时钟周期带来管理调度的开销;在现代的 CPUs 上,开销估计高达 30 μs。也就是说线程会被堵塞超过 30 μs,如果这个时间用于线程的运行,极有可能早就结束了。 人们经常稀里糊涂的设置线程池的值。8 个核的 CPU,我们遇到过有人配了 60、100 甚至 1000 个线程。 这些设置只会让 CPU 实际工作效率更低。 所以,下次请不要调整线程池的线程数。如果你真 想调整 , 一定要关注你的 CPU 核心数,最多设置成核心数的两倍,再多了都是浪费
原文链接:https://www.elastic.co/guide/cn/elasticsearch/guide/current/dont-touch-these-settings.html
二、重新设置线程池核心线程大小,es数据召回耗时在60ms左右
private static final int CPU = Runtime.getRuntime().availableProcessors(); private static ExecutorService THREAD_POOL = new ThreadPoolExecutor(CPU,CPU, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadFactoryBuilder().setNameFormat("resume-nsupin-recall-%d").build());
相关推荐
接着,文档提到了Java中的异常处理机制,如Exception、RuntimeException和它们的子类,以及如何在多线程中处理这些异常。多线程编程中异常处理非常重要,因为一个线程的异常不应该影响其他线程的正常执行。 此外,...
Java多线程是Java编程中一个重要的概念,它允许程序同时执行多个任务,提升程序的效率和响应性。以下是对给定题目中涉及的多线程知识点的详细解释: 1. 异常处理:Error类不是RuntimeException的子类,且它们通常...
Java多线程异常处理是Java编程中不可或缺的一部分,特别是在并发编程场景下,正确处理异常能够保证程序的稳定性和健壮性。本实验报告主要涵盖了Java异常处理机制、多线程概念与实现,以及多线程同步问题。 首先,...
Java多线程技术是编程领域中的重要组成部分,尤其在处理并发任务、优化系统性能和管理资源方面发挥着关键作用。本话题将深入探讨如何利用Java的多线程特性来实现消息的压入栈和从栈中取出,以及其在访问网络等实际...
在Java编程中,多线程技术是实现并发执行任务的关键,尤其在开发高效能的应用程序时,如模拟电影院的购票系统。在这个系统中,我们利用Java的多线程特性来模拟多个用户同时购票的情况,确保系统的高并发处理能力。...
异常处理在多线程编程中也非常重要,线程中抛出的未检查异常(继承自`RuntimeException`)会直接导致线程中断,而检查异常则需要捕获或声明抛出。为了保证线程的健壮性,通常会在`run()`方法中添加异常处理代码。 ...
- **外部管理类**:调用目标线程的`join`方法,并传递一个超时时间。 - 如果线程在指定时间内完成,则`join`方法返回。 - 如果超时,则捕获`InterruptedException`异常。 - **目标线程类**:实现具体的业务逻辑。 ...
在Java编程中,多线程和队列是两种常见的编程概念,它们在处理并发和数据管理上发挥着重要作用。在“java多线程模拟队列实现排队叫号”这一主题中,我们将深入探讨如何利用这两种技术来模拟现实生活中常见的排队叫号...
在Java多线程编程中,异常处理是一项关键的机制,特别是在多线程环境下,由于线程的并发执行,处理异常的方式与单线程有所不同。本文将深入探讨Java多线程中的异常捕捉,以及如何有效地在多线程环境中处理异常。 ...
进入文件夹elasticsearch-6.2.4,执行命令gradlew assemble,编译完成后,进入目录elasticsearch-6.2.4/distribution/tar/build/distributions可以见到构建成功的结果:elasticsearch-6.2.4-SNAPSHOT.tar.gz,这就是...
作为一个基于Lucene构建的搜索引擎,Elasticsearch提供了分布式多用户访问的能力,并且使用Java语言编写,具备RESTful API接口,支持实时搜索和高性能计算。 Elasticsearch的特点包括但不限于: 1. **分布式架构**...
1. Java中的异常处理机制,如题目中提到的`RuntimeException`,`Error`,`Exception`等,它们是多线程编程中必须要掌握的基础知识。 2. 线程的创建和执行,包括`Thread`类的使用和`Runnable`接口的实现。例如,`...
在Java编程中,多线程下载是一种常见的优化技术,它能有效地提高大文件下载的速度和效率,通过将文件分割成多个部分并在不同的线程中同时下载。以下是对这个主题的详细解析: 一、多线程的基本概念 多线程是Java...
### Java多线程断点下载技术详解 在现代互联网应用中,大文件的高效下载是提升用户体验的关键之一。Java作为一种广泛使用的编程语言,在处理大文件下载时,采用多线程断点续传技术能显著提高下载速度和稳定性。本文...
多线程的概念是指一个进程可以包含多个线程,每个线程可以执行不同的任务。多线程的好处是可以提高程序的执行效率和响应速度。 Java 多线程的实现方式: * 继承 Thread 类 * 实现 Runnable 接口 Java 多线程的...
Web服务调用是软件开发中的常见任务,尤其是当我们需要跨系统、跨平台集成不同应用程序时。本示例将深入探讨如何使用Apache HttpClient库在Java环境中调用Web服务,特别是通过Maven构建项目的方式进行。HttpClient是...
在Java编程中,`java.lang.RuntimeException` 是一个非检查异常(unchecked exception),它表示程序运行时出现的不正常情况。通常,这类异常是由于程序员的错误或代码逻辑的疏忽造成的,例如类型转换错误、空指针...
一些常见的运行时异常,一些常见的运行时异常,一些常见的运行时异常,
在本文中,我们将深入探讨如何使用`spring-boot-starter-data-elasticsearch` 2.5.7版本进行Elasticsearch的增删改查操作。Elasticsearch是一个强大的分布式、开源的全文搜索引擎,而Spring Boot框架提供了方便快捷...
在Java编程语言中,`RuntimeException`是一类在运行时可能出现的异常,通常是由程序逻辑错误引起的,而不是由系统资源(如文件或网络)问题导致的。这类异常在编译时不会被检查,这意味着程序员需要在编写代码时格外...