TIDTCPServer e Core 2 duo
Ola Pessoal!
Seguinte: Tenho uma aplicação usando os componentes TIDTCPServer e TIDTCPClient. Desenvolvo em D7 numa máquina AMD Athlon 64 e Windows XP Pro.
Na minha máquina (o AMD), rodo a aplicação servidora e aproximadamente 20 estações se conectam nela e tudo funciona perfeitamente, o dia todo, sem travamentos.
Quando instalo a aplicação servidora numa máquina Intel Core 2 duo, as estações até se conectam e os métodos da aplicação servidora começam a ser executados normalmente. O problema é que ocorre aleatoriamente, ou seja, as vezes é em um método, as vezes em outro, o travamento da aplicação e ninguém mais se conecta. Só finalizando para fechá-la.
Suspeito que o problema seja no processador com 2 núcleos. No gerenciador de tarefas do windows, já coloquei a aplicação para rodar em apenas 1 núcleo (na opção de afinidade), mas mesmo assim continua travando.
Alguém ai já passou por isso e/ou conhece alguma solução para esse problema?
Teria alguma forma de forçar, através de código, o programa rodar em apenas 1 núcleo? Se claro, o problema for com 2 núcleos.
Agradeço desde já!
Marcelo.
Seguinte: Tenho uma aplicação usando os componentes TIDTCPServer e TIDTCPClient. Desenvolvo em D7 numa máquina AMD Athlon 64 e Windows XP Pro.
Na minha máquina (o AMD), rodo a aplicação servidora e aproximadamente 20 estações se conectam nela e tudo funciona perfeitamente, o dia todo, sem travamentos.
Quando instalo a aplicação servidora numa máquina Intel Core 2 duo, as estações até se conectam e os métodos da aplicação servidora começam a ser executados normalmente. O problema é que ocorre aleatoriamente, ou seja, as vezes é em um método, as vezes em outro, o travamento da aplicação e ninguém mais se conecta. Só finalizando para fechá-la.
Suspeito que o problema seja no processador com 2 núcleos. No gerenciador de tarefas do windows, já coloquei a aplicação para rodar em apenas 1 núcleo (na opção de afinidade), mas mesmo assim continua travando.
Alguém ai já passou por isso e/ou conhece alguma solução para esse problema?
Teria alguma forma de forçar, através de código, o programa rodar em apenas 1 núcleo? Se claro, o problema for com 2 núcleos.
Agradeço desde já!
Marcelo.
Tchelllo
Curtidas 0
Respostas
Tchelllo
21/11/2008
Pessoal, fiz alguns testes.
Alterando no msconfig, na aba BOOT.INI, em Opções avançadas, colquei no parametro /NUMPROC o valor 1 e reiniciei.
Após, executei a aplicação e tudo funcionou normalmente, sem travar.
Concluo então que o problema é devido ao processador com 2 núcleos mesmo.
Ao invés de deixar meu servidor rodando apenas um núcleo, existe uma maneira, através de código, de forçar a aplicação rodar em apenas 1 núcleo? Assim como o firebird, onde, através do parâmetro CpuAffinity do firebird.conf, podemos configurar quantos cpu´s ele usará.
Ah, esqueci de mencionar na msg. anterior, mas a aplicação acessa o firebird na maioria dos métodos. Será algum problema com isso?
Marcelo.
Alterando no msconfig, na aba BOOT.INI, em Opções avançadas, colquei no parametro /NUMPROC o valor 1 e reiniciei.
Após, executei a aplicação e tudo funcionou normalmente, sem travar.
Concluo então que o problema é devido ao processador com 2 núcleos mesmo.
Ao invés de deixar meu servidor rodando apenas um núcleo, existe uma maneira, através de código, de forçar a aplicação rodar em apenas 1 núcleo? Assim como o firebird, onde, através do parâmetro CpuAffinity do firebird.conf, podemos configurar quantos cpu´s ele usará.
Ah, esqueci de mencionar na msg. anterior, mas a aplicação acessa o firebird na maioria dos métodos. Será algum problema com isso?
Marcelo.
GOSTEI 0
Cabreu.jr
21/11/2008
Amigo o problema deve ser com o firebird. Ao invés de setar a aplicação pra usar um núcleo sete só o firebird pra usar um núcleo que deve resolver.
Abra o firebird.conf e tire o comentário da linha CpuAffinityMask = 1
Abra o firebird.conf e tire o comentário da linha CpuAffinityMask = 1
GOSTEI 0
Tchelllo
21/11/2008
Obrigado por responder cabreu.jr!
Tentei fazer isso mas não resolveu. Tb tentei instalar o firebird na versão classic, mas tb não adiantou.
Tentei tb a função SetProcessAffinityMask direto no código, mas tb não adiantou, pois continuou travando. Estava colocando assim:
SetProcessAffinityMask(GetCurrentProcessId, $00000001);
O GetCurrentProcessId pega o Id do processo da aplicação (o arquivo .exe).
Já o $00000001, fará uso somente de um núcleo.
fonte: [url]http://www.delphi3000.com/articles/article_3565.asp?SK=multi¬20thread[/url]
Tentei colocar essa função no Create do form principal da aplicação e até logo após o application.initialize, e nada.
Esse problema tá complicado de resolver! :(
Tentei fazer isso mas não resolveu. Tb tentei instalar o firebird na versão classic, mas tb não adiantou.
Tentei tb a função SetProcessAffinityMask direto no código, mas tb não adiantou, pois continuou travando. Estava colocando assim:
SetProcessAffinityMask(GetCurrentProcessId, $00000001);
O GetCurrentProcessId pega o Id do processo da aplicação (o arquivo .exe).
Já o $00000001, fará uso somente de um núcleo.
fonte: [url]http://www.delphi3000.com/articles/article_3565.asp?SK=multi¬20thread[/url]
Tentei colocar essa função no Create do form principal da aplicação e até logo após o application.initialize, e nada.
Esse problema tá complicado de resolver! :(
GOSTEI 0
Cabreu.jr
21/11/2008
qual componente voce está usando com o firebird? voce faz uso de thread?por acaso voce usa algum componente tipo Eurekalog pra rastrear o erro?
GOSTEI 0
Tchelllo
21/11/2008
Uso os componentes DBExpress que vem com o Delphi 7.
Estou usando o TIDTCPServer da paleta Indy, que cria uma thread para cada conexão. Ressalvo que antes de cada execução de determinado método, travo o server com LockList.
Não uso nenhum componente tipo o Eurekalog.
Estou usando o TIDTCPServer da paleta Indy, que cria uma thread para cada conexão. Ressalvo que antes de cada execução de determinado método, travo o server com LockList.
Não uso nenhum componente tipo o Eurekalog.
GOSTEI 0
Tchelllo
21/11/2008
Pessoal, ninguém mais tem idéia da solução deste problema?
GOSTEI 0