quarta-feira, 15 de julho de 2009

Benchmarking de parâmetros InnoDB

Aqui vão uns benchmarks que fiz uma vez com InnoDB para uma tabela quase exclusivamente de escrita. Com quase exclusivamente quero dizer que 99.99% das operações eram INSERTs. O filesystem, desta vez, era ZFS, e era o mesmo para os logs e datafiles.

Vamos aos testes. Especificações de hardware e SO:

  • MySQL: 5.1.25-rc-log conforme consta no CoolStack

  • Intel Quad core x 2800 MHz

  • 16 GB RAM

  • Solaris 10



As configurações de base eram estas:

[code]
transaction-isolation = READ-COMMITTED
innodb_file_per_table
innodb_buffer_pool_size = 3000M
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 256M
innodb_autoinc_lock_mode = 2
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table
log-slow-queries=mysql-query-slow.log
slow_query_log = 1
long_query_time = 1
innodb_doublewrite = 0
[/code]

E todos os testes foram intercalados de DROP TABLE, CREATE TABLE e uma única alteração à configuração de base. Os INSERT's foram feitos com INSERT .... ON DUPLICATE KEY. O schema anda algures perdido aqui nos meus apontamentos (vou tentar encontrá-lo entranto) mas é de notar que havia um único índice, que era um UNIQUE KEY, e que foi transformado inicialmente para PK e deixado em alguns dos testes seguintes.

A tabela seguinte diz respeito ao único parâmetro que foi alterado em relação à base:

[code]
Serie A default
Serie B UNIQUE -> PRIMARY KEY
Serie C PK, Autocommit = 0 (1 comm/seg)
Serie D PK, innodb_flush_method = O_DIRECT
Serie F PK, innodb_flush_method = O_DSYNC
Serie G innodb_flush_log_at_trx_commit = 0
Serie H innodb_doublewrite = 0
Serie I innodb_log_file_size = 128M
Serie J zfs set recordsize=16k data/mysql
[/code]

innodb-parameters-1

Na Série B a única alteração foi a conversão da UNIQUE KEY para uma PRIMARY KEY, nada a assinalar. Na Série C, a alteração consistia em suster os COMMIT's durante aprox. 1 segundo, fazendo COMMIT a cada segundo. Mal seria se não tivéssemos um ganho, por mínimo que fosse, mas é preciso ter em conta que, apesar do ganho ser de 20%, são ~7600 potenciais candidatos a rollback caso alguma coisa corra mal nesse segundo..! Posso dizer que o rollback de aprox. metade demora bastante (para o que é um arranque normal do MySQL).

Queria também experimentar Direct I/O com InnoDB na Série D mesmo sabendo que estava em ZFS, e que a coisa não deveria ser tão fácil. O erro foi:
[code]
090721 18:18:10 InnoDB: Failed to set DIRECTIO_ON on file /opt/coolstack/mysql/data/ibdata1: OPEN: Inappropriate ioctl for device, continuing anyway
[/code]

Na série F, foi a vez de experimentar O_DSYNC, e nem acabei de terminar o teste, pois iria demorar demasiado tempo. Escusado será dizer que o I/O foi altíssimo durante esse momento. Comecei entretanto a procurar maneiras de afinar o ZFS, mas convenhamos que ao fim de uns minutos a ler, já estava a enveredar por um caminho muito muito distante.. :-) É incrível a quantidade de coisas que dá para fazer com ZFS e só por si vai merecer uma categoria própria, um dia...

De volta ao MySQL, a Série G inflinge um risco conhecido, desleixando o flush dos logs, por isso não é de estranhar o aumento de performance - esta opção deve ser analisada com cuidado, pois tem contrapartidas. A Série H desactivou o doublewrite do motor, resultando num aumento de performance de 3,5% (relativamente à Série A) conforme previsto pelo Peter Zaitsev. Como estamos perante ZFS, não vejo motivo nenhum para não desactivá-lo.

Reduzindo o tamanho dos logs na Série I resultou num aumento de performance de 2,8%. Isto é interessante, e é a prova viva de que, se por um lado precisamos deles grandes, por outro, a sua gestão pode infligir mais carga ou deteriorar a performance por serem grandes demais, isto para não falar na forma como afectam o recovery. Não cheguei a testar, mas com um tamanho ainda mais pequeno, o aumento podia ser maior...

