目前,我正在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;
}
}
}
这是由于缺乏对 Pod 的记忆。该过程使它们耗尽内存,导致它们重新启动,这是通过为它们分配更多内存来解决的。