【问题标题】:Multi Thread (ExecutorService) Java on GCPGCP 上的多线程(ExecutorService)Java
【发布时间】:2020-09-24 22:13:02
【问题描述】:

目前我正在使用 GCP 上的演示,我从存储桶中读取了一个巨大的文件并执行了一些处理,然后将结果写入另一个存储桶。

读取文件后,我使用 ExecutorService 将文件的每一行发送到一个线程,问题是我已经使用 50、25 和 10 个线程 (Executors.newFixedThreadPool(10);) 测试了该进程并且在本地工作得很好好吧(有 10 和 25 个线程),但是,一旦我在 GCP Kubernetes 上部署项目,它就会在某个时候死掉(没有日志没有错误,pod 就死了,然后重新启动)。

知道为什么会发生这种情况吗?

配置; 1 个集群 (1.14.10-gke.36) 3vCPU,7.5gb ram,我有 3 个节点,每个节点有 1 个 vCPU 和 2.77gb RAM,扩展与单个 pod 相同。

部分代码;

  void someMethod (List<String> strings){
    ExecutorService executor = Executors.newFixedThreadPool(10);

    strings.forEach(string -> {
        executor.execute(()-> {
                //Some code...
                toProcess(string);
                //Some code...
        });
    });
    executor.shutdown();
    // Wait until all threads are finished
    while (!executor.isTerminated()) {}

    //Some more things to finish
  }

  public void toProcess(String string){
        Processable[] toDo = {someVisitors};
                for (Processable process : toDo) {
                    if(process.accept(address)) {
                        break;
                    }

                }
  }

【问题讨论】:

  • 很难在没有任何错误消息的情况下为您提供帮助,但是,我想到的是节点可能没有足够的资源来完成该过程,因此正在重新启动。你能在 Stackdriver 中检查特定 pod 的日志,看看除了重启之外是否还有任何消息?
  • 最后是分配给 POD 的内存,必须提高数量,现在完美运行,谢谢!

标签: java google-cloud-platform google-kubernetes-engine executorservice


【解决方案1】:

这是由于 Pod 内存不足。该过程使它们耗尽内存,导致它们重新启动,这是通过为它们分配更多内存来解决的。

【讨论】:

  • 经过多次测试,问题主要是CPU,其次是内存,该进程需要3vCPU和至少6gb ram。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 2011-11-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多