A Série J foi dedicada ao ZFS, com a recomendação típica para filesystems dedicados a DBs, que é o alinhamento do tamanho dos blocos com o tamanho das páginas de InnoDB (16KB), e o ZFS, como [quase?] todos os sistemas de ficheiros, permite ajustar esse parâmetro. Traduzindo, a cada leitura do disco, o SO pede ao disco record size (omissão: 128KB) bytes de cada vez; o InnoDB, que tenta gerir os acessos I/O de forma inteligente minimizando-os ao máximo, faz pedidos de page size bytes de cada vez. Se o SO não estiver alinhado, e como os blocos pedidos pelo InnoDB são na maioria aleatórios, cada bloco de 16K solicitado pelo InnoDB traduzir-se-á em leituras de 128KB. Com um pedido de 10 páginas aleatórias (160KB), o SO terá de ler 1280KM, ou seja, quase 10x mais! Mas como eu estava à espera, o resultado não foi significativo (1%) já que este cenário era exclusivamente de INSERTs.

Em termos de sistemas de ficheiros, sejam ZFS ou outro qualquer, há ainda características determinantes a considerar, que são o efeito de prefetching e read-ahead.... mas lá está, já me estava a desviar demasiado do MySQL :P Aqui ficam algumas considerações interessantes sobre o uso de MySQL em ZFS.


Ficaram a faltar muitas opções por falta de tempo, mas aqui ficam sugestões para a quem quiser experimentar:

domingo, 12 de julho de 2009

Este fim de semana...

Desta vez, num capítulo mais pessoal, os planos do fim-de-semana saíram furados. A minha opinião, que nem sequer me dei ao trabalho de me informar muito, é que espero bem que a SBSR e Música no Coração tenham sido indemnizados por isto... já vamos às críticas como as que constam no artigo do Público, mas não deve ser fácil conseguir trazer bandas deste nível, e a responsabilidade é tão grande que posso deduzir o esforço da organização em que tudo corresse bem... da nossa parte! Claro que ninguém ia imaginar que a florzinha não ia conseguir cantar [com as cordas vocais, sabem como é?] porque tinha uma lesão na perna... gosto muito de Depeche Mode, não conheço a gravidade da situação, mas não achei nada bem este cancelamento na véspera [estou a assumir que a SBSR no-la comunicou assim que tomaram conhecimento]. E, ao que parece, já o ano passado tinham cancelado o concerto.. Devem haver seguros para estas situações, e a falta de público no Porto deve ser coberta/indemnizada! Claro que não fui: eu não ia pelo festival, mas exclusivamente para ver Depeche Mode - a coincidência com Novelle Vague era excelente, porque já conheço os concertos deles e são sempre muito bons. Mas cada macaco no seu galho, esta era a noite de Depeche, e a responsabilidade pelo fracasso é deles.

Quanto aos comentários no artigo do Público, e à sensação de desilusão do público... mais uma vez estou do lado do SBSR, que ainda assim conseguiu oferecer alternativa, mesmo com o prejuízo que já se adivinhava... Xutos & Pontapés são excepcionais, The Gift também, mas quem é que podiam ter convidado na véspera do acontecimento?? Mas cada macaco no seu galho... e estes já os vi... algumas vezes :-)

Se bem que vão sempre acontecendo surpresas: lembro-me de ir ao Sudoeste de propósito para ver os The Cure e de terminar o espectáculo desiludido com eles. Porém, assisti a um espectacular concerto de Peter Murphy - que nem conhecia, vejam lá.. -, dos infalíveis Blasted Mechanism, e Chemical Brothers

Mas bem, o fim-de-semana foi salvo [com grande categoria] com uma viagem ao belíssimo Convento de Cristo [é uma vergonha - minha - que o artigo na Wikipédia esteja tão pequeno], que já de si nos deixa emocionados, sensação essa que foi agravada pela música de Nightwish - Ghost Love Score (clip), no regresso. Já os deixei passar em 2008, mas não penso que vá voltar a acontecer..

Andei a alternar o tema deste blog. Ainda não encontrei nenhum que me satisfizesse, então voltei à base, já que o último (POP Blue?!) além de ter um estilo duvidoso, nem sequer mostrava os posts completos, mas apenas uma versão condensada.. entretanto activei o reCaptcha e a malta fora da DRI já pode comentar... sejam brandos!

Ao cruzar-me com o blog do Marcos, fui parar a uma rant sobre concorrência que, por sua vez, me levou a ver este vídeo disparatado sobre o paralelismo de Erlang :-) Ele há cada um... mas interessante foi revisitar os conceitos do MapReduce e do Hadoop. Estes conceitos vão-se tornando cada vez mais pertinentes numa altura em que o volume de dados a processar se torna inimaginável - e a Google sabe-o melhor que ninguém. Do tal rant fui parar a uma exposição sobre a arquitectura do LinkedIn e, tristeza das tristezas, acabei por perceber que perdi uma belíssima oportunidade de obter os produtos da Atlassian por $5. O engraçado é que agora o link para o pedido é feito na forma vote para trazer a promoção de volta! Se é para captura de Leads, achei engraçado! Toca a votar!!

