Share via


O Grande Mistério da Memória Skype para Empresas

Este artigo foi escrito por Kenn Guilstorf, Skype para Empresas Escalation Engineer.

Como engenheiro de escalamento, ajudo os clientes com alguns dos problemas mais "persnickety" Skype para Empresas. Ultimamente, tenho recebido alguns casos "baseados no desempenho" – basicamente, queixas de que Skype para Empresas é lenta ou lenta, não permite a partilha de aplicações ou está simplesmente a utilizar demasiada memória. Muitas vezes, uma investigação sobre estes casos mostra que o utilizador deixou Skype para Empresas executar durante semanas e, ao longo do tempo, a memória subiu até afetar o desempenho. Até reparei nisso quando deixei o Skype correr durante muito tempo. Então, o que é que o Skype está a fazer e porque é que está a conter tanta memória? (Eis uma pequena sugestão: isto é normal e por predefinição. Não há nada de errado – todos os programas nativos efetuam este problema.)

Quanta memória pode mastigar?

O primeiro passo para corrigir qualquer problema é compreender o problema e o primeiro passo para compreender qualquer problema é defini-lo. Isto não é tão fácil de fazer como parece.

Quando Skype para Empresas (SfB) é iniciado pela primeira vez, a utilização da memória é comparativamente pequena (se conseguir contar 100 MB como pequena). Podemos ver que isto ocorre em qualquer número de ferramentas, como o Gestor de Tarefas:

Captura de ecrã que mostra os detalhes da aplicação Lync na janela Gestor de Tarefas com os valores de Memória 83 428K.

Figura 1: Não se deixe enganar: Lync.exe é o nome do processo para SfB (versão de 32 bits)

Ao longo do tempo, a quantidade de memória que o processo utiliza vai aumentar. A dimensão do seu crescimento será determinada pela quantidade de skype utilizada, pelo que é utilizado, etc. Por exemplo, eis o mesmo cliente após cerca de 24 horas:

Captura de ecrã que mostra o detalhe da aplicação Lync na janela Gestor de Tarefas com a Memória a aumentar para 115 196K.

Figura 2: O mesmo SfB 24 horas depois

Assim, o Skype consumiu cerca de 32 MB em 24 horas. Não é muito, certo? Na verdade, não é, até explicar que o Skype esteve inativo durante todas essas 24 horas. Basicamente, comecei a Skype para Empresas num computador, bloqueei-o e esperei cerca de 24 horas antes de desbloqueá-lo. Em utilização, a portagem teria sido muito maior , especialmente se participasse em reuniões, utilizasse a partilha de aplicações ou a partilha de ambiente de trabalho nessas reuniões, utilizasse MI, etc. Vi casos em que Skype para Empresas utilização da memória cresceu para 300 a 500 MB num único dia. Os itens podem ser arriscados após uma ou mais semanas de utilização , especialmente no cliente de 32 bits muito mais limitado pela memória.

Mostrar-me a memória

Existem muitas ferramentas que podem criar perfis de memória. Uma das mais populares – pelo menos na Microsoft – é a ferramenta SysInternals VMap, disponível em VMap v3.26. Podemos utilizá-la para analisar a memória do processo e ver se podemos criar perfis para a memória Skype para Empresas.

Depois de transferir o VMap, execute-o. À medida que começa, abre uma lista de processos para que possa escolher o processo que pretende examinar. Vou escolher lync.exe e clicar em OK.

Captura de ecrã que mostra o mapa V m no início com o Lync selecionado.

Figura 3: VMap em Início

Em seguida, verá um gráfico que é uma representação multicolor do perfil de memória atual para o executável que selecionou – Lync.exe, neste caso.

Captura de ecrã a mostrar a representação multicolor do perfil de memória.

Figura 4: A iniciar o VMap para o Lync.exe iniciado recentemente

Há muita informação aqui, e descrever tudo preencheria uma ou mais mensagens de blogue próprias. Se estiver interessado, existem vários livros fantásticos e artigos online que podem ajudar a explicá-lo. (Pessoalmente, recomendo "Advanced Windows" de Jeffrey Richter – atualmente sem impressão, mas ainda excelente para explicar como funciona a memória. Pode encontrar cópias utilizadas da mesma na sua loja de livros favorita.)

Como pode ver, a memória apresentada no Gestor de Tarefas não está alinhada com nenhuma categoria no VMAp. O Gestor de Tarefas é uma representação mais generalizada; é preciso, mas não conta tudo. O VMAp é muito mais abrangente.

Eis a nossa instância do Skype após o período de espera de 24 horas:

Captura de ecrã que mostra o mapa V m do Skype após 24 horas.

Figura 5: VMap para Skype após 24 horas

Onde está a memória?

Se comparar cada categoria individual, nada realmente se alinha. Na verdade, encontrar o que está a consumir a memória é difícil de fazer porque as categorias de memória flutuam à medida que os objetos e os pedidos de memória são feitos e libertados, e a memória é reservada e consolidada para armazenar vários objetos. O "kernel de conhecimento" (para efeitos deste blogue, de qualquer forma) é a categoria "Gratuito". No nosso exemplo, a memória "livre" é todo o espaço disponível que está "reservado" para o executável do Lync. No entanto, apenas um determinado tipo de memória "consolidada" é apresentado no Gestor de Tarefas. A memória reservada não é contada porque não está a ser utilizada.

