threads
資料表包含每個伺服器執行緒的一列。每一列都包含執行緒的資訊,並指出是否為該執行緒啟用監控與歷史事件記錄。
mysql> SELECT * FROM performance_schema.threads\G
*************************** 1. row ***************************
THREAD_ID: 1
NAME: thread/sql/main
TYPE: BACKGROUND
PROCESSLIST_ID: NULL
PROCESSLIST_USER: NULL
PROCESSLIST_HOST: NULL
PROCESSLIST_DB: mysql
PROCESSLIST_COMMAND: NULL
PROCESSLIST_TIME: 418094
PROCESSLIST_STATE: NULL
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: NULL
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: NULL
THREAD_OS_ID: 5856
RESOURCE_GROUP: SYS_default
EXECUTION_ENGINE: PRIMARY
CONTROLLED_MEMORY: 1456
MAX_CONTROLLED_MEMORY: 67480
TOTAL_MEMORY: 1270430
MAX_TOTAL_MEMORY: 1307317
TELEMETRY_ACTIVE: NO
...
當 Performance Schema 初始化時,它會根據當時存在的執行緒來填入 threads
資料表。之後,每次伺服器建立執行緒時,都會新增一列。
新執行緒的 INSTRUMENTED
與 HISTORY
資料行值,取決於 setup_actors
資料表的內容。如需瞭解如何使用 setup_actors
資料表來控制這些資料行,請參閱 章節 29.4.6, 「依據執行緒進行預先篩選」。
當執行緒結束時,會從 threads
資料表中移除列。對於與用戶端工作階段相關聯的執行緒,當工作階段結束時就會移除。如果用戶端已啟用自動重新連線,且工作階段在斷線後重新連線,則該工作階段會與 threads
資料表中具有不同 PROCESSLIST_ID
值的新列建立關聯。新執行緒的初始 INSTRUMENTED
與 HISTORY
值可能與原始執行緒的值不同:setup_actors
資料表可能在此期間已變更,而且如果原始執行緒的 INSTRUMENTED
或 HISTORY
值在列初始化後已變更,則該變更不會延續至新執行緒。
您可以啟用或停用執行緒監控(也就是執行緒執行的事件是否儀器化)與歷史事件記錄。若要控制新前景執行緒的初始 INSTRUMENTED
與 HISTORY
值,請使用 setup_actors
資料表。若要控制現有執行緒的這些方面,請設定 threads
資料表列的 INSTRUMENTED
與 HISTORY
資料行。(如需關於發生執行緒監控與歷史事件記錄的條件的詳細資訊,請參閱 INSTRUMENTED
與 HISTORY
資料行的說明。)
若要比較 threads
資料表與名稱具有 PROCESSLIST_
前置詞的資料行與其他程序資訊來源,請參閱 程序資訊的來源。
對於非 threads
表格的執行緒資訊來源,只有在目前使用者擁有 PROCESS
權限時,才會顯示其他使用者的執行緒資訊。但 threads
表格並非如此;任何擁有該表格 SELECT
權限的使用者,都會顯示所有列。若不應讓使用者透過存取 threads
表格看到其他使用者的執行緒,則不應給予他們該表格的 SELECT
權限。
threads
表格有以下這些欄位:
THREAD_ID
獨特的執行緒識別碼。
NAME
與伺服器中執行緒檢測程式碼相關聯的名稱。例如,
thread/sql/one_connection
對應於程式碼中負責處理使用者連線的執行緒函式,而thread/sql/main
代表伺服器的main()
函式。TYPE
執行緒類型,為
FOREGROUND
或BACKGROUND
。使用者連線執行緒是前景執行緒。與內部伺服器活動相關的執行緒是背景執行緒。例如,內部InnoDB
執行緒、傳送資訊到複本的「「binlog dump」」執行緒,以及複寫 I/O 和 SQL 執行緒。PROCESSLIST_ID
對於前景執行緒(與使用者連線相關),這是連線識別碼。此值與
INFORMATION_SCHEMA
PROCESSLIST
表格的ID
欄位中顯示的值相同,也會顯示在SHOW PROCESSLIST
輸出的Id
欄位中,並由執行緒中的CONNECTION_ID()
函式傳回。對於背景執行緒(與使用者連線無關),
PROCESSLIST_ID
為NULL
,因此這些值不是唯一的。PROCESSLIST_USER
與前景執行緒相關聯的使用者,背景執行緒為
NULL
。PROCESSLIST_HOST
與前景執行緒相關聯的用戶端主機名稱,背景執行緒為
NULL
。與
INFORMATION_SCHEMA
PROCESSLIST
表格的HOST
欄位或SHOW PROCESSLIST
輸出的Host
欄位不同,PROCESSLIST_HOST
欄位不包含 TCP/IP 連線的連接埠號碼。若要從 Performance Schema 取得此資訊,請啟用 Socket 檢測(預設為未啟用),並檢查socket_instances
表格。mysql> SELECT NAME, ENABLED, TIMED FROM performance_schema.setup_instruments WHERE NAME LIKE 'wait/io/socket%'; +----------------------------------------+---------+-------+ | NAME | ENABLED | TIMED | +----------------------------------------+---------+-------+ | wait/io/socket/sql/server_tcpip_socket | NO | NO | | wait/io/socket/sql/server_unix_socket | NO | NO | | wait/io/socket/sql/client_connection | NO | NO | +----------------------------------------+---------+-------+ 3 rows in set (0.01 sec) mysql> UPDATE performance_schema.setup_instruments SET ENABLED='YES' WHERE NAME LIKE 'wait/io/socket%'; Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> SELECT * FROM performance_schema.socket_instances\G *************************** 1. row *************************** EVENT_NAME: wait/io/socket/sql/client_connection OBJECT_INSTANCE_BEGIN: 140612577298432 THREAD_ID: 31 SOCKET_ID: 53 IP: ::ffff:127.0.0.1 PORT: 55642 STATE: ACTIVE ...
PROCESSLIST_DB
執行緒的預設資料庫,如果沒有選擇任何資料庫,則為
NULL
。PROCESSLIST_COMMAND
對於前景執行緒,這是執行緒代表用戶端執行的命令類型,如果會話處於閒置狀態,則為
Sleep
。如需執行緒命令的描述,請參閱 第 10.14 節,「檢查伺服器執行緒 (處理序) 資訊」。此欄位的值對應於用戶端/伺服器協定的COM_
命令和xxx
Com_
狀態變數。請參閱 第 7.1.10 節,「伺服器狀態變數」。xxx
背景執行緒不會代表用戶端執行命令,因此此欄位可能為
NULL
。PROCESSLIST_TIME
執行緒處於目前狀態的時間(以秒為單位)。對於複本 SQL 執行緒,此值是上次複寫事件的時間戳記與複本主機實際時間之間的時間差(以秒為單位)。請參閱 第 19.2.3 節,「複寫執行緒」。
PROCESSLIST_STATE
表示執行緒正在執行的動作、事件或狀態。如需
PROCESSLIST_STATE
值的描述,請參閱 第 10.14 節,「檢查伺服器執行緒 (處理序) 資訊」。如果值為NULL
,則執行緒可能對應於閒置的用戶端會話,或其正在執行的工作沒有使用階段進行檢測。大多數狀態對應於非常快速的操作。如果執行緒在給定狀態下停留數秒,則可能存在值得調查的問題。
PROCESSLIST_INFO
執行緒正在執行的陳述式,如果未執行任何陳述式,則為
NULL
。該陳述式可能是傳送到伺服器的陳述式,也可能是執行其他陳述式的最內層陳述式。例如,如果CALL
陳述式執行了一個正在執行SELECT
陳述式的預存程序,則PROCESSLIST_INFO
值會顯示SELECT
陳述式。PARENT_THREAD_ID
如果此執行緒是子執行緒(由另一個執行緒產生),則這是產生執行緒的
THREAD_ID
值。ROLE
未使用。
INSTRUMENTED
是否檢測執行緒執行的事件。值為
YES
或NO
。對於前景執行緒,初始
INSTRUMENTED
值取決於與執行緒相關聯的使用者帳戶是否符合setup_actors
表格中的任何列。比對是根據PROCESSLIST_USER
和PROCESSLIST_HOST
欄位的值。如果執行緒產生子執行緒,則會針對為子執行緒建立的
threads
表格列再次進行比對。對於背景執行緒,預設情況下
INSTRUMENTED
為YES
。由於背景執行緒沒有相關聯的使用者,因此不會查詢setup_actors
。對於任何執行緒,其
INSTRUMENTED
值都可以在執行緒的生命週期內變更。
若要監控執行緒執行的事件,必須符合以下條件:
setup_consumers
表格中的thread_instrumentation
消費者必須為YES
。threads.INSTRUMENTED
欄位必須為YES
。只有在
setup_instruments
表格中,其ENABLED
欄位設定為YES
的檢測產生執行緒事件時,才會進行監控。
HISTORY
是否記錄執行緒的歷史事件。值為
YES
或NO
。對於前景執行緒,初始
HISTORY
值取決於與執行緒相關聯的使用者帳戶是否符合setup_actors
表格中的任何列。比對是根據PROCESSLIST_USER
和PROCESSLIST_HOST
欄位的值。如果執行緒產生子執行緒,則會針對為子執行緒建立的
threads
表格列再次進行比對。對於背景執行緒,預設情況下
HISTORY
為YES
。由於背景執行緒沒有相關聯的使用者,因此不會查詢setup_actors
。對於任何執行緒,其
HISTORY
值都可以在執行緒的生命週期內變更。
若要記錄執行緒的歷史事件,必須符合以下條件:
setup_consumers
表格中,與歷史相關的適當消費者必須啟用。例如,在events_waits_history
和events_waits_history_long
表格中記錄等待事件,需要將對應的events_waits_history
和events_waits_history_long
消費者設定為YES
。threads.HISTORY
欄位必須為YES
。只有在
setup_instruments
表格中,其ENABLED
欄位設定為YES
的檢測產生執行緒事件時,才會進行記錄。
CONNECTION_TYPE
用於建立連線的協定,背景執行緒為
NULL
。允許的值為TCP/IP
(未使用加密建立的 TCP/IP 連線)、SSL/TLS
(使用加密建立的 TCP/IP 連線)、Socket
(Unix Socket 檔案連線)、Named Pipe
(Windows 具名管道連線)和Shared Memory
(Windows 共用記憶體連線)。THREAD_OS_ID
由底層作業系統定義的執行緒或工作識別碼(如果有的話)。
當 MySQL 執行緒在其生命週期內與相同的作業系統執行緒相關聯時,
THREAD_OS_ID
會包含作業系統執行緒 ID。當 MySQL 線程在其生命週期中未與相同的作業系統線程關聯時,
THREAD_OS_ID
會包含NULL
。當使用線程池外掛程式時,這對於使用者工作階段來說是很典型的狀況(請參閱第 7.6.3 節,「MySQL Enterprise 線程池」)。
對於 Windows,
THREAD_OS_ID
對應於在 Process Explorer 中可見的線程 ID (https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)。對於 Linux,
THREAD_OS_ID
對應於gettid()
函數的值。例如,此值會透過 perf 或 ps -L 指令公開,或在proc
檔案系統中公開 (/proc/
)。如需更多資訊,請參閱[pid]
/task/[tid]
perf-stat(1)
、ps(1)
和proc(5)
的 man 頁面。RESOURCE_GROUP
資源群組標籤。如果目前的平台或伺服器設定不支援資源群組,則此值為
NULL
(請參閱資源群組限制)。EXECUTION_ENGINE
查詢執行引擎。該值為
PRIMARY
或SECONDARY
。適用於 HeatWave Service 和 HeatWave,其中PRIMARY
引擎是InnoDB
,而SECONDARY
引擎是 HeatWave (RAPID
)。對於 MySQL 社群版伺服器、MySQL 企業版伺服器(本地部署)和不含 HeatWave 的 HeatWave Service,該值永遠為PRIMARY
。CONTROLLED_MEMORY
線程使用的受控記憶體量。
MAX_CONTROLLED_MEMORY
在線程執行期間看到的
CONTROLLED_MEMORY
最大值。TOTAL_MEMORY
線程目前使用的記憶體量,無論是否受控。
MAX_TOTAL_MEMORY
在線程執行期間看到的
TOTAL_MEMORY
最大值。TELEMETRY_ACTIVE
線程是否附加了作用中的遙測工作階段。該值為
YES
或NO
。
threads
表格具有下列索引
以 (
THREAD_ID
) 作為主要索引鍵以 (
NAME
) 作為索引以 (
PROCESSLIST_ID
) 作為索引以 (
PROCESSLIST_USER
,PROCESSLIST_HOST
) 作為索引以 (
PROCESSLIST_HOST
) 作為索引以 (
THREAD_OS_ID
) 作為索引以 (
RESOURCE_GROUP
) 作為索引
不允許對 threads
表格使用 TRUNCATE TABLE
。