在mysql5.5以及之前的版本,kernel_mutex一直是性能的大殺器,在innodb層,被廣泛的使用。全局鎖是大招,殺死一大片的。之前percona將buffer pool mutex進行了拆分,性能得到了很大的提高。
幸運的是,mysql官方已經意識到了這個問題,在5.6裏已經把kernel_mutex給幹掉了;不幸的是,離用上生產環境還遙遙無期。
kernel_mutex主要用於保護innodb子系統,主要包括如下幾個模塊:
1.鎖管理2.事務系統
3.MVCC
當上述子模塊的狀態發生變化時,都需要持有該鎖。
在5.6里根據模塊對kernel_mutex進行了拆分,主要分成了以下幾個鎖:
trx_sys_t::lock (rw_lock)
讀寫鎖,用來保護全局事務鏈表,該鏈表在創建read_view或執行類似‘show engine innodb status’這樣的命令時會被用到。
當開啓事務或結束事務(commit/rollback)時會修改鏈表
trx_t::mutex
當事務的狀態等發生變化時,需要持有該鎖(mutex_own(&t->mutex))
lock_sys_t::mutex 和 lock_sys_t::wait_mutex
用於保護全局鎖數據結構
通過這種拆分可以提高innodb的併發能力。