E, nesta linha de orientação, aproveito para deixar uma demonstração do KickFire (a appliance dedicada a correr MySQL), que curiosamente tinha sido apresentado na edição do ano passado. O título diz tudo: Do You Believe in Magic?. Para quem não sabe, a abordagem da KickFire é uma mistura de um CPU dedicado, um storage engine baseado em colunas, e o que eles chamam de stream processing, que é mais ou menos aquilo que nós vamos fazendo inconscientemente.

Perdi [hrm,hrm, investi] finalmente um bom tempo a ver as apresentações da MySQL Conference & Expo 2009 [slides e vídeo] (e alguns de 2008), de onde destaco: mysqlnd: How the PHP/MySQL Stack Got Better, que será uma nova abordagem à ligação do PHP com MySQL, Understanding and Control of MySQL Query Optimizer: Traditional and Novel Tools and Techniques, com aspectos muito interessantes sobre o percurso do Query Optimizer na elaboração do plano.

Estas conferências têm sido arrebatadoras. Para o ano vou [ou talvez não... :(]!

sexta-feira, 10 de julho de 2009

Sobre o ZFS

Tão cedo comecei a experimentar e a afinar o parzinho sensação (ZFS and MySQL), fui logo procurar se já alguém tinha começado alguma implementação de ZFS em/para Linux [tal e qual o que aconteceu com o DTrace, mas com menos sorte!] e adivinhem! Existe uma, e é feita por um camarada português, Ricardo Correia. Ao que parece, o projecto começou patrocinado pelo Google Summer of Code de 2006. Vejam os sites para mais informações:

Entretanto, cruzei-me com esta demonstração surreal do ZFS (ainda estou a tentar perceber como embebê-la neste post)...

quinta-feira, 9 de julho de 2009

Syntax Highlighting nos blogs da DRI

Não é à toa que toda a gente gosta do arco-íris - se uma imagem vale mil palavras, ler código a cores deve valer umas boas 900. Depois de montar as minhas primeiras demonstrações em MySQL, resolvi experimentar um plugin de Syntax Highlighting (sempre tive pavor a qualquer potencial tradução desta expressão).

O plugin escolhido [algures entre o acaso e o ranking do Google] foi o iG:Syntax Hiliter Plugin e, para já, de 0-100, dou-lhe um 70... é muito fácil de instalar, mas em termos de potencial parece-me inferior ao que faz, por exemplo, o SyntaxHighlight GeSHi no MediaWiki.

Não obstante, mesmo assim, teve que levar uma martelada para não deturpar caracteres mais conflituosos com HTML, que insistiam em transformar-se estupidagicamente em HTML entities (desde quando é que algo dentro de |code| deve ser transformado??). Mas bem, vamos ver como corre, e se não levo na cabeça do pessoal de infrastruturas...

Para já, a cobaia foi o último post: MySQL DATETIME vs TIMESTAMP vs INT performance and benchmarking with InnoDB. Claro está, já se avizinha uma martelada no tema... alguém conhece um com distribuição horizontal melhorzinha?

segunda-feira, 6 de julho de 2009

MySQL DATETIME vs TIMESTAMP vs INT performance and benchmarking with InnoDB

Following my tests with DATETIME vs vs TIMESTAMP vs INT performance and benchmarking with MyISAM storage engine, I've wondered about the performance impact using InnoDB, which is usually more peaky with I/O.

MySQL DATETIME vs TIMESTAMP vs INT performance and benchmarking with MyISAM

Recently there was a discussion about DATETIME vs TIMESTAMP vs INT performance and storage requirements. If one setup was bound to disk usage, one would expect INT to perform better, since storage requirements are smaller. However, the amount of calculations to use it as a timestamp can be overwhelming as well.

sexta-feira, 3 de julho de 2009

Analysing MySQL slow queries

While I'm engaged in my MySQL DBA mode, I usually come across the hard task of surfing around the slow query log.

Everybody trying to trace MySQL performance problems will hit the slow query log to keep track of those unperformant queries that seem to be hogging the system. The traditional tool to analyze the log is mysqldumpslow (provided with standard MySQL distribution) which aggregates the queries by pattern (fingerprint) and calculates some aggregated statistics. I personally find the tool very limited, and I don't seem to be the one (see below).