ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes에서 node 내 thread 분리 이슈
    develop 2023. 8. 20. 16:01

    AWS EKS를 이용해서 Kubernetes 환경에서 서비스를 하는데, 갑자기 새벽 3시에 계속 서비스의 FD (File Descriptor)가 9,000 개 이상 차면서 서비스가 정상적으로 동작하지 않았습니다.

     

    문제가 발생할 때에 다음의 증상이 있었습니다.

    1. File Descriptor가 9,000개 이상 차면서 외부 응답에 제대로 대응하지 못했습니다.
    2. Kubernetes에서 Node is not ready 상태에 빠졌다가 돌아오는 것을 반복했습니다.
    3. Node가 문제인가 해서 보았는데, Node에서 메모리 할당이 급격히 늘었습니다.
    4. 직접적인 원인으로 Application 에서는 native thread 생성 실패가 발생하고, 이 이후에 Kubernetes의 pod가 비정상인데도 계속 Traffic을 받고 있었습니다.

    이 문제의 원인은 Kuberenetes의 같은 Node에 특정 Legacy Service가 같이 Schedule 될 때에, 해당 Service에서 Thread Leak이 있어서였습니다. 문제의 Legacy Service는 Batch 부분에 Thread Leak이 있었는데, 특정 시간에 Thread가 48,000 개 까지 Thread를 생성하고 Pod가 종료됩니다. 이 경우에 자기 자신만 종료되면 문제 없었겠지만 Node의 생성 가능한 모든 Thread를 점유하기 때문에 동일 Node에서 같이 실행되는 Pod들에 영향을 끼쳤습니다.

     

    Maximum Number of Threads per Process in Linux | Baeldung on Linux 같은 내용을 참고하면 Thread의 Default 값은 다음과 같습니다.

    $ cat /proc/sys/kernel/threads-max
    63704

    Kubernetes Node로 AWS EC2를 사용하고 있었는데, AWS EC2의 경우 Thread 개수가 위의 2배인 120,000 개 정도로 설정되어 있었습니다. 문제가 발생하는 경우 Legacy Service가 2개, 제가 담당하는 Service가 1개가 Scheduling 되었고, 이 경우 Thread Full 상황이 됩니다. Docker를 이용한 Kubernetes 환경은 VMWare 같은 가상화는 다르게 Resource를 같이 사용하지만 완전히 분리되지는 않기 때문에 이런 문제가 발생하네요.

    이 문제는 Legacy Service를 별도의 Node Group으로 Scheduling 시켜서 해결 (적어도 제 Service에는...)되었습니다.

     

    'develop' 카테고리의 다른 글

    REST API design guide  (1) 2024.02.12
    Micrometer Meter 관련 성능 이슈  (0) 2023.10.28
    Ref: Sync 10,000 Argo CD Applications in One Shot  (0) 2023.06.29
    Spring Cloud Config  (0) 2023.05.01
    openssl 1.0.2에서 untrusted chain 문제  (0) 2022.11.06
Designed by Tistory.