Guia de rastreamento dinâmico Solaris

Capítulo 39 Estabilidade

A Sun freqüentemente fornece aos desenvolvedores o acesso imediato às novas tecnologias, assim como ferramentas de observação que permitem que os usuários analisem profundamente os detalhes da implementação interna do software do kernel e do usuário. Infelizmente, as novas tecnologias e os detalhes da implementação interna estão propensos a alterações à medida que as interfaces e as implementações evoluem e se desenvolvem quando o software é atualizado ou corrigido. A Sun documenta os níveis de estabilidade de aplicativo e da interface usando um conjunto de rótulos descritos na página attributes(5) do manual para ajudar a definir as expectativas do usuário em relação a quais tipos de alterações devem ocorrer em tipos diferentes de versões futuras.

Nenhum atributo de estabilidade descreve apropriadamente o conjunto arbitrário de entidades e serviços que podem ser acessados de um programa em D. O DTrace e o compilador de D, portanto, incluem recursos para calcular e descrever dinamicamente os níveis de estabilidade dos programas em D que forem criados. Este capítulo aborda os recursos do DTrace para determinar a estabilidade do programa para ajudá-lo a criar programas em D estáveis. Você pode usar os recursos de estabilidade do DTrace para informá-lo dos atributos de estabilidade dos programas em D, ou para produzir erros em tempo de compilação quando o programa tiver dependências de interface indesejáveis.

Níveis de estabilidade

O DTrace fornece dois tipos de atributos de estabilidade para entidades como variáveis incorporadas, funções e testes: um nível de estabilidade e uma classe de dependência de arquitetura. O nível de estabilidade do DTrace auxilia-o na avaliação de riscos ao desenvolver scripts e ferramentas com base no DTrace, indicando a probabilidade de uma interface ou entidade do DTrace ser alterada em uma futura versão ou patch. A classe de dependência do DTrace informa se uma interface é comum a todas as plataformas e processadores do Solaris ou se a interface é associada a uma arquitetura em particular como somente os processadores SPARC. Os dois tipos de atributos usados para descrever interfaces podem variar independentemente.

Os valores de estabilidade usados pelo DTrace aparecem na seguinte lista da menor para a maior estabilidade. As interfaces mais estáveis podem ser usadas por todos os programas em D e aplicativos em camadas porque a Sun fará o possível para garantir que eles continuem a funcionar em versões secundárias futuras. Os aplicativos que dependem somente de interfaces estáveis devem continuar funcionando corretamente em versões secundárias futuras e não serão interrompidos por patches interinos. As interfaces menos estáveis permitem a experimentação, criação de protótipos, ajuste e depuração no sistema atual, mas devem ser usadas sabendo-se que elas podem se tornar incompatíveis ou até mesmo ser eliminadas ou substituídas por alternativas em versões secundárias futuras.

Os valores de estabilidade do DTrace também auxiliam na compreensão da estabilidade das entidades de software que estão sendo observadas, além da estabilidade das próprias interfaces do DTrace. Portanto, os valores de estabilidade do DTrace também informam a probabilidade dos programas em D e ferramentas em camadas precisarem de alterações correspondentes quando você atualizar ou alterar a pilha de software que está sendo observada.

Interna

A interface é privada do DTrace e representa um detalhe de implementação do DTrace. As interfaces internas podem ser alteradas em micro versões ou versões secundárias.

Privada

A interface é privada da Sun e representa uma interface desenvolvida para uso por outros produtos da Sun que ainda não foram publicamente documentados para uso por clientes e fornecedores independentes de software. As interfaces privadas podem ser alteradas em micro versões ou versões secundárias.

Obsoleta

Há suporte para a interface na versão atual, mas ela está agendada para ser removida, mais provavelmente em uma versão secundária futura. Quando o suporte a uma interface estiver para ser interrompido, a Sun tentará fornecer uma notificação antes de interromper o suporte à interface. O compilador de D produzirá mensagens de aviso se você tentar usar uma interface obsoleta.

Externa

A Sun pode fornecer, por decisão própria, versões atualizadas e possivelmente incompatíveis de tais interfaces como parte de qualquer versão, de acordo com a disponibilidade da entidade controladora. A Sun não garante compatibilidade binária ou de fonte para interfaces internas entre duas versões. Os aplicativos baseados nessas interfaces podem não funcionar em versões futuras, incluindo patches que contenham interfaces externas.

Instável

A interface é fornecida para possibilitar aos desenvolvedores um acesso imediato a tecnologias novas ou em constante alteração ou a um artefato de implementação que seja essencial para a observação ou depuração do comportamento do sistema para o qual uma solução mais estável seja prevista no futuro. A Sun não garante compatibilidade binária ou de fonte para interfaces instáveis de uma versão secundária para outra.

Desenvolvendo

