我有一个多线程应用程序,它执行一个CPU密集型任务,我想在Kubernetes上运行它。我使用的节点有56个核心,我为我的pod设置了2个核心的请求和限制。
因为它是CPU密集型的,所以通常没有必要拥有比核心数量更多的线程(使用超线程,线程数量可能是核心数量的两倍),所以我会分配2-4个线程并将其称为一天。
然而,AFAIK,Kubernetes并不保证核心亲和力,所以在最坏的情况下,两个核心可以平均分布在56个核心上,每个核心并行工作的时间有2/56。如果发生这种情况,并且我只分配了4个线程,那么56个核心中至少有52个将处于空闲状态。
如果我理解正确的话,这个问题并不是Kubernetes独有的,它适用于任何共享硬件资源的虚拟化环境。
当涉及到处理这种潜在的最坏情况时,最佳实践是什么?你会忽略它并假设你有很高的局部性,还是做了最坏的打算,或者介于两者之间?
发布于 2020-04-05 21:07:57
线程调度依赖于包括亲和力在内的操作系统,kubernetes通常不会影响它。如果它对你的工作负载很重要-你可以尝试k8s中的Static policy,为你的应用程序提供独有的CPU核心。
您可以使用pod CPU limit 56并运行56个线程来利用所有节点核心。假设此节点上的所有其他pod使用正确的CPU请求,这应该不会对其他pod产生负面影响。
https://stackoverflow.com/questions/61026524
复制相似问题