Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares [email protected].

26
Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares [email protected]

Transcript of Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares [email protected].

Page 1: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Turbinando o desempenho do MySQL na Nuvem

Marcus Vinícius [email protected]

Page 2: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.
Page 3: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

! Agenda

• Queries e Índices• Arquitetura de Aplicações• Técnicas de Sharding/Master

Slaves/Federation/Replication

Page 4: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Tuning Ground Rules

• 1 Parâmetro de cada vez• Teste cada alteração• Mantenha um histórico• Evite o transtorno da otimização obsessiva

Page 5: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

MySQL – Processo de Otimização

• MySQL Config• Parâmetros de Kernel• Índices• Cache

Fácil• Infra• Sistema Operacional• Versão do MySQL• Storage Engine

Médio• Modelo de Dados• Arquitetura da AplicaçãoDifícil

Page 6: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Complexidade atual (e crescendo)

Page 7: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

O que mudou?

• Nossos aplicativos foram enjauladosModelo Tradicional com Máquina Virtual(ESX, HyperV, KVM, XEN)

Lightweight Virtualization(Jail, Zones, nPartitions, Vpars, IVms, PowevVM, OpenVZ, LXC)

Page 8: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

O que mudou?

• Restrição a recursos– Processador– Memória– Rede– IO

Page 9: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

O que mudou?

• Fornecedores mentem (clientes também)• Concorrência

Page 10: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Áreas para ajustes

• Sistema Operacional (SO)• Rede (Network)• Armazenamento (Storage)• MySQL Config (Conf)

Page 11: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

OS

• Swappinessecho 0 > /proc/sys/vm/swappinesssysctl.conf : vm.swappiness = 0

• Dirty Ratio– vm.dirty_background_ratio % memória que inicia a escrita para

os discos– vm.dirty_ratio % da memória que, quando atingido, bloqueia as

escritas e escreve as páginas para o disco– Entre 5 e 60echo 5 > /proc/sys/vm/dirty_background_ratioecho 60 > /proc/sys/vm/dirty_ratiovm.dirty_background_ratio = 5vm.dirty_ratio=5

Page 12: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

OS

• Scheduler: cfq, noop, anticipatory, deadlineGrub.conftitle Red Hat Enterprise Linux Server (2.6.32-431.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/Volume00-root .... elevator=noop initrd /initramfs-2.6.32-431.el6.x86_64.img

echo noop >/sys/block/sda/queue/scheduler

IO na VM

Uso de ciclos

de cpu para

ordernar o IO na VM

Envia as

requisições

para o Host

HPV re-ordena basead

o no seu

algoritmo

HPV envia para o HW

Page 13: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

OS

• Malloc Lib– jemalloc OU tcmalloc( caso tenha 8+ cores )– tcmalloc vem junto com o MySQL[mysqld_safe] malloc-lib=tcmalloc

• I/O Queue Size– iostat -x : avgqu-sz

Select magic_number from hat where tunnable = ‘I/O Queue Size’Empty set (0.00 sec)echo 99999 > /sys/block/[DEVICE]/queue/nr_requests

Page 14: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

OS – NUMA

• “swap insanity”– (http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/)

• numactl –hardware

Page 15: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Network

• Geralmente culpa-se o banco

• Latencia (distância e hops)

• 1G obrigatório• trunk recomendado• 10 G mais acessível

echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlognet.ipv4.ip_local_port_range="1024 64000“net.core.somaxconn = 1024net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_rmem = 4096 87380 16777216net.ipv4.tcp_wmem = 4096 65536 16777216net.ipv4.max_tw_buckets=360000net.core.netdev_max_backlog = 2500ifconfig eth0 txqueuelen 1000

Page 16: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

FS/Storage

• SSD / FusionIO• Partições separadas para o / , tmpfs, /var/lib/mysql• Ajuste o tamanho do bloco (

– innodb datafiles: 16Kb– Innodb logs files: 128kb+

• Ajuste os limites no /etc/security/limits.conf– # /etc/security/limits.conf

mysql soft nproc 4096mysql soft nofile 4096mysql hard nproc 63536mysql hard nofile 63536

Page 17: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

FS/Storage

• Mount options– Ext4: ext4 (rw,noatime,nodiratime,nobarrier,data=ordered)

– xfs (rw, noatime,nodiratime,nobarrier,logbufs=8,logbsize=32k)

– NFS (rw,bg,tcp,noatime,nodiratime,actimeo=??,nocto,hard,rsize=1048576,wsize=1048576,intr,nolock)

Page 18: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

FS/Storage

• Tmpfsmkdir -p /mnt/tmpfs-mysql/mount -t tmpfs -o size=1024M tmpfs /mnt/tmpfs-mysqlentrada no /etc/fstab

tmpfs /mnt/tmpfs-mysql tmpfs size=1024M,nr_inodes=0 0 0(my.cnf) tmpdir = /mnt/tmpfs-mysql/

• Dtrace

Page 19: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

mysqld

• Mysql 5.6• max_connections = [DIMINUA]• max_user_connections = [BAIXO]• performance_schema = off• default_storage_engine = InnoDB• back_log = 500• event_scheduler = ON/OFF• skip_name_resolve• slow_query_log = 1• key_buffer_size (MyISAM)

Page 20: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Query Cache

• Off – mysql 5.6 já é desabilitado• Gargalo - Single thread • Fragmentação da memória• MySQL Query Cache Fragmentation Slows

Down the Server (Doc ID 1308051.1)• Dever estar na aplicação

Page 21: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Table caching

• table_open_cache• table_defintion_cache• table_cache_instances = 8 ou 16• thread_cache_size

– Limitado pelo processo do usuário (limite os)

Page 22: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

InnoDB

• http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html

• innodb_buffer_pool_size = 80% RAM– Mas..não tenha swap

• innodb_buffer_pool_instances >= 8• innodb_spin_wait_dela = 96 quando muito concorrência• innodb_log_file_size >= 2047 no 5.6• innodb_file_per_table = ON• innodb_thread_concurrency = 36 in 5.6

– Alinhas ao disponível se < 32 Cores

Page 23: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

InnoDB Flushing

• innodb_flush_log_at_trx_commit = 1 // sync no disco em cada commit – melhor durabilidade

• innodb_flush_log_at_trx_commit = 2 // sync / 1sec – escreve sempre - boa performance

• innodb_flush_log_at_trx_commit = 0 // sync e escrita / 1 sec - melhor performance – NOT ACID

• innodb_flush_method = O_DIRECT // Linux, skips the FS cache

Page 24: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Pre-Cache

• Pre-cache– select * from DERP_TABLE– select count(*) DERP_TABLE

Page 25: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Resumo

Page 26: Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares mvc_msoares@uolinc.com.

Avisos e Perguntas

Marcus Vinícius [email protected]

http://www.uolhost.com.br/