Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 你的服务很慢,有时会挂断_Java_Multithreading_Kubernetes_Executorservice_Threadpoolexecutor - Fatal编程技术网

Java 你的服务很慢,有时会挂断

Java 你的服务很慢,有时会挂断,java,multithreading,kubernetes,executorservice,threadpoolexecutor,Java,Multithreading,Kubernetes,Executorservice,Threadpoolexecutor,我正在调用多个RESTAPI,为此我使用ExecutorService进行并行处理。消费者每秒钟点击我的应用程序超过10次,我观察到ExecutorService响应非常慢。我已经使用TomcatWeb服务器在kubernetes上部署了我的应用程序。 下面是我的代码,不确定是什么原因导致速度变慢 ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(100); Collection t

我正在调用多个RESTAPI,为此我使用
ExecutorService
进行并行处理。消费者每秒钟点击我的应用程序超过10次,我观察到
ExecutorService
响应非常慢。我已经使用TomcatWeb服务器在kubernetes上部署了我的应用程序。 下面是我的代码,不确定是什么原因导致速度变慢

   ExecutorService WORKER_THREAD_POOL = Executors.newFixedThreadPool(100);

            Collection tasks = new ArrayList();
  for( String str: datalist){
 tasks.add(new MyThreadPool(str)); // MyThreadPool internally calls the REST API using Google HttpRequest.
}
 List<Future<BasePolicy>> futures = null;
            try {
                long startProcessingTime = System.currentTimeMillis();
                futures = WORKER_THREAD_POOL.invokeAll(tasks);
                WORKER_THREAD_POOL.shutdown();

                if (!WORKER_THREAD_POOL.awaitTermination(60000, TimeUnit.SECONDS)) {
                    WORKER_THREAD_POOL.shutdownNow();
                }

                long totalProcessingTime = System.currentTimeMillis() - startProcessingTime;
                log.info("total time to complete the thread pool- " + totalProcessingTime);
            } catch (InterruptedException e) {
                log.error("error occured during ASYNC process ");
                e.printStackTrace();
            }
            log.info("Finished Waiting All threads completed ");
            for (Future<Data> mFuture : futures) {
               // my logic 
            }
ExecutorService WORKER\u THREAD\u POOL=Executors.newFixedThreadPool(100);
收集任务=新建ArrayList();
for(字符串str:datalist){
tasks.add(newmythreadpool(str));//MyThreadPool使用googlehttprequest在内部调用restapi。
}
列表期货=空;
试一试{
long startProcessingTime=System.currentTimeMillis();
futures=WORKER\u THREAD\u POOL.invokeAll(任务);
辅助线程池.shutdown();
如果(!工作者线程池等待终止(60000,时间单位秒)){
辅助线程池.shutdownNow();
}
long totalProcessingTime=System.currentTimeMillis()-startProcessingTime;
log.info(“完成线程池的总时间-”+totalProcessingTime);
}捕捉(中断异常e){
log.error(“异步过程中发生错误”);
e、 printStackTrace();
}
log.info(“完成等待所有线程完成”);
for(未来:未来){
//我的逻辑
}
我观察到服务响应非常慢

让我们从这个问题开始:你的机器有多少内核
对于,
newFixedThreadPool
,建议从机器中的内核数开始(如果任务是长时间运行的任务)。如果值为
100
,您的CPU将忙于调度和上下文切换。最重要的是,由于它是一个
newFixedThreadPool
,所以许多线程将保留在池中,即使在CPU中的负载较低时也是如此

正如在有效的Java中所建议的那样,
newCachedThreadPool
通常会起到很好的作用。 更多关于线程池

如果你预计负载会很重,我认为在多台服务器上部署应用程序是明智的做法(这取决于单个服务器的容量)。线程不会有帮助,最终会使你的应用程序变慢

我观察到服务响应非常慢

让我们从这个问题开始:你的机器有多少内核
对于,
newFixedThreadPool
,建议从机器中的内核数开始(如果任务是长时间运行的任务)。如果值为
100
,您的CPU将忙于调度和上下文切换。最重要的是,由于它是一个
newFixedThreadPool
,所以许多线程将保留在池中,即使在CPU中的负载较低时也是如此

正如在有效的Java中所建议的那样,
newCachedThreadPool
通常会起到很好的作用。 更多关于线程池


如果你预计负载会很重,我认为在多台服务器上部署应用程序是明智的做法(这取决于单个服务器的容量)。线程不会有任何帮助,最终会使你的应用程序变慢。

当你在kubernetes部署应用程序时,如果你没有指定
内存
cpu
要求,那么kubernetes调度程序会尽最大努力将pod调度到一个节点中,这可能会导致pod饥饿甚至被逐出

通过如下指定
内存
cpu
要求,可以帮助调度器做出更好的调度决策

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    env:
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m" 

这将确保pod调度在一个节点上,该节点可以满足从
64Mi
内存开始,
250m
cpu开始的要求,并允许其突发到
128Mi
内存,
500m
cpu。

在kubernetes中部署应用程序时,如果未指定
内存
cpu
要求,则kubernetes调度程序会尽最大努力将pod调度到一个节点中,这可能导致pod不足甚至被逐出

通过如下指定
内存
cpu
要求,可以帮助调度器做出更好的调度决策

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: images.my-company.example/app:v4
    env:
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m" 

这将确保pod被安排在一个节点上,该节点可以满足从
64Mi
内存、
250m
cpu开始的要求,并允许它突发到
128Mi
内存、
500m
cpu。

我认为可能是外部服务没有快速响应。您是否检查了从外部服务获取响应需要多长时间?@harry,我的后端rest服务响应速度很快我已设置并验证了计时器。如果我一次收到一个请求,但只有当多个请求到达我的服务时,它才起作用,然后我看到缓慢和挂起的问题。我认为可能是外部服务没有快速响应。您是否检查了从外部服务获取响应需要多长时间?@harry,我的后端rest服务响应速度很快我已设置并验证了计时器。如果我一次收到一个请求,但只有当多个请求到达我的服务时,它才起作用,那么我会看到缓慢和挂起的问题