Então, onde está a memória? Isto torna-se difícil de identificar porque a memória não se perde. Ao contrário do que se pensa, a equipa do Skype não foi subsidiada pelos fabricantes de memória de ambiente de trabalho. Não existe nenhum plano nefasto para fazer com que os clientes atualizem quaisquer sistemas ou memória. Isto nem sequer é um caso de obsolescência planeada. A verdade é um pouco mais difícil de explicar.

Vamos recuar um pouco para tornar as coisas mais claras. Quando inicia o cliente Skype para Empresas pela primeira vez, este tem uma quantidade de memória relativamente pequena , normalmente cerca de 100 MB, consoante o número de contactos que controla automaticamente e outros custos gerais (pode ver claramente isto nos dados acima). Após alguns dias, irá reparar que esta pegada aumenta várias centenas de milhares de bytes para vários megabytes. Em determinadas situações, isto pode ser um problema, mas não é necessariamente um problema na Skype para Empresas em si. Em vez disso, é um efeito do paradigma de programação do Windows e da forma como lida com a memória nativamente.

Programação do Windows o quê?

Só vou dar uma vista simplista da memória do Windows aqui. A memória do Windows é processada através de procedimentos dispendiosos (em termos de ciclos e recursos do computador) conhecidos como alocações e desalocação. Quando um programa precisa de memória, pede ao Windows para alocar. Quando a memória terminar, o programa pede ao Windows para a desalocar. Internamente, o Windows passa por vários processos para gerir os pedidos de memória.

