domingo, 16 de janeiro de 2011

Migrando Aplicações para o IIS7.0

Uma das razões pelas quais optei em utilizar o Windows 7 - 64 Bits era a possibilidade do computador de desenvolvimento utilizar a capacidade de RAM provida pelos 64 bits, e claro, a melhoria do desempenho na geração dos programas com o Genexus, e isso de fato aconteceu sem muitos trancos e barrancos.

A Microsoft vem evoluindo de forma furiosa a integração entre o Windows Server + IIS7.0 + .NET Plataform, de forma a prover uma melhor segurança e desempenho nas aplicações ASP.NET, e recentemente pude passar algumas dificuldades referentes a desempenho da aplicação no Windows Server e a pergunta que me fizeram me levou a seguinte reflexão:  Porque ainda temos que rodar aplicaçõe no IIS7.0  em modo "Clássico", ou, em outras palavras, porque ficamos na idade da pedra enquanto o homem explora Marte?  Então, ficamos nesse post meio que alienigena, para tentar entender um pouco dos mecanismos que integram Genexus ao IIS7.0 Confesso que as configurações do IIS nunca foram o meu forte, aliás por isso tive que gastar alguns dias para entender um pouco mais a esse respeito.

Running in 32 or 64bits?
Genexus, em modo Web, por natureza roda em 32 bits, e isso acontece porque algumas DLL's são construidas em 32 bits, mais especificamente a geração de PDF's.

Integrated or Classic Pipeline Pool?
Uma das formas do IIS executar aplicações compativeis com versões anteriores do ASP.NET é a possibilidade da execução do Pipeline em modo Classico.  IIS 7.0 possibilita a execução da aplicação de forma integrada, ao próprio servidor, evidentemente com muito mais potência e recursos.

Para entender um pouco a respeito do novo IIS 7.0 temos essas três referências muito interessantes:
Genexus, por sua vez, ainda não suporta o modo Integrated, mas tudo leva a crer que em breve teremos alguma nova propriedade no environment para configurar esse tipo de aplicação.

Desta forma o que podemos fazer nesse exato instante para melhorar o desempenho de nossa aplicação?

Rodando a aplicação Web em modo 64 bits

Apesar da restrição da DLL para relatórios PDF apontado pela Artech, estaremos migrando a aplicação para 64 bits, para fins de teste, e para isso precisamos cumprir alguns passos importantes:
  1. Criar um Pool isolado para a aplicação, isso porque ao configurar o IIS ele cria automaticamente um DefaultAppPool e por falta de habilidade (no meu caso) todas as aplicações Web nesse servidor podem estar usando esse mesmo Pool.

    Isso, em outras palavras faz com que processos distintos de aplicações diferentes, compartilhem o mesmo controle de cache, afetando o desempenho do sistema. Uma DLL meio travada de outro programa, influencia o desempenho de seu lindo sistema, por exemplo.

    Criar o pool é simples, e isso se faz no próprio IIS.



    Sua aplicação deve apontar para esse Pool, ou seja, nas propriedades avançadas, da pasta virtual ou application, no IIS, voce deve selecionar o Pool recém criado.



    Para saber mais:
    http://technet.microsoft.com/pt-pt/library/cc725564(WS.10).aspx
    http://technet.microsoft.com/pt-pt/library/cc731784(WS.10).aspx
     
  2. Pipeline ou Classic: temos essa pequena limitação em Genexus, ou seja, não podemos executar em modo Integrated ainda, portanto, nas propriedades avançadas do Pool, selecione a opção Classic.


  3. Versão do Framework: nessa mesma interface existe a possibilidade de se selecionar a versão do Framework da aplicação, que deve ser a mesma indicada na propriedade Compiler Path do Environment, no Genexus.
     
  4. Migrar a aplicação para o IIS 7.0 (assunto tratado pela Artech já em 2008), que é realizada bastando executar um script no próprio servidor Web.  Para isso, uma janela de CMD e o comando abaixo são suficientes:

    c:\windows\system32\inetsrv\Appcmd migrate config "ApplicationPath ", onde o ApplicationPath deve apontar para o caminho Default Web Site/virtual directory.

    Por exemplo:
    c:\windows\system32\inetsrv\Appcmd migrate config "Default Web Site/Invoice2.NetEnvironment"


    Para que o comando execute completamente é necessário que não tenha ninguém conectado ao sistema, e o script alterará o arquivo Web.Config, portanto, recomenda-se um backup deste para o caso de ocorrer algum problema. futuras manutenções no sistema.   A alteração inclui neste arquivo duas novas áreas e tags em uma seção system.WebServer.

    Para saber mais:http://www2.gxtechnical.com/portal/hgxpp001.aspx?15,4,61,O,S,0,,24521;S
     
  5. Para verificar se o Pool está configurado corretamente, é necessário verificar se a aplicação está rodando em modo correto, para isso o comando a seguir apresenta os Pools que estão configurados para rodar em 64bits:

    c:\Windows\System32\inetsrv\appcmd list apppool /enable32BitAppOnWin64:false
     
  6. Finalmente uma opção é definer o valor da propriedade Compiler Flag no Environment, para indicar o tipo de CPU que a aplicação executará.

    Nas propriedades do Environment, defina o valor do Compiler Flags.



    Segundo a Microsoft, em um Windows de 64 bits:
    * Assemblies compilados com /platform:x86 executará em modo 32 bits
    * Executaveis compilados com /platform:anycpu executará em modo 64 bits
    * DLL´compiladas com /platform:anycpu executará no mesmo modo do IIS (64 bits em nosso caso)

    Para saber mais:
    http://msdn.microsoft.com/en-us/library/zekwfyz4(v=vs.80).aspx
Mesmo com a restrição apontada na execução em modo 64 bits, em nosso caso não houve nenhuma consequencia adicional para que o sistema rodasse sem problemas, inclusive imprimindo em PDF.

Apesar da quantidade de conceitos, o propósito aqui é garantir que nossa aplicação pelo menos rode no modo correto no servidor, ainda falta um degrau para chegarmos ao ideal.