Turbinando o desempenho do MySQL na Nuvem Marcus Vinícius Soares [email protected] ! Agenda • Queries e Índices • Arquitetura de Aplicações • Técnicas de Sharding/Master Slaves/Federation/Replication Tuning Ground Rules • • • • 1 Parâmetro de cada vez Teste cada alteração Mantenha um histórico Evite o transtorno da otimização obsessiva MySQL – Processo de Otimização Fácil • MySQL Config • Parâmetros de Kernel • Índices • Cache Médio • Infra • Sistema Operacional • Versão do MySQL • Storage Engine Difícil • Modelo de Dados • Arquitetura da Aplicação Complexidade atual (e crescendo) O que mudou? • Nossos aplicativos foram enjaulados Modelo Tradicional com Máquina Virtual (ESX, HyperV, KVM, XEN) Lightweight Virtualization (Jail, Zones, nPartitions, Vpars, IVms, PowevVM, OpenVZ, LXC) O que mudou? • Restrição a recursos – Processador – Memória – Rede – IO O que mudou? • Fornecedores mentem (clientes também) • Concorrência Áreas para ajustes • • • • Sistema Operacional (SO) Rede (Network) Armazenamento (Storage) MySQL Config (Conf) OS • Swappiness echo 0 > /proc/sys/vm/swappiness sysctl.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 60 echo 5 > /proc/sys/vm/dirty_background_ratio echo 60 > /proc/sys/vm/dirty_ratio vm.dirty_background_ratio = 5 vm.dirty_ratio=5 OS IO na VM Uso de ciclos de cpu para ordernar o IO na VM Envia as requisições para o Host HPV reordena baseado no seu algoritmo • Scheduler: cfq, noop, anticipatory, deadline Grub.conf title Red Hat Enterprise Linux Server (2.6.32431.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 HPV envia para o HW 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 OS – NUMA • “swap insanity” – (http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-thenuma-architecture/) • numactl –hardware Network • Geralmente culpase 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_ backlog net.ipv4.ip_local_port_range="1 024 64000“ net.core.somaxconn = 1024 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.max_tw_buckets=360000 net.core.netdev_max_backlog = 2500 ifconfig eth0 txqueuelen 1000 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 mysql mysql mysql soft soft hard hard nproc nofile nproc nofile 4096 4096 63536 63536 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) FS/Storage • Tmpfs mkdir -p /mnt/tmpfs-mysql/ mount -t tmpfs -o size=1024M tmpfs /mnt/tmpfsmysql entrada no /etc/fstab tmpfs /mnt/tmpfs-mysql tmpfs size=1024M,nr_inodes=0 0 0 (my.cnf) tmpdir = /mnt/tmpfs-mysql/ • Dtrace 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) 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 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) InnoDB • http://dev.mysql.com/doc/refman/5.6/en/innodbparameters.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 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 Pre-Cache • Pre-cache – select * from DERP_TABLE – select count(*) DERP_TABLE Resumo Avisos e Perguntas Marcus Vinícius Soares [email protected] http://www.uolhost.com.br/