segunda-feira, 31 de março de 2014

DB2 trap problem determination

Durante minha vida profissional pude observar muitas análises ruins quando se está tentando determinar a causa raiz de um problema. O x da questão usualmente não é a qualidade técnica do profissional, mas sim a metodologia adotada detalhar a situação para se criar uma linha de eventos válida, somada a uma frequentemente falta de paciência em varrer os logs e analisar com calma as evidências.
Pensando nisso eu escrevi um pequeno passo a passo para uma identificação de causa raia que fiz em uma instância do DB2 que uso para meus testes, onde sem querer esbarrei em um bug do DB2. Espero que sirva como um bom exemplo de análise, independente do produto que você trabalha.

Cenário: em meu ambiente de laboratório eu notei que uma instância do DB2 recorrentemente parava de funcionar na madrugada, sendo necessário um db2start para coloca-la operacional.

Como fiz a análise...

1.      Partindo de um momento perto do horário em que o serviço foi interrompido analisa-se o diaglog, onde encontro uma entrada muito importante:

2014-03-26-00.43.45.477605-180 I38149015A601        LEVEL: Error
PID     : 9475                 TID : 4383345469712  PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000           DB   : HCOREDB
APPHDL  : 0-10765              APPID: *LOCAL.db2inst1.140326052243
AUTHID  : DB2INST1             HOSTNAME: db2luti
EDUID   : 5674                 EDUNAME: db2agent (HCOREDB) 0
FUNCTION: DB2 UDB, base sys utilities, sqleagnt_sigsegvh, probe:1
MESSAGE : Error in agent servicing application with coor_node:
DATA #1 : Hexdump, 2 bytes
0x000003FC9380996C : 0000

2.      Em seguida começamos a ver diversas entradas no diretório do FODC (First Ocurrence Data Capture). Analisando o diretório FODC temos N diretórios com o timestamp do trap, o de nosso interesse é FODC_Trap_2014-03-26-00.43.45.300571_0000.
3.      Neste diretório temos diversos artefatos que foram gerados, mas para essa análise o que nos interessa é o arquivo com trap, que é um snapshot do estado do DB2 quando o stack dump foi capturado (*.trap.txt).
a.      Neste caso foi gerado o 9475.5674.000.trap.txt;
b.      Notem o PID e EDUID destacados no diaglog, o nome do arquivo do trap é iniciado pelo process ID do db2sysc no Linux e o EDU ID do agente;

4.      O arquivo do trap tem diversas informações, entre elas a stack que fica um pouco chata de ler por conta dos nomes gerados pelo compilador. Então para analisar o arquivo e limpar o nome dos métodos, peçam ajuda ao c++filt:

cat 9475.5674.000.trap.txt | c++filt | less

a.      Signal #11 Indica um erro inesperado (9 é o SIGKILL, 2 é o SIGINT, etc..;)

Signal #11 (SIGSEGV): si_addr is 0x000003FC2640A000, si_code is 0x00000002 (SEGV_ACCERR:Invalid permissions for mapped object.)

b.      A entrada <POFDisassembly>  (POF = Point Of Failure) é o método que estava sendo executado quando o problema aconteceu.

<POFDisassembly>
sqldHashZValue32(int, sqlz_value**, sqld_sortkey**) + 0x0116   (/home/db2inst1/sqllib/lib64/libdb2e.so.1)

c.       Isso já dá um ótimo filtro de pesquisa no Google ou Bing, tentem: db2 10.1 “sqldHashZValue32”
                                                              i.      De cara a primeira saída é interessante: http://www-01.ibm.com/support/docview.wss?uid=swg1IC92798 (IC92798: RUNNING MULTIPLE CONCURRENT SAMPLED DETAILED INDEX RUNSTATS MIGHT CAUSE A SERVER ABEND OR INACCURATE INDEX STATISTICS)

d.      Na APAR temos o detalhamento do problema e stack trace de interesse:

sqloEDUCodeTrapHandler
sqldHashZValue32
sqlis_touch_page
sqliProcessColStats
sqlischs
sqlistat
sqldIndexStats
sqlrLocalRunstats

e.      Para garantir que se trata do mesmo problema, vamos comparar a stack no arquivo de trap:

