Jaehong Jung

"왜 CPU가 throttling을 하나요?"에 답해보세요

cpulinux

어젯밤, 같은 대학교 후배가 슬랙에 짧은 질문을 하나 올렸다.

질문 스크린샷

CPU가 왜 Throttling을 하나요

나는 이 질문을 보고 바로 답변을 달았다. 어찌 보면 뻔한, 너무나도 1차원적인 답변이었다.

내 답변 스크린샷

주어진 CPU 자원보다 더 많은 CPU를 필요로 해서?

그리고 조금 더 자세한 답변을 머릿속으로 정리하고 있었다.

그때, 다른 친구가 답변을 달아주었다.

다른 친구의 답변

연산 속도가 빠른 만큼 열이 더 많이 발생하는데, 너무 뜨거워지면 녹아버리니 속도를 늦추는 것이지요

순간 머리가 멍해졌다.

나는 왜 throttling이 발생하는지에 대한 답변을 달았고, 이 친구는 왜 CPU에 throttling이 존재해야 하는지에 대한 답변을 달았다.

같은 질문, 완전히 다른 해석.

하나의 질문, 여섯 가지 의도

“왜 CPU가 throttling을 하나요?”

이 한 문장을 받았을 때, 이 글을 읽는 여러분은 어떤 답변을 할 것인가?

조금만 생각해보면, 이 질문에는 놀라울 정도로 다양한 의도가 숨어 있을 수 있다.

  1. 운영 관점 — 서버에서 지금 CPU throttling이 발생하는데, 원인이 뭔지?
  2. 비교 관점 — Memory는 OOM이 발생하는데, CPU는 왜 throttling이라는 방식을 쓰는지?
  3. 원리 관점 — 왜 CPU에 throttling이라는 개념이 애초에 존재하는지, 그 유래는?
  4. 조건 관점 — 일반적으로 어떤 조건에서 throttling이 걸리는지? quota 초과? 경합?
  5. 구현 관점 — throttling이 어떻게 구현되어있는건지? (e.g. CFS quota, cgroup, …)
  6. 최적화 관점 — throttling이 발생하면 어떻게 해결하거나 회피하는지?

나는 굉장히 단순하게 4번의 의도로 읽었고, 다른 친구는 3번의 의도로 읽었다.

내가 달았던 두 번째 답변

나는 2번 관점에서 조금 더 자세한 답변을 이어갔다.

메모리는 기본적으로 공간을 점유하는 개념. 한정된 공간에 물건을 넣는 것과 같아서, 공간이 꽉 차면 더 이상 할당할 수 없음. 그래서 메모리는 한계를 넘으면 OOM(Out of Memory) 에러를 내고 프로세스를 아예 죽여버림.

하지만 CPU는 공간보다는 시간의 개념. 각 프로세스가 돌아가면서 시간을 소비하는 자원. 한 프로세스가 독점하지 않고, time slicing으로 여러 프로세스가 나눠 씀. 즉, CPU는 본질적으로 공유 가능한 자원.

그래서 throttling이라는 개념이 성립한다. 어떤 프로세스가 할당된 CPU quota를 초과하면, OOM처럼 바로 죽이는 게 아니라 “다음 턴까지 기다려라”고 실행을 일시 중지시킬 수 있음.

메모리는 공간, CPU는 시간. 이 차이가 OOM과 throttling이라는 서로 다른 제한 방식을 만들어낸다. 일단은 위 대답으로 감사인사를 받았다 (궁금증이 완전히 해소되었는지는 모르겠지만).

감사 인사

그리고 남은 질문

감사 인사를 받자마자, 곧바로 또 다른 관점에서 질문이 이어졌다.

후속 질문

전체 pod의 cpu.requests 합 <= cpu 코어 수 여야하나..? 얼마전에 cpu.requests 올렸더니 응답 시간이 빨라지는 것을 경험했는데, 이건 다른 파드들에게

  1. 시분할 우선권이 있는건지?
  2. 그때 전체 cpu 사용량이 많아서 노드 전체 쓰로틀링이 걸린건지..?

이번에는 Kubernetes 환경에서의 CPU scheduling에 대한 구체적인 질문이었다. 예전에 읽었던 LINE의 Kubernetes CPU 효율화 글을 공유하면서, pod scheduling과 CPU request, 그리고 시분할 우선권에 대한 답변을 남겼다.

배운 점

어찌 보면 간단한 질문이다. 하지만 오히려 너무 간단하기 때문에, 질문의 의도가 무엇인지, 어떤 답변을 원하는지, 어떤 배경 지식이 있는지를 파악하는 것이 더 중요해진다.

단순한 질문에도 다양한 답변이 나올 수 있고, 그 답변들은 질문자의 의도와 배경에 따라 완전히 달라진다.

곧바로 “조금 더 자세히 설명해달라”고 요청할 수도 있었지만, 어젯밤에 이 친구는 CPU throttling에 대해 무엇이 궁금했을까? 그리고 나는 그 질문을 어떻게 대답해줄 수 있을까? 고민하는 그 과정이 너무 즐거웠다.