Desafio da Semana #7

Desafio da Semana #7

Por: Roberto Alexis Farah

CENÁRIO

O desafio dessa semana veio de uma situação que me deparei num incidente há uma semana atrás. Aplicação ASP.NET consumindo 100% de CPU. Após coleta de dumps e análise notei que as threads do Garbage Collector estavam consumindo alta CPU. Analisando mais foi possível isolar o fragmento de código fazendo o GC disparar.

Portanto, montei uma rotina simples apenas com o fragmento de código responsável pelo sintoma, com algumas modificações para simplificar, para que vocês possam reproduzir o sintoma.

Eis o código:

'Exemplo de parametros:

'ABC!DEF#45GH

'ABC!DEFxxxxAAAGH1

'4fgfgjfdhg3fdgjfgjh1

Public Function Crypto(ByVal someString As String) As String

              ' Inicializa a semente de nuvero aleatorio para sempre ser diferente.

              VBMath.Randomize()

              Dim num1 As Long = Strings.Len(someString)

              ' Cria uma chave usando um numero aleatorio e o tamanho da string.

              ' O numero nunca e' maior que o tamanho da string.

              Dim text1 As String = StringType.FromLong(CType(Math.Round(CType(((num1 * VBMath.Rnd) + 1.0!), Double)), Long))

              ' Varre os caracteres da string apenas.

              Do While Not Char.IsNumber(CharType.FromString(Strings.Mid(someString, IntegerType.FromString(text1), 1)))

                   ' Efetua a mesma conversao.

                   text1 = StringType.FromLong(CType(Math.Round(CType(((num1 * VBMath.Rnd) + 1.0!), Double)), Long))

              Loop

              Crypto = text1

End Function

SINTOMA

Sintoma intermitente de hang com CPU a 100%.

OBJETIVO

Identifique o PROBLEMA e proponha uma SOLUÇÃO.

Para isso você terá que reproduzir o sintoma utilizando o fragmento de código acima e criando uma aplicação VB.NET para utilizá-lo. Aqui usei Visual Studio 2005.

Nota: Não há especificação para o código acima. É a especificação que nos permite classificar um problema como um bug ou um comportamento previsto sob determinada situação, “by design”, entretanto, nesse caso o problema era de fato um bug.

Na situação real após isolar o problema não propus uma solução devido a complexidade do algoritmo, as interações com outros componentes e o fato de não ter acesso a especificação, portanto, serei flexível com as soluções propostas.

De fato, na grande maioria das vezes a solução é a parte fácil, enquanto a parte difícil é se isolar o problema.