Eu tenho lutado com um problema de desempenho em um dos meus servidores por algumas semanas.
Configuração: Servidor dedicado com Ubuntu 16.04, Mysql 5.7.21 (todos MyISAM), Apache 2.4.18 (mpm prefork), Php 7.0.25. Ram de 128 GB
O padrão de uso da cpu é realmente estranho e não encontrei nada explicando isso.
link
Como você pode ver, há aqueles níveis sucessivos de uso da CPU, que são bastante constantes. Além disso, quando o uso da CPU do Apache aumenta, a CPU de uso do Mysql aumenta, e quando uma diminui, a outra diminui. Além disso, como você pode ver, toda a diferença acontece no uso do sistema da CPU.
Eu dei uma olhada no número de consultas / s do mysql, que é basicamente constante. Mesma coisa para o número de requisições / s no apache2. Bastante constante. Btw o servidor apache leva em torno de 100req / seo mysql é ~ 300queries / s no mysql (então os picos na cpu não parecem estar ligados a uma grande quantidade regular de pedidos no apache ou no mysql)
Eu dei uma olhada nas consultas lentas, nada em particular. Quando eu faço um SHOW PROCESSLIST, nenhuma consulta ainda está por aí. Mesma coisa para o apache. O tempo máximo de carregamento da página é de < 1s.
Quando eu reinicio o serviço apache2, o padrão parece desaparecer por algumas horas. Quando eu reinicio o serviço mysql, o padrão parece desaparecer por algumas horas também.
Além disso, tenho alguns outros serviços java que também usam esse db (usando o driver jdbc mais recente, e não vejo nenhum padrão de cpu alterado com eles). Inicialmente criava sua conexão com o mysql no início dos serviços, mas eu mudei esse comportamento para fechar a conexão / iniciar um novo a cada 5min ... Isso não mudou nada
Meu arquivo my.cnf:
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 0.0.0.0
key_buffer_size = 36G
max_allowed_packet = 64M
tmp_table_size = 256M
max_heap_table_size = 256M
max_connections = 512
table_open_cache = 8192
bulk_insert_buffer_size = 512M
thread_stack = 192K
thread_cache_size = 8
sort_buffer_size = 64M
myisam_sort_buffer_size = 64M
myisam-recover-options = BACKUP
query_cache_limit = 1M
query_cache_size = 16M
log_error = /var/log/mysql/error.log
expire_logs_days = 10
max_binlog_size = 100M
[isamchk]
key_buffer_size = 36G
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
Meu apache tem praticamente a configuração padrão, exceto que ele tem (eu posso ter cerca de 350 funcionários usados, é por isso que eu coloquei esse valor)
MaxRequestWorkers 1024
ServerLimit 1024
Eu realmente não tenho certeza do que fazer para investigar.
Alguma ideia do que poderia estar errado?
Obrigado!
Edit: Eu não vi nada de suspeito nos logs do apache ou mysql
Editar:
Alguns dados perguntados nos comentários
ulimit -a:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 514833
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 50000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 514833
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
iostat -x
Linux 4.4.0-112-generic (ns340707.ip-37-187-250.eu) 02/21/2018 _x86_64_ (12 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
14.89 0.29 10.42 1.41 0.00 72.98
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.70 51.90 18.37 11.86 1179.98 1894.25 203.33 1.40 46.40 10.29 102.33 2.35 7.11
sda 0.73 51.89 25.27 11.87 1847.55 1894.25 201.50 1.22 32.72 4.37 93.05 2.14 7.93
md0 0.00 0.00 9.63 62.19 758.90 1889.96 73.77 0.00 0.00 0.00 0.00 0.00 0.00
nvme1n1 0.00 0.00 429.64 1214.09 4755.77 6215.04 13.35 0.36 0.19 0.18 0.19 0.03 5.00
md2 0.00 0.00 1567.33 1204.69 14913.87 6204.69 15.24 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 0.00 1204.85 1215.25 10676.20 6219.68 13.96 1.57 0.62 0.14 1.10 0.05 11.93
MOSTRAR ESTADO GLOBAL - > link
MOSTRAR VARIÁVEIS GLOBAIS - > link
Saída do sintonizador mysql: link
Acabei de notar que, durante a fase "high cpu" do sistema, eu tenho uma porcentagem alta de cpu em isolate_freepages_block (eu obtive isso usando perf top
). No entanto, não tenho certeza de como resolver isso