A interface pode eventualmente se tornar padrão ou estável, mas ainda está em transição. A Sun se esforçará para garantir a compatibilidade com versões anteriores à medida que ela se desenvolver. Quando alterações de compatibilidade não-ascendente forem necessárias, elas ocorrerão em versões secundárias e principais. Essas alterações serão evitadas nas micro versões sempre que possível. Se tal alteração for necessária, ela será documentada nas notas de versão da versão afetada e, quando viável, a Sun fornecerá auxílio de migração para compatibilidade binária e contínuo desenvolvimento do programa em D.

Estável

A interface é uma interface desenvolvida sob controle da Sun. A Sun tentará evitar alterações de compatibilidade não-ascendente nessas interfaces, especialmente em micro versões ou versões secundárias. Se o suporte à interface estável tiver que ser interrompido, a Sun tentará fornecer notificação e o nível de estabilidade será alterado para obsoleta.

Padrão

A interface está em conformidade com um padrão de mercado. A documentação correspondente da interface irá descrever o padrão com o qual a interface está em conformidade. Os padrões geralmente são controlados por uma organização de desenvolvimento de padrões e alterações podem ser feitas na interface de acordo com as alterações aprovadas no padrão. O nível de estabilidade também pode ser aplicado em interfaces que tenham sido adotadas sem um padrão formal por uma convenção de mercado. O suporte é fornecido somente para as versões especificadas de um padrão; o suporte para versões posteriores não é garantido. Se a organização de desenvolvimento de padrões aprovar uma alteração de compatibilidade não-ascendente em uma interface padrão para a qual a Sun decida fornecer suporte, a Sun anunciará a estratégia de compatibilidade e migração.

Classes de dependência

Como o Solaris e o DTrace oferecem suporte a várias plataformas operacionais e processadores, o DTrace também rotula interfaces com uma classe de dependência que informa se uma interface é comum a todas as plataformas e aos processadores Solaris ou se a interface é associada a uma arquitetura de sistema em particular. A classe de dependência é ortogonal para os níveis de estabilidade descritos anteriormente. Por exemplo, uma interface do DTrace pode ser estável mas com suporte somente em microprocessadores SPARC ou pode ser instável mas comum a todos os sistemas Solaris. As classes de dependência do DTrace são descritas na lista a seguir ordenadas da menos comum (ou seja, mais específica a uma arquitetura em particular) para a mais comum (ou seja, comum a todas as arquiteturas).

Desconhecida

A interface possui um conjunto desconhecido de dependências de arquitetura. O DTrace não sabe, necessariamente, as dependências de arquitetura de todas as entidades, como os tipos de dados definidos na implementação do sistema operacional. O rótulo Desconhecida geralmente é aplicado a interfaces de estabilidade muito baixa para as quais as dependências não podem ser calculadas. A interface pode não estar disponível durante o uso do DTrace em qualquer arquitetura diferente da que você está usando atualmente.

CPU

A interface é específica do modelo de CPU do sistema atual. Você pode usar a opção -v do utilitário psrinfo(1M) para exibir o modelo de CPU atual e os nomes de implementação. As interfaces com dependências em modelo de CPU podem não estar disponíveis em outras implementações de CPU, mesmo que essas CPUs exportem a mesma ISA (Arquitetura de conjunto de instruções). Por exemplo, uma interface dependente de CPU em um microprocessador UltraSPARC-III+ pode não estar disponível em um microprocessador UltraSPARC-II, mesmo que ambos os processadores ofereçam suporte ao conjunto de instruções SPARC.

Plataforma

A interface é específica da plataforma de hardware do sistema atual. Uma plataforma geralmente associa um conjunto de componentes do sistema e características de arquitetura como um conjunto de modelos de CPU com suporte a um nome de sistema como SUNW,Ultra-Enterprise-10000 . Você pode exibir o nome da plataforma atual usando a opção uname(1) -i. A interface pode não estar disponível em outras plataformas de hardware.

Grupo

A interface é específica do grupo de plataformas de hardware do sistema atual. Um grupo de plataformas geralmente associa um conjunto de plataformas com características relacionadas sob um único nome, como sun4u. Você pode exibir o nome do grupo de plataformas atual usando a opção uname(1) - m. A interface está disponível em outras plataformas no grupo de plataformas, mas pode não estar disponível em plataformas de hardware que não sejam membros do grupo.

ISA

A interface é específica da arquitetura de conjunto de instruções (ISA) com suporte nos microprocessadores deste sistema. A ISA descreve uma especificação por software que pode ser executado no microprocessador, incluindo detalhes como instruções de linguagem de composição e registros. Você pode exibir os conjuntos de instrução nativos com suporte no sistema usando o utilitário isainfo(1). Pode não haver suporte para a interface em sistemas que não exportem nenhum dos mesmos conjuntos de instrução. Por exemplo, uma interface dependente de ISA em um sistema Solaris SPARC pode não ter suporte em um sistema Solaris x86.

