Temos um aplicativo CF8 que é executado por 20 a 25 minutos antes de travar sob carga pesada ~ 1200 usuários. Essa carga é gerada por nossa ferramenta de teste de carga: 1200 usuários aumentaram em 5 minutos (aproximadamente o comportamento de nossos usuários), funcionando por uma hora.
Temos este aplicativo no Solaris 10, Apache 2, JRun 4 e Oracle 10g. A versão do Java é 1.6.
Durante os testes de carga iniciais, os dumps de thread apontavam para monitorar deadlocks que apontavam para sessões.
"jrpp-173":
waiting to lock monitor 0x019fdc60 (object 0x6b893530, a java.util.Hashtable),
which is held by "scheduler-1"
"scheduler-1":
waiting to lock monitor 0x026c3ce0 (object 0x6abe2f20, a coldfusion.monitor.memory.SessionMemoryMonitor$TopMemoryUsedSessions),
which is held by "jrpp-167"
"jrpp-167":
waiting to lock monitor 0x019fdc60 (object 0x6b893530, a java.util.Hashtable),
which is held by "scheduler-1"
Aumentamos o número de sessões em relação ao número de CPUs (48 encadeamentos simultâneos contra 32 CPUs), e o impasse foi embora. Embora a variação dos encadeamentos simultâneos ajudasse um pouco em termos de tempo de resposta, o servidor CF ainda ficava cheio em 20 a 25 minutos durante todos desses testes.
Fizemos mais despejos de thread e vimos um thread bloqueando um monitor, por exemplo:
"jrpp-475" prio=3 tid=0x02230800 nid=0x2c5 runnable [0x4397d000]
java.lang.Thread.State: RUNNABLE
at java.util.HashMap.getEntry(HashMap.java:347)
at java.util.HashMap.containsKey(HashMap.java:335)
at java.util.HashSet.contains(HashSet.java:184)
at coldfusion.monitor.memory.MemoryTracker.onAddObject(MemoryTracker.java:124)
at coldfusion.monitor.memory.MemoryTrackerProxy.onReplaceValue(MemoryTrackerProxy.java:598)
at coldfusion.monitor.memory.MemoryTrackerProxy.onPut(MemoryTrackerProxy.java:510)
at coldfusion.util.CaseInsensitiveMap.put(CaseInsensitiveMap.java:250)
at coldfusion.util.FastHashtable.put(FastHashtable.java:43)
- locked <0x6f7e1a78> (a coldfusion.runtime.Struct)
at coldfusion.runtime.CfJspPage._arrayset(CfJspPage.java:1027)
at coldfusion.runtime.CfJspPage._arraySetAt(CfJspPage.java:2117)
at cfvalidation2ecfc1052964961$funcSETUSERAUDITDATA.runFunction(/app/docs/apply/cfcs/validation.cfc:377)
Como você pode ver na última linha acima, havia várias referências de CFMs e CFCs, e as linhas tinham tags "cflock", que tinham como escopo o "aplicativo". Nós (a equipe de desenvolvedores) os alteramos para o escopo de um "nome".
Depois de mais testes de carga, não há bloqueio acontecendo e não há deadlocks, mas agora os tanques de aplicação em 7-10 minutos.
Recebemos relatórios de sistema, rede e banco de dados dos respectivos administradores e eles não estão sendo tributados; Até mesmo assisti as estatísticas do servidor com o monitor do servidor, top, prstat, correu relatórios sar, etc Então, nós acreditamos que é um problema com o servidor CF ou talvez a JVM.
Estou ficando sem ideias quanto ao que mais podemos tentar. Disclaimer: Eu não sou um desenvolvedor CF ou Admin. Estou apenas executando o teste de carga, analisando os relatórios, os encadeamentos, etc, e compartilhando os resultados com as equipes de desenvolvimento e administração, e tentando a próxima alteração, e assim por diante. Até agora não há dados.
Alguém se deparou com algo semelhante? Como você fez o diagnóstico e a solução de problemas? Todos os pensamentos e ponteiros são bem vindos.
Obrigado pelo seu tempo!
KM