0x000003FFFAAC4888 sqloEDUCodeTrapHandler + 0x0250 (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FC93809DF0 address: 0x3fc93809df0
0x000003FFF8BB97D6 sqldHashZValue32(int, sqlz_value**, sqld_sortkey**) + 0x0116
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFBFC8A92 sqlis_touch_page(unsigned long, schs_cluster_data*) + 0x00ca
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFBFB0C46 address: 0x000003FFFBFB0C46 ; dladdress: 0x000003FFF74C9000 ; offset in lib: 0x0000000004AE7C46 ;
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFBFB5B32 sqliProcessColStats(schs_data*, SQLI_CB*, unsigned int*) + 0x052e
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFBFB7314 sqlischs(SQLI_CB*, SQLD_ISTAT*, SQLD_CSTAT*, SQLD_TSTAT*, schs_data*, int) + 0x0e4c  (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFC143CF2 sqlistat(sqeAgent*, SQLD_CCB*, unsigned int, SQLD_IXCB*, SQLD_ISTAT*, SQLD_CSTAT*, SQLD_TSTAT*) + 0x100e
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFF8CBA094 sqldIndexStats(sqeAgent*, unsigned short, unsigned short, unsigned char, unsigned short, int, unsigned int, SQLD
_ISTAT*, SQLD_TSTAT*, char*, int, char*, int, unsigned int, bool&) + 0x0b58
                (/home/db2inst1/sqllib/lib64/libdb2e.so.1)
0x000003FFFAF28004 sqlrLocalRunstats(sqlrr_cb*, sqlrrstring*, sqlrrstring*, sqlrrstring*, ….

f.        Coincidência? A APAR diz que o problema foi corrigido no fix pack 3, e qual a nossa situação.

Ø  db2level

db2inst1@db2luti:/db2/db2inst1/diaglog> db2level
DB21085I  This instance or install (instance name, where applicable: "db2inst1") uses "64" bits and DB2 code release "SQL10012" with level identifier "0203010E".
Informational tokens are "DB2 v10.1.0.2", "s121127", "IP23396", and Fix Pack "2".

g.      Analisando a CRONTAB do servidor db2luti temos um agendamento marcado para executar todos os dias exatamente 00:43h. Que bate exatamente com o timestamp do diaglog (00.43.45.477605).

43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb
43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb1
43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb2
43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb3
43 00 * * * /home/db2inst1/scripts/runstats.ksh hcoredb4


Conclusão

O agendamento que eu criei para testar variações da rotina de runstats é executada em cinco bancos de dados no mesmo horário, o que nos coloca no cenário do bug. Como paliativo podemos alterar o agendamento, mas a solução definitiva é aplicar o Fix Pack 3 do DB2.

Claro que a análise em si levou mais tempo, pois foi necessário varrer em maior detalhe o diaglog, correlacionar eventos, analisar a APAR, entre outros. É esse cuidado que muitos não têm e como resultado são feitas análise incorretas, onde já vi sugestão de se aplicar fix em que a mensagem de erro é igual, mas com uma stack totalmente diferente, o que significa não se tratar do mesmo problema.

Para quem está procurando material de referência, infelizmente não tenho um link específico, mas participei de um bom seminário em 2013 no IDUG em Barcelona (http://www.idug.org/emea2013) chamado “DB2 LUW Problem Determination and Troubleshooting Workshop”, com o Pavel Sustr e Samir Kapoor. Eles estarão presentes no IDUG 2014 em Phoenix (que acontecerá agora me Maio), então se estiverem por lá eu recomendo participar deste workshop de um dia.

Espero que o exemplo seja útil, não para esse caso em si, mas para ilustrar um pouco a prática na análise de problemas. Espero postar aqui mais casos de análise.

Abraços,

sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

terça-feira, 18 de março de 2014

PASS Summit para Brazucas

OBS: já comprei minha passagem e estarei no PASS Summit 2014!

Atendendo pedidos escrevo esse post, que espero que esse seja um living post, com diversas atualizações e dicas para Brasileiros que irão ao PASS Summit em Seattle, pois é um lugar que conheço razoavelmente bem...
·         PASS Summit 2013: http://www.sqlpass.org/summit/2013/Sessions.aspx
·         PASS Summit 2014: http://www.sqlpass.org/summit/2014/RegisterNow.aspx
·         Meus posts do PASS Summit 2012:
A viagem
Seattle não fica ali na esquina, então se prepare para uma viagem cansativa. A menos que você pegue alguma promoção eu espero que gaste entre R$ 2.500,00 e R$ 3.500,00 na passagem aérea, se tiver milhas para gastar, melhor. O aeroporto que você quer é Seattle Tacoma International Airport (Sigla: SEA - http://www.portseattle.org/Sea-Tac/Pages/default.aspx).
Para quem sai de Brasília a Delta oferece os melhores trechos, sendo o melhor BSB – Atlanta – Seattle (média de 17 horas de viagem). Vale ressaltar que o trecho dentro dos EUA é longo, com mais que 4 horas, e as refeições usualmente pagas. Então aproveito os minutos no aeroporto de entrada nos EUA para comprar alguma coisa para comer e já faço um teste com o cartão de crédito, para ver se foi liberado para uso no exterior.
Outra coisa que gosto de fazer é sair na sexta-feira de noite e chegar sábado de manhã em Seattle, assim eu aproveito o fim de semana antes do evento. Costumo voltar no voo de sábado, para chegar domingo cedo no Brasil, curtir a família e descansar para a segunda-feira.
O evento
O Summit tem 3 dias de duração com sessões diversas, precedido por 2 dias de pre-con (pagos à parte, US$ 495 cada). Idealmente você compra seu ingresso com bastante antecedência (se comprar até o fim desse ano o Summit de 2015 o desconto é muito bom!) e também as pre-sessions, que costumam ter de altíssimo nível. Não deixe de comprar o DVD Set com as gravações do evento, que para participantes costuma sair por US$ 195,00 e muito legal, pois usualmente existe colisão de horário entre grandes sessões.
O evento acontece no centro de convenções da cidade, o Washington State Conference Center (http://www.wscc.com/), que é um lugar grande, bem localizado e que acomoda muito bem um evento desse porte.
Caso você não vá participar da pre-con, pode procurar outros eventos, com o SQLSaturday que costuma acontecer nas redondezas de Seattle ou SQL in the City da RedGate (http://sqlinthecity.red-gate.com/), que torço para acontecer neste ano.
Dicas para aproveitar ao máximo o evento
TODO
Carro
Durante o evento é besteira você ficar com o carro, a menos que queria sair de noite para lugares mais longes, porém no centro de Seattle tem muita coisa legal para fazer, então minha recomendação é para pegar um carro antes ou depois do evento. Aí você deve considerar se o seu hotel tem incluso estacionamento, pois alguns cobram uma taxa (ex.: US$ 15) pela diária do estacionamento.
Outra dica é ficar atendo a lugares onde se pode estacionar e horários permitidos, pois é normal ficarmos sabendo de história onde amigos tomaram multa. Eu nunca tomei, mas bastou empresar um dia o carro que tomaram uma por mim! Hehehehe
Como o aluguel da semana é relativamente barato, muitos acabam optando por ficar a semana inteira com o carro. Se você optar por isso, ao invés de pagar a diária do GPS, por um pouco mais você compra um GPS novo e fica com ele para você.
Hospedagem
Ao lado do evento existem hotéis excelentes, como o Sheraton, Hilton, Crowne, Westin e W hotel, todos muito bons, mas um pouco salgado ($$$).
No meu caso eu costumo ficar nos hotéis pertos do Space Needle, que tem um bom custo benefício e são relativamente perto do centro de convenções (8 a 10 quarteirões – 15 a 20 minutos de caminhada). Alguns deles (busque por “<nomedoHotel> by the space needle”):
·         Travelodge: http://www.travelodgeseattlecenter.com/
Além do estacionamento duas outras coisas que sempre checo é o café da manhã e política de entrega de pacotes, pois alguns hotéis cobram para guardar e entregar suas encomendas.
Clima
TODO
Compras
Esse aqui Brasileiro curte:
·         Eletrônicos: Bestbuy que nada, eu gosto de ir à Frys, que é uma loja de eletrônicos imensa que tem perto do aeroporto de Seattle (SEA-TAC) - http://www.frys.com/.
·         Seattle Premium Outlet: aaaaahhhh, outlets, ruim né? O de Seattle fica longe da cidade, então recomendo ir de carro.
o   Faça seu cadastro no site, imprima as promoções e pegue o cupom book, que dá bons descontos no outlet.
·         Toys r’us e Baby r’us: para quem tem filho é parada obrigatória e existem lojas espalhadas ao redor de Seattle.
Não vou esticar aqui mais lojas, se quiserem mais dicas peçam.
O que visitar e conhecer
TODO – Provavelmente a parte mais longa deste post

Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

quarta-feira, 12 de março de 2014

[SQLServerDF] Encontro XX – Integrando o PowerView e PowerPivot no SQL Server 2012 e Sharepoint 2013

Na próxima semana vamos aproveitar a presença do amigo Demétrio Silva em Brasília para recebermos um palestrante de outra cidade (o SQLServerDF está ficando chique!). E melhor ainda, ele vai palestrar o vigésimo encontro do grupo, o que aumenta a responsabilidade.
Dado a lotação da última sessão sei que esta não vai ser diferente, mas infelizmente eu ainda estou avaliando outros locais para realização dos nossos encontros, que poderão suportar um público maior. Porém como foi em cima da hora vamos ficar com o tradicional auditório da Microsoft, que sempre nos acolheu muito bem.
Local: Auditório da Microsoft - Edifício Corporate Financial Center, sala 302 – Brasília, CEP 70712-900
Data e horário: 19/03/2014, 17:30h ~ 20:00h
Tema: Integrando o PowerView e PowerPivot no SQL Server 2012 e Sharepoint 2013
Descrição: Nesta sessão iremos abordar a configuração das ferramentas Enterprise de BI da Microsoft, mais especificamente, será demonstrado como configurar o SSRS, PowerView e PowerPivot do SQL Server 2012 no Sharepoint 2013.
Palestrante: Demétrio Silva
Mini-bio: Demétrio Silva atua no ramo de Tecnologia da Informação há mais de 11 anos, é bacharel em Sistemas de Informação com ênfase em Desenvolvimento de Software, pela FIR-Recife. Instrutor oficial Microsoft, trabalha com SQL Server há 10 anos, com Desenvolvimento, BI e Administração. Também é consultor Sharepoint e possui as certificações MCTS/MCITP/MCT - Sharepoint, Project, SQL Server e Windows Server. É palestrante ativo da comunidade Microsoft e já fez várias palestras e webcasts sobre SQL Server e Powershell.
Quer participar? Então mande um e-mail para o grupo SQLServerDF (https://groups.google.com/forum/#!forum/sqlserverdf) confirmando sua presença, pois a capacidade do auditório é limitada, portanto atendemos na ordem de recebimento dos e-mails!
E por fim, para quem não conhece o Demétrio ele é o cara que sempre pergunta se os encontros serão gravados (inclusive isso “animou” a lista no último encontro), então não deixem de perguntar isso para ele, e dessa vez tenho certeza que será gravado! Hahahahaha
Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br

segunda-feira, 10 de março de 2014

SQLSat #284 Porto Alegre

Como muitos já devem saber em Abril teremos mais um SQLSat no Brasil, dessa vez em Porto Alegre. Acho que o evento dispensa apresentações, mas se você não sabe muito sobre os SQLSats recomendo que visite o site: http://www.sqlsaturday.com/.
Eu submeti uma sessão que felizmente foi aprovada, então vou falar um pouco sobre paralelismo:
Título: Entendendo o paralelismo no SQL Server
Descrição: Um assunto recorrente em discussões sobre SQL Server é o uso do paralelismo, e sempre fica a pergunta, é bom ou ruim? Nessa sessão vamos ver detalhes do paralelismo no SQL Server, configurações que influenciam seu uso (MAXDOP = 1?), entender o famoso wait type CXPACKET e analisar diversas consultas paralelas. Ao fim da sessão você vai poder olhar para o paralelismo com um olhar crítico e realista!
O que estou achando mais fantástico nesse SQLSat é a quantidade de palestrantes diferentes, número maior que o de Brasília (talvez o pessoal tenha ficado com receio da “desorganização do organizador” do evento em BSB, não sei). Evento que até o momento se mostra imperdível, e tenho certeza que será assim até o fim!
Ficou curioso? Então veja todas as palestras: http://www.sqlsaturday.com/284/schedule.aspx
Abraços
sr. Nimbus Serviços em Tecnologia - www.srnimbus.com.br