BlackTDN Search

segunda-feira, 2 de janeiro de 2012

Protheus :: AppServer :: Keep-Alive

Mateus disse...

“Olá Naldo, você poderia criar um post comentando sobre o funcionamento do totvsappserver e sua relação com os clients/licenças.
Por exemplo, não foi pouca as vezes que tive que reiniciar o serviço do appserver por causa de licenças "presas" no servidor (normalmente pelo "fechamento CTRL+ALT+DEL" no lado dos clients).
Por que isto ocorre ?
Abraços”

Esse não é um problema específico e exclusivo do Protheus, vários sistemas cliente/servidor que trafegam sobre TCP/IP sofrem do mesmo mal.

A questão é saber a forma como o Protheus implementa o tratamento para KeepAlive.

Normalmente o KeepAlive é tratado pelo SO, mas nada impede que de tempos em tempos o Protheus server pergunte ao cliente "ainda está aí".

Uma configuração que pode minimizar isso é a ativação do InactiveTimeOut (que nem sempre funciona e, provavelmente, não irá funcionar na eventualidade de um CTRL+ALT+DEL).

Outra questão é a inexistência da chave para o dbAccess.  Será que dbAcces também trata InactiveTimeOut? Será que quando recebe uma requisição demorada e uma ação de CTRL+ALT+DEL é tomada no cliente o dbAcces é inteligente o suficiente para interromper o processo? Acredito que não.

“A solução: Keep Alive!”

No Windows, por padrão, as mensagens para o “Keep-Alive” são de 7,200,000 milisegundos ou duas horas mas esse tempo pode ser modificado com alterações no registro.

TCP Keep-Alive Messages

A TCP keep-alive packet is simply an ACK with the sequence number set to one less than the current sequence number for the connection. A host receiving one of these ACKs responds with an ACK for the current sequence number. Keep-alives can be used to verify that the computer at the remote end of a connection is still available. TCP keep-alives can be sent once everyKeepAliveTime (defaults to 7,200,000 milliseconds or two hours) if no other data or higher-level keep-alives have been carried over the TCP connection. If there is no response to a keep-alive, it is repeated once every KeepAliveInterval seconds. KeepAliveInterval defaults to 1 second. NetBT connections, such as those used by many Microsoft networking components, send NetBIOS keep-alives more frequently, so normally no TCP keep-alives are sent on a NetBIOS connection. TCP keep-alives are disabled by default, but Windows Sockets applications can use the setsockoptfunction to enable them.”(fonte:Microsoft/TechNet)

Para Entender um pouco mais sobre “Keep-Alive” siga os links:

  1. TCP Keep-Alive Messages
  2. Using TCP keepalive to Detect Network Errors
  3. Setting the TCP keepalive timer in Windows NT, 2000 and XP
  4. Microsoft Windows 2000 TCP/IP Implementation Details

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Tcpip]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Tcpip\Parameters]
"KeepAliveTime"=dword:00000001
"KeepAliveEnable"=dword:00000001
"KeepAliveInterval"=dword:00000001

[]s
иαldσ dj

7 comentários:

  1. Excelent post Naldo, valeu pela resposta !

    Uma solução então, seria trabalhar em cima dos valores de registro TcpIP do Windows, por exemplo.

    Acho que o uso maior da banda por estes pacotes é um preço infimo a se pagar.

    Abraços,

    ResponderExcluir
  2. No windows 2008 R2 eu nao encontrei essa chave. Ajudaria bastante se esse problema fosse solucionado.

    ResponderExcluir
  3. KeepAliveTime
    Note
    TCP keepalives for TCP/IP for Windows Server 2008 and Windows Vista are disabled by default. If enabled through the use of the setsockopt Windows Sockets function, a keepalive segment is sent every two hours by default, as controlled by the KeepAliveTime registry value. Even if enabled, other upper-layer protocols such as NetBIOS send their own keepalive value. If the keepalive interval that the upper-layer protocol uses is less than the TCP keepalive interval, TCP keepalive value is never sent. For example, NetBIOS sessions over TCP/IP send a NetBIOS keepalive request every 60 minutes. Therefore, TCP keepalive values that are enabled for a NetBIOS session are never used.

    http://technet.microsoft.com/en-us/library/dd349797(WS.10).aspx

    ResponderExcluir
  4. Algumas Builds atuais do Protheus, tratam esta questão da conexão ficar presa, mesmo quando o usuário utiliza o subterfugio do "CTRL+ALT+DEL".
    Porém, como nosso amigo Naldo mesmo disse, ainda assim podem ocorrer problemas.
    "Não existe sistema perfeito".

    Abraços!

    Jorge Heitor

    ResponderExcluir
  5. Essa mudança no registro faço no servidor?

    ResponderExcluir
  6. Sim, no servidor!

    ResponderExcluir
  7. Oi Naldo, deculpe desenterrar o post, seria possível uma forma de deixar um Timer no cliente que não interfira no TimeOut, fiz um timer aqui para coletar estatísticas de uso dos fontes, só que ele executa no menu principal de 30 em 30 segundos, ou seja, depois disso o inactivetimeout nunca mais derrubou nenhuma conexão... vlw pela ajuda.

    ResponderExcluir