Atualmente, a solução de problemas de um servidor MySQL passa muito tempo em syscalls de futuros. Todos os bancos de dados são InnoDB e vejo alta carga na minha máquina de 16 núcleos, e pouco mais da metade do tempo de CPU está no sistema.
Correndo strace em um processo mostra que gastar muito tempo em 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
A parte da minha configuração relevante para o InnoDB é a seguinte, innodb_thread_concurrency é definida como 16, o que corresponde à contagem de CPU, então estou surpreso que ela esteja esperando por futex tanto quanto é:
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
Que outro tipo de coisa poderia causar longas esperas por futex? É possível que haja problemas com o nosso host que possam estar causando isso?