Comum

A interface é comum a todos os sistemas Solaris independentemente do hardware subjacente. Os aplicativos em camadas e os programas do DTrace que dependem somente das interfaces comuns podem ser executados e implantados em outros sistemas Solaris com as mesmas revisões do Solaris e do DTrace. A maioria das interfaces do DTrace é comum, assim, você pode usá-las onde quer que use o Solaris.

Atributos de interface

O DTrace descreve as interfaces usando um trio de atributos que consiste em dois níveis de estabilidade e uma classe de dependência. Por convenção, os atributos de interface são escritos na seguinte ordem, separados por barras:

estabilidade de nome / estabilidade de dados / classe de dependência

A estabilidade de nome de uma interface descreve o nível de estabilidade associado ao seu nome conforme aparece no programa em D ou na linha de comando do dtrace(1M). Por exemplo, a variável de D execname é um nome estável: A Sun garante que esse identificador continuará com suporte nos programas em D de acordo com as regras descritas para as interfaces estáveis acima.

A estabilidade de dados de uma interface é diferente da estabilidade associada ao nome da interface. Esse nível de estabilidade descreve o comprometimento da Sun com a manutenção dos formatos de dados usados pela interface e quaisquer semânticas de dados associadas. Por exemplo, a variável de D pid é uma interface estável: as IDs de processo são um conceito estável no Solaris, e a Sun garante que a variável pid será do tipo pid_t com a semântica que está definida como o ID de processo correspondente ao segmento que acionou um determinado teste de acordo com as regras para interfaces estáveis.

A classe de dependência de uma interface é diferente da estabilidade de nome e dados e descreve se a interface é especifica da plataforma operacional atual ou do microprocessador.

O DTrace e o compilador de D controlam os atributos de estabilidade de todas as entidades de interface do DTrace, incluindo provedores, descrições de teste, variáveis de D, funções de D, tipos e as próprias instruções de programa, como veremos em breve. Observe que todos os três valores podem variar independentemente. Por exemplo, a variável de D curthread possui os atributos Estável/Privada/Comum: o nome da variável é estável e comum a todas as plataformas operacionais Solaris, mas essa variável fornece acesso a um formato de dados privado que é um artefato da implementação no kernel do Solaris. A maioria das variáveis de D são fornecidas com os atributos Estável/Estável/Comum, assim como as variáveis que você definir.

Cálculos e relatórios de estabilidade

O compilador de D realiza cálculos de estabilidade para cada uma das descrições de teste e instruções de ação nos programas em D. Você pode usar a opção -v do dtrace para exibir um relatório da estabilidade do programa. O exemplo a seguir usa um programa escrito na linha de comando:


# dtrace -v -n dtrace:::BEGIN'{exit(0);}'
dtrace: description 'dtrace:::BEGIN' matched 1 probe
Stability data for description dtrace:::BEGIN:
        Minimum probe description attributes
                Identifier Names: Evolving
                Data Semantics:   Evolving
                Dependency Class: Common
        Minimum probe statement attributes
                Identifier Names: Stable
                Data Semantics:   Stable
                Dependency Class: Common
CPU     ID                    FUNCTION:NAME
  0      1                           :BEGIN

Você também pode desejar combinar a opção - v do dtrace com a opção -e, que informa ao dtrace para compilar mas não executar o programa em D, para que você possa determinar a estabilidade do programa sem ter que ativar testes e executar o programa. Veja a seguir outro exemplo de relatório de estabilidade:


# dtrace -ev -n dtrace:::BEGIN'{trace(curthread->t_procp);}'
Stability data for description dtrace:::BEGIN:
        Minimum probe description attributes
                Identifier Names: Evolving
                Data Semantics:   Evolving
                Dependency Class: Common
        Minimum probe statement attributes
                Identifier Names: Stable
                Data Semantics:   Private
                Dependency Class: Common
#

Observe que no novo programa, foi feita referência à variável de D curthread, que possui um nome estável, mas uma semântica de dados privada (ou seja, se olhar para ela, estará acessando detalhes de implementação privada do kernel), e seu status agora é refletido no relatório de estabilidade do programa. Os atributos de estabilidade no relatório do programa são calculados selecionando-se o nível de estabilidade mínimo e a classe dos valores correspondentes para cada trio de atributos de interface.

Os atributos de estabilidade são calculados para uma descrição de teste pegando-se os atributos de estabilidade mínimos de todos os campos de descrição de teste especificados de acordo com os atributos publicados pelo provedor. Os atributos dos provedores disponíveis do DTrace são mostrados no capítulo correspondente a cada provedor. Os provedores do DTrace exportam um trio de atributos de estabilidade para cada um dos quatro campos de descrição de todos os testes publicados para esse provedor. Portanto, o nome de um provedor deve ter uma maior estabilidade que os testes individuais que ele exporta. Por exemplo, a descrição do teste:

