MySQL(InnoDB) – 等待futex的进程

目前正在解决一个在futex系统调用中花费大量时间的MySQL服务器。 所有的数据库都是InnoDB,在我的16核心机器上看到了很高的负载,稍微超过一半的CPU时间在系统中。

在stream程上运行strace显示它花费了大量的时间在futex上

root@db1:~# strace -c -p 5026 Process 5026 attached ^CProcess 5026 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 99.95 9.583778 3651 2625 897 futex 0.02 0.001987 86 23 poll 0.01 0.001349 337 4 pwrite 0.01 0.000702 351 2 access 0.01 0.000561 5 121 sendto 0.00 0.000410 3 125 23 recvfrom 0.00 0.000082 41 2 setsockopt 0.00 0.000071 36 2 getpeername 0.00 0.000000 0 74 read 0.00 0.000000 0 18 write 0.00 0.000000 0 4 open 0.00 0.000000 0 6 close 0.00 0.000000 0 14 1 lstat 0.00 0.000000 0 45 lseek 0.00 0.000000 0 7 pread 0.00 0.000000 0 5 sched_yield 0.00 0.000000 0 2 shutdown 0.00 0.000000 0 2 unlink 0.00 0.000000 0 3 3 readlink ------ ----------- ----------- --------- --------- ---------------- 100.00 9.588940 3084 924 total 

InnoDB相关的configuration部分如下,innodb_thread_concurrency被设置为16,它匹配CPU的数量,所以我很惊讶它等待futex尽可能多:

 innodb_buffer_pool_size = 26000M innodb_log_file_size = 1250M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT innodb_flush_neighbors = 0 innodb_log_files_in_group = 3 innodb_log_buffer_size = 8M innodb_thread_concurrency = 16 innodb_file_io_threads = 4 innodb_lock_wait_timeout = 180 innodb_file_per_table innodb_max_dirty_pages_pct = 90 

还有什么可能导致长时间等待futex? 是否有可能是我们的主机有可能造成这个问题吗?