Quando é feito um pedido, o Windows verifica a memória que já comprometeu com o processo, mas que o processo não está a utilizar. O Windows procura ver se existe um bloco de memória suficientemente grande para utilizar. Se houver, o sistema usa-o e segue o seu caminho alegre. Se não existir, verifica a memória reservada. Se existir um bloco suficientemente grande de memória reservada, consolida-o (em segmentos definidos pelo sistema operativo conhecidos como "páginas" e armazena a variável na mesma. A memória está agora consolidada e acabamos de aumentar a quantidade de memória do executável.

O que acontece se não houver memória reservada suficiente para processar o pedido? O sistema operativo tenta reservar mais memória, se possível. É aqui que entra em ação a diferença entre a arquitetura de 32 bits e a arquitetura de 64 bits. Um processo de 32 bits só pode utilizar um máximo de 4 GB de memória. Isto deve-se ao facto de 4 GB ser a quantidade máxima que um registo de 32 bits pode resolver. (Um bit só pode conter um 1 ou um 0 – binário. Portanto, 32 bits significa que 232 é o endereço mais alto permitido). Graças à arquitetura de 32 bits, apenas cerca de 2 GB dessa memória é atribuída ao próprio processo, sendo o resto utilizado pelo sistema operativo para mapear DLLs comuns, cuidar de objetos comuns no modo kernel, etc. Num sistema de 64 bits, os registos de 64 bits podem processar 264, o que acaba por ser cerca de 18 exabytes. No entanto, o Windows limita artificialmente a quantidade de memória disponível para ser reservada entre 2 terabytes e 4 terabytes (TB), dependendo da versão do Windows.

Depois de a memória ser reservada, será consolidada e utilizada como antes. O processo de desalocação é, em grande parte, o inverso , exceto para um ou dois detalhes pequenos, mas importantes.

Primeiro, a menos que seja pedido, o Windows nunca "limpa" a memória. Quando a memória é desalocado, é marcada como gratuita no mapa de memória do Windows. O que quer que tenha mantido ainda lá está e permanecerá lá até ser substituído por outra dotação. Em seguida, o Windows raramente elimina a consolidação da memória, a menos que seja pedido para o fazer. Como disse anteriormente, as operações de memória são bastante dispendiosas em termos de recursos. Assim, se um programa precisar da memória alocada anteriormente, o Windows pressupõe que poderá precisar dessa memória novamente e irá adiar a desativação da consolidação da memória até que seja absolutamente necessário. Por fim, o Windows nunca "coalesce" a memória. Isto significa que a memória que o Windows liberta nunca é "agregada" e os blocos de memória livre nunca são "movidos em conjunto" para criar blocos maiores de memória livre. (Todas estas funções são agrupadas numa categoria conhecida como "libertação da memória". .NET Framework famosamente tem algumas funcionalidades de libertação da memória. No entanto, Skype para Empresas é uma aplicação "nativa" ou non-.NET.)

Skype para Empresas processa muitos objetos a cada segundo que têm um tamanho variavelmente dimensionado. Tem de fazer isto para ser a ferramenta deslumbrante que queremos que seja. Pedimos-lhe que faça a gestão de contactos, faça a gestão de calendários (reuniões), MI com os nossos amigos, familiares e colegas e até fale com eles através da voz e do vídeo, partilhe ambientes de trabalho ou janelas, etc. Bem, para citar o falecido, grande Robert Heinlein, entre outros: "Não existe tal coisa como um almoço grátis."

Gerir tantos objetos de tamanhos tão diferentes e muitas vezes variáveis cria alocações e desalocação de segmentos de memória de tamanho variado. Ao longo do tempo, isto causa a fragmentação da memória – por vezes grave – que aumenta a quantidade de memória de Skype para Empresas.

Um exemplo poderá ilustrar melhor este ponto. Vamos supor que o Skype (ou qualquer programa nativo, na verdade) atribui 64 objetos, numerados de 1 a 64, que têm 4 K bytes cada:

Captura de ecrã que mostra os Objetos do Skype 64.

Figura 6: 64 Objetos, cada um com 4 KB de memória

Isto causa uma alocação e alocação de memória de 256 KB. Agora, vamos supor que o programa não requer os objetos pares, pelo que os liberta:

Captura de ecrã que mostra todos os objetos pares lançados.

Figura 7: libertar todos os objetos pares liberta 128 KB de memória!

Se observar a imagem geral da memória geral (utilizando o VMMap ou uma ferramenta semelhante), verá que uma das colunas consolidadas (provavelmente na secção Área Dinâmica para Dados , mas depende exatamente de como o programa pediu a memória) tem menos 128 KB e a secção Gratuito cresceu 128 KB. No Gestor de Tarefas, o programa detém agora apenas 128 bytes de memória KB.

Vamos assumir que o nosso programa tem um único objeto de 8 KB que tem de armazenar. Isto deve ser simples. Afinal, tem 128 KB gratuitos. No entanto, tentar armazenar esse objeto de 8 KB irá criar uma nova reserva de memória em vez de armazenar a memória no espaço livre de 128 KB. Isto acontece porque, se olhar para a memória, pode ver que ainda está segmentada em segmentos de 4 KB! O Windows não tem um bloco de memória suficientemente grande para conter o objeto de 8 KB, pelo que tem de reservar e consolidar mais memória para o programa.

Este é um exemplo bastante inventado, mas ilustra a dificuldade da gestão de memória do Skype. O Skype gere um grande número de objetos que não têm um tamanho facilmente definível. Estes objetos têm um comprimento variavelmente grande. Isto significa que, à medida que os objetos são armazenados e libertados , especialmente durante um longo período de tempo, como dias ou semanas, a fragmentação da memória pode tornar-se grave e, como o Windows tem de alocar mais memória para armazenar os novos objetos, a pegada de memória aumenta excessivamente.

Quando isto causa problemas no cliente de 32 bits, sugerimos frequentemente mudar para o cliente de 64 bits porque a memória é muito menos restrita, graças à arquitetura de 64 bits vs. 32 bits. No entanto, o crescimento excessivo da memória, entre outras considerações, pode causar lentidão mesmo no cliente de 64 bits. Essas outras considerações incluem memória do sistema geral, velocidades do disco (porque a memória do programa é normalmente suportada pela memória virtual no ficheiro de paginação do Windows), quantas outras aplicações estão abertas, etc. Em ambos os casos, à medida que a Skype para Empresas pegada de memória aumenta ao longo do tempo, pior será o desempenho. No caso do cliente de 32 bits, isto pode fazer com que os objetos maiores de que o Skype necessita – como a memória intermédia interna para a partilha de aplicações – fiquem sem espaço e causem falhas.

Para ser justo, a memória é apenas um recurso que é consumido ao longo do tempo , mas é o mais óbvio. A utilização de identificadores pode aumentar, os threads aumentarão ao longo do tempo, a memória do conjunto paginado aumentará, etc. Cada um destes aumentos pode ter um impacto no processo e, em determinados casos, em todo o sistema operativo. Esta é uma das inúmeras razões pelas quais sugerimos , mesmo para o cliente de 64 bits, que os utilizadores saiam e reiniciam o Skype diariamente (ou, pelo menos, semanalmente) como melhor prática.

O que devo fazer em relação a isto e posso forçar o Skype a reiniciar?

Existem várias formas de forçar um reinício do Skype, mas não existe uma única, a melhor forma. Uma das formas, é claro, é a educação dos utilizadores. Os utilizadores são os árbitros da utilização do ambiente de trabalho na maioria dos casos, por isso é pragmático ensiná-los a terminar sessão e fechar o Skype quando saem durante o dia. Isto também pode ser feito como um passo obrigatório ao escrever um script personalizado ou executável e, em seguida, executar um como uma tarefa do Programador de Tarefas. Esta abordagem é um pouco mal-intencionada e pode fazer com que o Skype ande de bicicleta mesmo quando está "em utilização" (embora isto possa ser mitigado um pouco através das condições do Programador de Tarefas). Existem também oportunidades de terceiros para gestão de computadores e computadores, potenciais opções de BIOS, etc.

A questão é que é melhor para Skype para Empresas ciclo-lo diariamente ou, pelo menos, semanalmente. Se conseguir preparar os seus utilizadores para reciclar Skype para Empresas regularmente ou, pelo menos, quando as coisas ficam estranhas, provavelmente terá muito menos chamadas de Suporte Técnico e muitos mais utilizadores felizes.