kubernetes 환경에서 실행되는 mysql pod의 cpu 사용률이 높아서 어느 쿼리가 실행되서 cpu 사용률이 높은지 확인해보았습니다.
mysql이 실행되는 worker node 서버에서 명령어를 입력합니다.
pidstat -t -p `pidof mysqld` 5
해당 명령어는 mysqld 프로세스와 그 내부의 각 스레드가 5초 간격으로 소비하는 cpu 및 기타 리소스 사용량을 모니터링합니다.
명령어의 각각의 의미는 아래와 같습니다.
pidstat : 특정 pid의 cpu, 메모리, 디스크 사용량을 출력합니다.
-t : 해당 프로세스의 모든 스레드(thread)별 통계를 함께 보여줍니다.
-p : 모니터링할 특정 프로세스 id를 지정합니다.
pidof mysqld : mysql 서버 프로세스(mysqld)의 프로세스 id(pid)를 찾아 출력합니다.
5 : 5초 간격으로 cpu 사용률 등의 정보를 갱신하여 출력하라는 의미입니다.
해당 명령어를 입력한 결과는 아래와 같습니다.

TID(쓰레드 아이디)가 9030인 쓰레드가 CPU 사용률이 높은것을 확인할수 있습니다.
해당 쓰레드가 무슨 쿼리인지 확인해보기 위해서는 아래의 쿼리를 실행하면 됩니다.
SELECT * FROM performance_schema.threads WHERE thread_os_id = {확인한_TID};
그런데 해당 쿼리를 실행했을때 조회가 0건이 되었습니다.
where절을 없애고 쿼리를 실행하였을때도 조회가 0건이 되었습니다.
해당 사유는 mysql에서 Performance Schema가 기본적으로 비활성화되어 있어서 그럴 수 있다는 내용을 확인하고 아래의 쿼리를 실행해보니 값이 OFF(비활성화)인 것을 확인하였습니다.
SHOW VARIABLES LIKE 'performance_schema';
Performance Schema값을 활성화 시키기 위해서는 mysql 설정파일(my.cnf or my.ini)에서 performance_schema=ON으로 설정하고 서버를 재시작해야 합니다.
Bitnami의 MariaDB Helm 차트를 통해 mysql를 실행하고 있어서 yaml 파일에 아래의 내용을 추가해서 mysql 설정파일에 performance_schema=ON 가 적용되게 해야 합니다.
mariadb:
configuration: |
[mysqld]
performance_schema=ON
yaml 파일을 수정하고 helm upgrade 하면 mariadb가 재시작 되고 이전에 실행했던 쓰레드별 쿼리를 확인하는 쿼리를 입력하면 아래와 같이 조회가 되는것을 확인할 수 있습니다.
select * from performance_schema.threads;

그런데 호스트와 컨테이너(kubernetes 환경에서 실행되는 mysql)에서 사용되는 pid 네임스페이스가 다르기 때문에 쓰레드 아이디가 달랐습니다.
kubectl을 이용해 컨테이너 내부에서 pidstat를 실행하면 performance_schema.threads의 THREAD_OS_ID와 일치하는 값을 확인할 수 있습니다.
'개발 > Kubernetes' 카테고리의 다른 글
KST 타임존 설정 문제 해결: Pod 컨테이너 설정 방법 (0) | 2024.08.23 |
---|---|
Kubernetes에서 Pod 일시중단하는 방법 - 효율적인 관리 전략 (0) | 2024.08.02 |