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.