fbt:::

indicando que o DTrace deve rastrear a entrada e o retorno de todas as funções do kernel, possui uma estabilidade maior que a descrição do teste:

fbt:foo:bar:entry

que nomeia uma função interna específica bar() no módulo do kernel foo. Para simplificar, a maioria dos provedores usa um único conjunto de atributos para todos os valores individuais de módulo:função :nome que eles publicam. Os provedores também especificam atributos para a matriz args[], pois a estabilidade de quaisquer argumentos de teste varia de acordo com o provedor.

Se o campo do provedor não for especificado em uma descrição de teste, então os atributos de estabilidade Instável/Instável/ Comum são atribuídos à descrição porque ela pode terminar correspondendo a testes de provedores que ainda não existem quando usada em uma versão futura do Solaris. A própria Sun não é capaz de fornecer garantias sobre a estabilidade futura e o comportamento deste programa. Você deve sempre especificar explicitamente o provedor ao escrever suas cláusulas do programa em D. Além disso, quaisquer campos de descrição de teste que contenham caracteres de correspondência de padrão (consulte o Capítulo 4Estrutura de programa em D) ou variáveis de macro como $1 (consulte o Capítulo 15Script) são tratados como se não fossem especificados porque esses padrões de descrição podem se expandir para corresponder a provedores ou testes lançados pela Sun em versões futuras do DTrace e do SO Solaris.

Os atributos de estabilidade são calculados para a maioria das instruções da linguagem D utilizando a estabilidade mínima e a classe das entidades na instrução. Por exemplo, as seguintes entidades da linguagem D possuem os seguintes atributos:

Entidade 

Atributos 

Variável incorporada de D curthread

Estável/Privada/Comum 

Variável definida pelo usuário de D x

Estável/Estável/Comum 

Se você escrever a seguinte instrução do programa em D:

x += curthread->t_pri;

os atributos resultantes da instrução serão Estável/Privada/Comum, os atributos mínimos associados aos operandos curthread e x. A estabilidade de uma expressão é calculada pegando-se os atributos de estabilidade mínima de cada um dos operandos.

Quaisquer variáveis de D que você defina no programa recebem automaticamente os atributos Estável/Estável/Comum. Além disso, a gramática da linguagem D e os operadores de D recebem, implicitamente, os atributos Estável/Estável/Comum. As referências aos símbolos do kernel usando o operador aspa invertida (`) recebem sempre os atributos Privada/Privada/Desconhecida porque refletem artefatos de implementação. Os tipos definidos no código-fonte do programa em D, especificamente os que são associados ao espaço de nome do tipo C e D, recebem os atributos Estável/Estável/Comum. Os tipos que são definidos na implementação do sistema operacional e fornecidos por outros tipos de espaço de nome recebem os atributos Privada/Privada/Desconhecida. O operador de difusão do tipo D produz uma expressão cujos atributos de estabilidade são o mínimo dos atributos da expressão de entrada e dos atributos do tipo de resultado de difusão.

Se você usar o pré-processador de C para incluir arquivos de cabeçalho do sistema C, esses tipos serão associados ao espaço de nome do tipo C e receberão os atributos Estável/Estável/Comum, pois o compilador de D não tem outra opção senão supor que você está assumindo a responsabilidade por essas declarações. Portanto, é possível que você se engane sobre a estabilidade do programa caso use o pré-processador de C para incluir um arquivo de cabeçalho contendo artefatos de implementação. Você deve sempre consultar a documentação correspondente aos arquivos de cabeçalho que está incluindo para determinar os níveis corretos de estabilidade.

Aplicação de estabilidade

Ao desenvolver uma ferramenta em camada ou script do DTrace, talvez você queira identificar a fonte específica de questões de estabilidade ou garantir que o seu programa possui um conjunto desejado de atributos de estabilidade. Você pode usar a opção dtrace -x amin=atributos para forçar o compilador de D a produzir um erro quando qualquer cálculo de atributo resultar em um trio de atributos menor que os valores mínimos especificados na linha de comando. O exemplo a seguir demonstra o uso de -x amin através de um trecho da fonte do programa em D. Observe que os atributos são especificados usando-se três rótulos delimitados por / na ordem usual.


# dtrace -x amin=Evolving/Evolving/Common \
    -ev -n dtrace:::BEGIN'{trace(curthread->t_procp);}'
dtrace: invalid probe specifier dtrace:::BEGIN{trace(curthread->t_procp);}: \
    in action list: attributes for scalar curthread (Stable/Private/Common) \
    are less than predefined minimum
#