采用性能分析工具perf top -p
mysqld进程
在测试mysql数据库时,用perf top如果看到热点函数是ut_delay或者_raw_spin_lock的话,说明锁争用比较严重。
ut_delay
这是innodb的一个自旋琐。也就是说,在这里由于锁等待,innodb不停地在作cpu空转.
由于cpu速度远高于io速度,线程之间需要等待。在压力环境下,多个cpu就会互相等待资源。使用自旋琐的本意是尽量减少调用mutesx锁的时间来提升性能。若自旋等待超过仍未获取资源,则使用mutex。
ut_delay占用cpu比例高,说明很可能大量的自旋过程都浪费了。如果大多数的自旋锁最后都使用mutex,则说明自旋过程是没有必要的,相反会消耗cpu资源。
这是可以通过登录mysql通过show variables like '%spin%';
来查询
mysql> show variables like '%spin%';
+------------------------------------+-------+
| Variable_name | Value |
+------------------------------------+-------+
| innodb_log_spin_cpu_abs_lwm | 80 |
| innodb_log_spin_cpu_pct_hwm | 50 |
| innodb_log_wait_for_flush_spin_hwm | 400 |
| innodb_spin_wait_delay | 6 |
| innodb_spin_wait_pause_multiplier | 50 |
| innodb_sync_spin_loops | 30 |
+------------------------------------+-------+
6 rows in set (0.05 sec)
innodb_spin_wait_delay
:
innodb_sync_spin_loops
:
innodb_sync_spin_loops是在放弃CPU时间片之前进行多少次等待,innodb_spin_wait_delay是一次等待的时间。
这里直接将innodb_sync_spin_loops=0
ut_delay
占用率下降
参考
http://blog.sina.com.cn/s/blog_704836f401015ayb.html