MySQL CPU 많이 사용하는 세션 찾기
MySQL은 PostgreSQL, Oracle 과 같은 프로세스 기반 DB가 아니라 쓰레드 기반 DBMS입니다.
MySQL의 DB 내부 쓰레드와 OS 쓰레드를 일치시켜서 확인하는 도구가 없기 때문에
DB의 어떤 세션이 리소스를 특별히 많이 잡고 있는지 확인할 때 OS의 utility 를 사용하는 데 있어서 제한점이 있었는데요
이 문제는 5.7 버전으로 올라오면서 PERFORMANCE_SCHEMA.THREADS 테이블에 thread_os_id 컬럼이 추가되면서 확인이 쉬워졌습니다.
확인 방법
- OS - pidstat
[test@testserver 22:09:12 ~ ]$ pidstat -t -p `/sbin/pidof mysqld` 5
Linux 2.6.32-754.15.3.el6.x86_64 (testserver) 04/26/20 _x86_64_ (4 CPU)
22:09:04 TGID TID %usr %system %guest %CPU CPU Command
22:09:09 56090 - 100.00 27.00 0.00 100.00 0 mysqld
22:10:01 - 56090 0.00 0.00 0.00 0.00 0 |__mysqld
22:09:09 - 56141 39.00 3.60 0.00 42.60 3 |__mysqld
22:09:09 - 56142 48.80 4.80 0.00 53.60 1 |__mysqld
22:09:09 - 56143 0.00 0.00 0.00 0.00 0 |__mysqld
22:09:09 - 56144 0.00 0.00 0.00 0.00 0 |__mysqld
22:09:09 - 14628 38.80 5.20 0.00 44.00 3 |__mysqld
=> Usage: pidstat options interval
mysqld 프로세스의 thread만 5초 interval로 확인하는 커맨드
56141,56142,14628 OS THREAD ID를 가진 세션이 CPU를 많이 사용하는 것을 확인할 수 있음
- MySQL - performance_schema.threads
mysql> select * from performance_schema.threads where thread_os_id='56141'\G;
*************************** 1. row ***************************
THREAD_ID: 721909
NAME: thread/sql/one_connection
TYPE: FOREGROUND
PROCESSLIST_ID: 721876
PROCESSLIST_USER: admin
PROCESSLIST_HOST: localhost
PROCESSLIST_DB: NULL
PROCESSLIST_COMMAND: Query
PROCESSLIST_TIME: 16
PROCESSLIST_STATE: Sending data
PROCESSLIST_INFO: select SQL_NO_CACHE * from test.tb_test
PARENT_THREAD_ID: NULL
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: Socket
THREAD_OS_ID: 56141
RESOURCE_GROUP: USR_default
1 row in set (0.00 sec)
ERROR:
No query specified
=> OS에서 pidstat 으로 확인한 OS thread id 로 DB 내에서 어떤 세션인지 매핑하여 확인 가능
- memory
mysql> show tables like 'memory%';
+-----------------------------------+
| Tables_in_sys (memory%) |
+-----------------------------------+
| memory_by_host_by_current_bytes |
| memory_by_thread_by_current_bytes |
| memory_by_user_by_current_bytes |
| memory_global_by_current_bytes |
| memory_global_total |
+-----------------------------------+
5 rows in set (0.00 sec)
=> thread별 memory 사용률은 sys schema에서 제공하는 정보로 확인 가능,memory_by_thread_by_current_bytes