【发布时间】: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