-
Kubernetes에서 node 내 thread 분리 이슈develop 2023. 8. 20. 16:01
AWS EKS를 이용해서 Kubernetes 환경에서 서비스를 하는데, 갑자기 새벽 3시에 계속 서비스의 FD (File Descriptor)가 9,000 개 이상 차면서 서비스가 정상적으로 동작하지 않았습니다.
문제가 발생할 때에 다음의 증상이 있었습니다.
- File Descriptor가 9,000개 이상 차면서 외부 응답에 제대로 대응하지 못했습니다.
- Kubernetes에서 Node is not ready 상태에 빠졌다가 돌아오는 것을 반복했습니다.
- Node가 문제인가 해서 보았는데, Node에서 메모리 할당이 급격히 늘었습니다.
- 직접적인 원인으로 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