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