文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  設定自旋鎖輪詢

17.8.8 設定自旋鎖輪詢

InnoDB 互斥鎖讀寫鎖通常會保留較短的時間間隔。在多核心系統上,執行緒在休眠之前,持續檢查是否可以在一段時間內取得互斥鎖或讀寫鎖可能會更有效率。如果互斥鎖或讀寫鎖在此期間變成可用,則執行緒可以在相同的時間片段中立即繼續。然而,多個執行緒過於頻繁地輪詢共用物件(例如互斥鎖或讀寫鎖)可能會導致「快取乒乓」,這會導致處理器互相使對方的快取部分失效。InnoDB 會強制在輪詢之間加入隨機延遲,以不同步輪詢活動,來盡量減少此問題。隨機延遲會實作為自旋等待迴圈。

自旋等待迴圈的持續時間取決於迴圈中發生的 PAUSE 指令的數量。該數量是透過隨機選取一個介於 0 到但不包含 innodb_spin_wait_delay 值之間的整數,並將該值乘以 50 來產生。例如,針對 innodb_spin_wait_delay 設定為 6,會從以下範圍隨機選取一個整數

{0,1,2,3,4,5}

選取的整數乘以 50,產生六個可能的 PAUSE 指令值之一

{0,50,100,150,200,250}

對於該組值,250 是在自旋等待迴圈中可能出現的 PAUSE 指令的最大數量。 innodb_spin_wait_delay 設定為 5 會產生一組五個可能的值 {0,50,100,150,200},其中 200 是 PAUSE 指令的最大數量,依此類推。藉由此方式,innodb_spin_wait_delay 設定控制自旋鎖輪詢之間的最大延遲。

在所有處理器核心共用快速快取記憶體的系統上,您可以透過將 innodb_spin_wait_delay=0 來減少最大延遲或完全停用忙碌迴圈。在具有多個處理器晶片的系統上,快取失效的影響可能更為顯著,您可以增加最大延遲。

在 100MHz Pentium 時代,innodb_spin_wait_delay 單位被校準為相當於一微秒。該時間等效性並不成立,但在 Skylake 世代處理器推出之前,PAUSE 指令持續時間在處理器週期方面相對於其他 CPU 指令保持相當恆定。 innodb_spin_wait_pause_multiplier 變數提供了一種方法來解釋 PAUSE 指令持續時間的差異。

innodb_spin_wait_pause_multiplier 變數控制 PAUSE 指令值的大小。例如,假設 innodb_spin_wait_delay 設定為 6,將 innodb_spin_wait_pause_multiplier 值從 50(預設值和先前硬編碼的值)減少到 5 會產生一組較小的 PAUSE 指令值。

{0,5,10,15,20,25}

增加或減少 PAUSE 指令值的能力允許針對不同的處理器架構微調 InnoDB。例如,對於具有相對較長的 PAUSE 指令的處理器架構,較小的 PAUSE 指令值將是合適的。

innodb_spin_wait_delayinnodb_spin_wait_pause_multiplier 變數是動態的。它們可以在 MySQL 選項檔案中指定,或者在執行時使用 SET GLOBAL 陳述式修改。在執行時修改變數需要足夠的權限來設定全域系統變數。請參閱第 7.1.9.1 節「系統變數權限」