{"id":1086,"date":"2019-02-27T22:38:45","date_gmt":"2019-02-28T01:38:45","guid":{"rendered":"http:\/\/thesqltimes.com\/blog\/?p=1086"},"modified":"2019-03-01T23:50:29","modified_gmt":"2019-03-02T02:50:29","slug":"desempenho-do-processador-x-desempenho-do-sql-server-parte-3","status":"publish","type":"post","link":"https:\/\/thesqltimes.com\/blog\/2019\/02\/27\/desempenho-do-processador-x-desempenho-do-sql-server-parte-3\/","title":{"rendered":"Desempenho do Processador x Desempenho do SQL Server \u2013 Parte 3"},"content":{"rendered":"<div class=\"pld-like-dislike-wrap pld-template-1\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"Muito \u00fatil!\" data-post-id=\"1086\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-up\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">    <\/span>\r\n<\/div><\/div><div class=\"seriesmeta\">Post 3\/4. Este post \u00e9 parte da s\u00e9rie: <a href=\"https:\/\/thesqltimes.com\/blog\/series\/desempenho-do-processador-x-desempenho-do-sql-server\/\" class=\"series-225\" title=\"Desempenho do Processador x Desempenho do SQL Server\">Desempenho do Processador x Desempenho do SQL Server<\/a>\r\n<\/div>\r\n<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Tempo de Leitura:<\/span> <span class=\"rt-time\"> 6<\/span> <span class=\"rt-label rt-postfix\">minutos<\/span><\/span><p>S\u00e3o 7 horas da manh\u00e3, e recebo uma liga\u00e7\u00e3o da Equipe de BI, dizendo que todas as cargas est\u00e3o 50% mais lentas. O caos se instaura na equipe, pois os relat\u00f3rios do dia n\u00e3o estariam prontos&#8230;<\/p>\n<p>Isso aconteceu depois de uma migra\u00e7\u00e3o. A m\u00e1quina antiga era virtual. A m\u00e1quina nova? F\u00edsica. Com configura\u00e7\u00f5es id\u00eanticas! Como pode? O m\u00ednimo, era ter desempenho igual, n\u00e3o inferior. O que aconteceu?<\/p>\n<p>Vou contar melhor essa hist\u00f3ria&#8230;<\/p>\n<hr \/>\n<p>Bem vindo de volta!<\/p>\n<p>No \u00faltimo post desta s\u00e9rie, voc\u00ea viu como uma redu\u00e7\u00e3o de 50% no clock da CPU impactou diretamente no tempo das consultas de um SQL Server.<\/p>\n<p>Se voc\u00ea ficou surpreso com isso, saiba que n\u00e3o tem nada de novo. Isso se d\u00e1 por uma simples teoria matem\u00e1tica:\u00a0velocidade e tempo s\u00e3o grandezas inversamente proporcionais. Se eu dobrar a velocidade, eu fa\u00e7o na metade do tempo. Do mesmo jeito que, se eu usar metade da velocidade, eu gasto o dobro do tempo.<\/p>\n<p>E, foi exatamente isso que aconteceu no exemplo o post anterior: a velocidade da CPU diminui, e o tempo das instru\u00e7\u00f5es, e, consequentemente, da nossa query, aumentou.<\/p>\n<p>Mas por que voc\u00ea se preocuparia com isso? Afinal, quem seria louco o suficiente para baixar a velocidade da CPU pelo gerenciamento de energia? E \u00e9 a\u00ed que voltamos a nossa historinha&#8230;<\/p>\n<h2>Um caso real e inesquec\u00edvel<\/h2>\n<p>Que absurdo \u00e9 esse, onde, uma m\u00e1quina f\u00edsica, id\u00eantica a virtual (pra ser mais preciso, id\u00eantica ao host da m\u00e1quina virtual), \u00e9 t\u00e3o mais lenta?<\/p>\n<p id=\"JseQjYx\"><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/tonystark.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1103\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/tonystark.gif\" alt=\"\" width=\"160\" height=\"160\" \/><\/a><\/p>\n<p id=\"UDxQMca\">N\u00f3s gastamos um bom tempo checando tudo, configura\u00e7\u00f5es da inst\u00e2ncia, bloqueios, disco, etc. At\u00e9 que, tive a ideia de fazer um simples teste de CPU: Vou comparar quanto tempo levo pra executar uma quantidade de instru\u00e7\u00f5es na inst\u00e2ncia antiga e na nova. Como fazer isso no SQL Server? Um simples loop:<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"Calculando tempo de CPU\">DECLARE @i bigint = 10000000, @start datetime = current_timestamp\r\nwhile @i &gt; 0  set @i = @i - 1;\r\nselect datediff(ms,@start,current_Timestamp) as LoopTime<\/pre>\n<p>Este c\u00f3digo SQL \u00e9\u00a0 muito simples:<\/p>\n<ol>\n<li>A vari\u00e1vel @i, come\u00e7a em 10 milh\u00f5es. O meu objetivo \u00e9 decrementar ela at\u00e9 que chegue em zero. O processador vai ser utilizado basicamente para opera\u00e7\u00f5es aritm\u00e9ticas&#8230; Que s\u00e3o simples e r\u00e1pidas&#8230;<\/li>\n<li>Eu utilizo a vari\u00e1vel @start para gravar a data e hora atuais, antes de come\u00e7ar o loop WHILE&#8230;<\/li>\n<li>Ao final do meu loop while, eu calculo quanto tempo se passou, subtraindo a data de agora, pelo valor gravado em @Start<\/li>\n<\/ol>\n<p id=\"aDLBjJc\"><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c773388022b7.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1091 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c773388022b7.png\" alt=\"\" width=\"970\" height=\"156\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c773388022b7.png 970w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c773388022b7-300x48.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c773388022b7-768x124.png 768w\" sizes=\"auto, (max-width: 970px) 100vw, 970px\" \/><\/a><\/p>\n<p>Este \u00e9 um c\u00f3digo que vai gastar apenas CPU. N\u00e3o tem disco, rede, mem\u00f3ria, ou outra coisa <strong>significativa<\/strong> envolvida.\u00a0 Mais de 99% do tempo desse script vai ser gasto executando instru\u00e7\u00f5es na CPU. Quando eu executei este script na m\u00e1quina antiga, ele me retornou um tempo de 5 segundos. Quando executei na nova, variava de 7 a 8 segundos.<\/p>\n<figure id=\"attachment_1090\" aria-describedby=\"caption-attachment-1090\" style=\"width: 856px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c7730b72e33c.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1090 size-full\" src=\"http:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c7730b72e33c.png\" alt=\"\" width=\"856\" height=\"411\" srcset=\"https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c7730b72e33c.png 856w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c7730b72e33c-300x144.png 300w, https:\/\/thesqltimes.com\/blog\/wp-content\/uploads\/2019\/02\/img_5c7730b72e33c-768x369.png 768w\" sizes=\"auto, (max-width: 856px) 100vw, 856px\" \/><\/a><figcaption id=\"caption-attachment-1090\" class=\"wp-caption-text\">Comparando tempos de CPU usando T-SQL. O script demora aproximadamente 4 segundos para subtrair 10 milh\u00f5es em uma CPU de 3.1 Ghz! J\u00e1 em uma CPU de 1.39 Ghz, ele leva 10.5 segundo! \ud83d\ude2f \ud83d\ude2f \ud83d\ude2f \ud83d\ude2f<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>Pronto, tinha achado um norte. O pr\u00f3ximo passo nesse caso, foi verificar se o problema estava dentro do SQL Server, ou era algo generalizado, no Sistema Operacional. Ent\u00e3o, fiz a mesma vers\u00e3o desse script, em powershell:<\/p>\n<pre class=\"lang:ps decode:true \" title=\"Medindo o desempenho da CPU\">(Measure-Command {   [int]$i = 10000000;  while($i--){};   }).TotalMilliseconds<\/pre>\n<p>E novamente, comparei o resultado com a m\u00e1quina nova e antiga! Mesma situa\u00e7\u00e3o. Agora exclu\u00ed o SQL Server do problema. O script na m\u00e1quina antiga (virtual) retornava um valor muito inferior ao da m\u00e1quina nova(f\u00edsica). A partir da\u00ed, usei o CPU-Z (era um Windows Server 2008) e constatei que o clock do processador do servidor novo estava operando a 2.2 GHz, enquanto que o CPU-Z da m\u00e1quina virtual, reportava 2.5 GHz. Uma diferen\u00e7a de apenas 300 MHz, foi suficiente para dar dor da cabe\u00e7a no ambiente de BI!<\/p>\n<p>Voc\u00ea pode estar se perguntando o porqu\u00ea de apenas 300 MHz, causar 50% de lentid\u00e3o no processo de carga e a raz\u00e3o \u00e9 muito simples:<\/p>\n<ul>\n<li>O processo de carga n\u00e3o envolve apenas uma \u00fanica consulta. S\u00e3o v\u00e1rias consultas. Consultas de 2, 3, 15 minutos, subindo para 4, 6, 18 minutos, respectivamente. As consultas pequenas tamb\u00e9m.<\/li>\n<li>A inst\u00e2ncia onde ocorria tudo isso, al\u00e9m de concorrer com um Analysis Service e Integration Services, que tamb\u00e9m estavam sendo impactados pelo problema, tinham outras queries em execu\u00e7\u00e3o, de outros relat\u00f3rios, e n\u00e3o somente do processo de carga.<\/li>\n<li>Todo o sistema operacional lento, logo, grava\u00e7\u00f5es em disco mais lento, comunica\u00e7\u00e3o de rede mais lento. Toda a concorr\u00eancia do processador estava maior, uma vez, que a CPU est\u00e1 mais lenta, tudo demora mais na CPU, e a\u00ed aumenta a espera por CPU<\/li>\n<\/ul>\n<figure style=\"width: 328px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/thumbs.gfycat.com\/MedicalBeneficialGalah-small.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/thumbs.gfycat.com\/MedicalBeneficialGalah-small.gif\" alt=\"\" width=\"328\" height=\"250\" \/><\/a><figcaption class=\"wp-caption-text\">A rua \u00e9 o processador, e os ve\u00edculos s\u00e3o nossas queries e processos&#8230; Experimenta colocar todo mundo um pouco mais lento pra ver o caos que vira&#8230;<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>O problema foi resolvido depois que, comprovado para a equipe de infraestrutura que o problema era da m\u00e1quina, eles abriram chamado no fabricante, que detectou uma atualiza\u00e7\u00e3o de BIOS. E a\u00ed resolveu tudo (depois de v\u00e1rias tentativas por parte deles, como mudar configura\u00e7\u00e3o da BIOS, colocar a m\u00e1quina com 100% de energia, j\u00e1 que ela aceitava 4 cabos de for\u00e7a, e apenas dois estavam plugados, etc.). Isso levou meses, e tivemos que desfazer a migra\u00e7\u00e3o at\u00e9 l\u00e1. Quando nos foi reportado que a m\u00e1quina estava pronta, apenas repetir todos os testes, e dessa vez, os tempos estavam iguais. Prosseguimos com a migra\u00e7\u00e3o, e tudo certo. O processo de carga estava at\u00e9 um pouco mais r\u00e1pido!<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/thumbs.gfycat.com\/DiscreteUnfitBluebottlejellyfish-size_restricted.gif\" alt=\"Image result for gif claps velinhas\" \/><\/p>\n<h2>Epidemia<\/h2>\n<p>Alguns meses depois deste problema, um colega me procurou e me relatou sobre um problema de lentid\u00e3o ap\u00f3s um ambiente extremamente cr\u00edtico migrar de SQL 2008 R2 para SQL 2014. Chegaram a cogitar problema com o novo CE&#8230; De novo, o problema era um clock mais lento nas novas m\u00e1quinas.<\/p>\n<p>Ainda, muito antes de fazer parte do #TeamFabricioLima, o <a href=\"https:\/\/www.fabriciolima.net\/blog\/2016\/04\/14\/casos-do-dia-a-dia-comprei-um-servidor-melhor-e-o-sql-server-esta-mais-lento-como-pode\/\">Fabr\u00edcio me contou sobre o mesmo sintoma: novo servidor e tudo mais lento<\/a>, e novamente, achamos problema com velocidade do clock.<\/p>\n<p>Depois disso, encontrei muitos problemas como este, at\u00e9 em ambiente com outros bancos de dados&#8230; Com outras tecnologias&#8230; Me dei a liberdade de batizar isso de epidemia de <strong>C<\/strong>lock<strong>L<\/strong>entopsia.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/gifimage.net\/wp-content\/uploads\/2018\/06\/vergonha-alheia-gif-5.gif\" alt=\"Image result for gif vergonha alheia\" \/><\/p>\n<p id=\"tAsfDvw\">A quest\u00e3o aqui \u00e9: Quantas vezes voc\u00ea parou pra validar o desempenho do seu processador? Voc\u00ea coloca isso no seu checklist de migra\u00e7\u00e3o? Um conceito extremamente simples, que pode estar afetando seu ambiente.<\/p>\n<p>Voc\u00ea percebeu no post anterior que uma query de 266 ms foi para mais de 500ms&#8230; Na casa dos milissegundos, ningu\u00e9m percebe isso. Voc\u00ea j\u00e1 pode ter migrado um ambiente sem nem sequer notar que a CPU ficou mais lenta&#8230; Mas as queries podem ter sa\u00eddo de 50ms, para 100ms&#8230;<\/p>\n<p>Mas aqui vai um conselho: Sempre verifica! Sempre valide! At\u00e9 agora nesta s\u00e9rie, voc\u00ea j\u00e1 aprendeu a usar duas ferramentas e tem dois scripts para validar. Coloque isso nos seus processos e durma feliz ap\u00f3s as migra\u00e7\u00f5es cr\u00edticas! N\u00e3o t\u00f4 dizendo que este sempre vai ser o problema, mas se for, voc\u00ea vai peg\u00e1-lo, antes que o inverso aconte\u00e7a.<\/p>\n<p>&nbsp;<\/p>\n<p>E se ainda voc\u00ea precisar de uma for\u00e7a para avaliar casos estranhos como estes, pode chamar a gente do <a href=\"https:\/\/www.fabriciolima.net\/\">#TeamFabricioLima<\/a> que vamos at\u00e9\u00a0 os bit e bytes da sua CPU para achar o problema!<\/p>\n<p>E voc\u00ea acha que acabou por aqui? Nada disso! Ainda tem muito o que falar sobre CPU!<\/p>\n<p>No pr\u00f3ximo post quero explicar a voc\u00ea uma diferen\u00e7a muito importante sobre o <span style=\"color: #ff0000;\"><strong>tempo de CPU<\/strong><\/span> e o <span style=\"color: #0000ff;\"><strong>percentual de CPU<\/strong><\/span>. Voc\u00ea vai passar a analisar as queries de outra forma! At\u00e9 l\u00e1!<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">This entry is part 3 of 4 in the series <a href=\"https:\/\/thesqltimes.com\/blog\/series\/desempenho-do-processador-x-desempenho-do-sql-server\/\" class=\"series-225\" title=\"Desempenho do Processador x Desempenho do SQL Server\">Desempenho do Processador x Desempenho do SQL Server<\/a><\/div><p>S\u00e3o 7 horas da manh\u00e3, e recebo uma liga\u00e7\u00e3o da Equipe de BI, dizendo que todas as cargas est\u00e3o 50% mais lentas. O caos se instaura na equipe, pois os relat\u00f3rios do dia n\u00e3o estariam prontos&#8230; Isso aconteceu depois de uma migra\u00e7\u00e3o. A m\u00e1quina antiga era virtual. A m\u00e1quina nova? F\u00edsica. Com configura\u00e7\u00f5es id\u00eanticas! Como&hellip;&nbsp;<a href=\"https:\/\/thesqltimes.com\/blog\/2019\/02\/27\/desempenho-do-processador-x-desempenho-do-sql-server-parte-3\/\" rel=\"bookmark\"><span class=\"screen-reader-text\">Desempenho do Processador x Desempenho do SQL Server \u2013 Parte 3<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1100,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[9,94,7,1,93],"tags":[237,230,31,238,239,235,236,73,87],"series":[225],"class_list":["post-1086","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arquitetura","category-powershell","category-sql-server","category-uncategorized","category-windows","tag-bios","tag-clock","tag-cpu","tag-lentidao","tag-migracao","tag-processor","tag-speed","tag-sql-server","tag-windows","series-desempenho-do-processador-x-desempenho-do-sql-server"],"_links":{"self":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/1086","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/comments?post=1086"}],"version-history":[{"count":10,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/1086\/revisions"}],"predecessor-version":[{"id":1105,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/posts\/1086\/revisions\/1105"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media\/1100"}],"wp:attachment":[{"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/media?parent=1086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/categories?post=1086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/tags?post=1086"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/thesqltimes.com\/blog\/wp-json\/wp\/v2\/series?post=1086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}