본문 바로가기

개발하자

Kubernetes에서 Go 컨테이너는 다른 컨테이너가 코어를 사용할 때 모든 코어를 사용합니까

반응형

Kubernetes에서 Go 컨테이너는 다른 컨테이너가 코어를 사용할 때 모든 코어를 사용합니까

시나리오: 16 코어 노드에서 Go 서비스/컨테이너는 다른 컨테이너와 함께 포드에서 실행되며, 다른 하나는 4 코어가 할당되고 Go 컨테이너는 사용하도록 설정됩니다.

고루틴을 사용하는 요청에서 바둑 프로그램은 이용 가능한 모든 CPU를 활용할 것인가. 나는 이것이 포드 시작 시 사용되는 1개의 코어만 기계에 있다고 보는지 확실하지 않다고 생각한다.

CPU 집약적인 요청이 사용 가능한 모든 CPU를 사용하는 것이 이상적이지만 실제로 런타임(GKE)에서 어떤 일이 일어나고 있는지 측정하는 데 어려움을 겪고 있습니다.

유휴 상태에서 예상되는 항목을 보여줍니다:

POD        NAME            CPU(cores)   MEMORY(bytes)
pod-go-py  go-service      1m           862Mi
pod-go-py  py-service      4m           489Mi

는 사용 가능한 16개의 코어를 보여줍니다. 그럼 바둑 프로그램이 요청에 모두 활용할 것이라고 믿어도 되는 건가요? 또한 노드의 포드를 확장할 때 Ill이 조절에 주의해야 하는 것을 상상합니다.




용기에 기계의 모든 코어가 표시됩니다. Kubernetes가 제한하는 것은 컨테이너가 소비할 수 있는 CPU의 양을 커널에 알려주는 cgroup을 설정하는 것이다. 이것은 Go가 모든 코어를 보는 반면, 그가 한계를 넘어서려고 할 때 커널이 그것을 조절한다는 것을 의미한다. 그것은 사실 나쁜 것이다. Go가 cgroup을 인식하고 GOMAXPROCS를 적절하게 확장하기를 원합니다. 그것을 위해 당신은 사용할 수 있다

당신이 원하는 것은 초과 구독인 것 같습니다. 요청을 매우 낮게 설정하고 첫 번째 컨테이너의 코어를 4개로 제한합니다. 요청을 매우 낮게 설정하지만 두 번째에는 16개 코어로 제한(또는 제한을 전혀 설정하지 않음)합니다. 그렇게 하면 두 번째 컨테이너는 모든 CPU를 활용할 수 있을 것이다.




https://github.com/gjkim42/gomaxprocs-injector

어떤 이유로든 오토고맥스 프로크를 사용하도록 애플리케이션을 수정할 수 없는 경우를 대비하여 모든 포드에 적절한 GOMAXPROCS를 주입하는 승인 컨트롤러를 만들었습니다.


반응형