目前正在对 MySQL 服务器进行故障排除,该服务器在 futex 系统调用上花费了大量时间。所有数据库都是 InnoDB,并且在我的 16 核机器上负载很高,并且超过一半的 CPU 时间都在系统中。
对某个进程运行 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 相关的部分如下,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 长时间等待?我们的主机是否有问题,从而导致这种情况?