1、innodb_sync_spin_loops和innodb_spin_wait_delay
这两个参数与自旋锁相关:自旋锁是为保护共享资源而提出的一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用的。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就是说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看该自旋锁的保持者是否已经释放了锁,“自旋”一词就是因此而得名。(转载出处)
innodb_sync_spin_loops是在放弃CPU时间片之前进行多少次等待,innodb_spin_wait_delay是一次等待的时间。
实验:innodb_spin_wait_delay默认值是6,设置过大可能会降低性能。
(1)将该值设为180和1对应的吞吐量分别为:726tps和1017tps(前提是其他参数设置合理,只对比这一个)
(2)另一组实验:将该值设为359和1对应的吞吐量为:648tps和986tps
2、innodb_lru_scan_depth
这个参数与checkpoint+刷盘、内存置换相关(参考)。mysql使用LRU内存置换算法。
InnoDB要保证LRU列表中有100左右空闲页可使用。在InnoDB1.1.X版本前,要检查LRU中是否有足够的页用于用户查询操作线程,如果没有,会将LRU列表尾端的页淘汰,如果被淘汰的页中有脏页,会强制执行Checkpoint刷回脏页数据到磁盘,显然这会阻塞用户查询线程。从InnoDB1.2.X版本开始,这个检查放到单独的Page Cleaner Thread中进行,并且用户可以通过innodb_lru_scan_depth
控制LRU列表中可用页的数量,默认值为1024。
innodb需要保证LRU列表有innodb_lru_scan_depth个空闲页可以使用,如果没有,就会从lru列表末尾移除,如果移除的有脏页,就进行checkpoint。
实验:该值设置过大会降低性能。(设置过大会导致一直没有这么多的空闲页可用,那就一直在做checkpoint刷盘,导致性能降低)
将该值设为95000和默认值1024得到的吞吐量为:569tps和925tps
3、innodb_flush_neighbors
与刷写脏页和异步io相关。
异步IO:
用户可以在发出一个IO请求后立即再发出另一个IO请求,当全部IO请求发送完毕后,等待所有IO操作的完成,这就是AIO。
AIO另一个优势可以将多个IO,合并为1个IO,以提高IO效率。例如:用户需要访问3页内容,但这3页时连续的。同步IO需要进行3次IO,而AIO只需要一次 就可以了。使用AIO的恢复速度 提高了75%
当刷新一个脏页时,innodb会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。这样做,通过AIO将多个IO写入操作合并为一个IO操作。在传统机械磁盘下有着显著优势。
innodb_flush_neighbors 参数来控制是否开启。(来源)