Guía de seguimiento dinámico de Solaris

Capítulo 39 Estabilidad

A menudo, Sun pone tecnologías de forma temprana a disposición de los desarrolladores, así como herramientas de observación que permiten a los usuarios acceder a los detalles de implementación internos del software de usuario y del núcleo. Lamentablemente, los detalles de las nuevas tecnologías y de las implementaciones internas son proclives a cambiar a medida que evolucionan las interfaces y las implementaciones, y maduran cuando el software se actualiza o se aplican parches. Sun documenta los niveles de estabilidad de la aplicación y la interfaz utilizando una serie de etiquetas, descritas en la página de man attributes(5) para ayudar a definir las expectativas del usuario con respecto a qué tipos de cambios podrían producirse en las distintas versiones futuras.

Ningún atributo de estabilidad describe de forma adecuada el conjunto arbitrario de entidades y servicios al que se puede acceder desde un programa D. Por lo tanto, DTrace y el compilador D incluyen funciones para computar y describir de forma dinámica los niveles de estabilidad de los programas D que crea. Este capítulo trata las funciones de DTrace para determinar la estabilidad del programa y ayudarle a diseñar programas D estables. Es posible utilizar las funciones de estabilidad de DTrace para informarle de los atributos de estabilidad de sus programas D, o para generar errores de tiempo de compilación cuando el programa tenga dependencias de interfaz no deseadas.

Niveles de estabilidad

DTrace proporciona dos tipos de atributos de estabilidad para entidades tales como las funciones, los sondeos y las variables integradas: un nivel de estabilidad y una clase de dependencia arquitectónica. El nivel de estabilidad de DTrace le ayuda a la hora de evaluar riesgos cuando se desarrollen secuencias de comandos y herramientas basadas en DTrace indicando qué posibilidades tiene una interfaz o entidad DTrace de cambiar en una versión futura o parche. La clase de dependencia DTrace le indica si una interfaz es común a todas las plataformas y procesadores Solaris, o si la interfaz está asociada a una arquitectura determinada, como por ejemplo a procesadores SPARC. Los dos tipos de atributos utilizados para describir interfaces pueden variar de forma independiente.

Los valores de estabilidad utilizados por DTrace aparecerán en la lista siguiente ordenados de menor a mayor estabilidad. Todos los programas D y aplicaciones estratificadas pueden utilizar las interfaces más estables, dado que Sun se esforzará en garantizar que sigan funcionando en futuras versiones menores. Las aplicaciones que dependen sólo de interfaces estables pueden seguir funcionando con fiabilidad en futuras versiones secundarias, y no se verán interrumpidas por parches provisionales. Las interfaces menos estables permitirán la experimentación, creación de prototipos, ajuste y depuración de errores en su sistema actual, pero deben utilizarse teniendo en cuenta que en futuras versiones secundarias podrían volverse incompatibles, e incluso descartarse o sustituirse.

Los valores de estabilidad de DTrace también le ayudan a comprender la estabilidad de las entidades de software que está observando, además de la estabilidad de las interfaces DTrace en sí mismas. Por lo tanto, los valores de estabilidad de DTrace también le indican qué probabilidad tienen sus programas D y herramientas estratificadas de necesitar los cambios correspondientes cuando actualice o cambie la pila de software que está observando.

Internal

La interfaz es privada para DTrace, y representa un detalle de implementación de DTrace. Cabe la posibilidad de que las interfaces internas cambien en versiones menores o microversiones.

Private

La interfaz es privada para Sun, y representa una interfaz desarrollada para su uso por parte de otros productos Sun y que aún no se han documentado de forma pública para su uso tanto por clientes como por ISV. Cabe la posibilidad de que las interfaces private cambien en versiones secundarias o microversiones.

Obsolete

La interfaz se admite en la versión actual, pero su supresión está planificada, probablemente en una versión menor futura. Cuando vaya a cancelarse el soporte de una interfaz, Sun intentará notificarlo antes de hacer efectiva la cancelación. El compilador D podría generar mensajes de advertencia si intenta utilizar una interfaz obsoleta.

External

La interfaz está controlada por una entidad que no es Sun. A criterio de Sun, Sun puede proporcionar versiones actualizadas y posiblemente incompatibles de estas interfaces como parte de cualquier versión, dependiendo de la disponibilidad por parte de la entidad de control. Sun no se responsabiliza de la compatibilidad fuente ni binaria de interfaces externas entre dos versiones cualquiera. Cabe la posibilidad de que aplicaciones basadas en estas interfaces no funcionen en futuras versiones, incluyendo parches que contengan interfaces externas.

Unstable

La interfaz se proporciona para ofrecer a los desarrolladores acceso a versiones preliminares de tecnología nueva o en constante cambio, o a un artefacto de implementación que es fundamental para observar o realizar la depuración de conductas del sistema para las que se ha planificado una solución más estable. Sun no se responsabiliza de la compatibilidad fuente ni binaria entre interfaces Unstable entre una versión y otra.

Evolving

La interfaz podría convertirse en Standard o Stable, pero se encuentra en transición. Sun dedicará esfuerzos razonables para garantizar la compatibilidad con las versiones anteriores a medida que evolucionen. Cuando sean necesarios cambios no compatibles de forma ascendente, se producirán en las versiones mayores y menores. Estos cambios se evitarán en las microversiones, siempre que sea posible. Si el cambio fuera necesario, se informará del mismo en las notas de la versión incluidas en la versión afectada, y siempre que sea posible, Sun proporcionará asistencia de migración para la compatibilidad binaria y el desarrollo continuado del programa D.

Stable

La interfaz es una interfaz madura bajo control de Sun. Sun intentará evitar aplicar cambios no compatibles de forma ascendente a este tipo de interfaces, particularmente en las versiones menores y en las microversiones. Si debe cancelarse el soporte de una interfaz Stable, Sun intentará notificar esta cancelación, y el nivel de estabilidad cambiará a Obsolete.

Standard

La interfaz cumple con un estándar del sector. La documentación correspondiente de la interfaz describirá el estándar al que se acoge. Los estándares suelen estar controlados por una organización de desarrollo de estándares. Los cambios en la interfaz se realizarán de acuerdo con los cambios aprobados en el estándar. Este nivel de estabilidad puede aplicarse también a interfaces adoptadas (sin estándar formal en el sector). El soporte se proporciona sólo para las versiones especificadas de un estándar. No se garantiza el soporte de versiones posteriores. Si la organización de desarrollo de estándares aprueba un cambio no compatible de forma ascendente a una interfaz Standard a la que Sun decide proporcionar soporte, Sun anunciará una estrategia de compatibilidad y de migración.

Clases de dependencia

Dado que Solaris y DTrace son compatibles con diversas plataformas y procesadores, DTrace también etiqueta las interfaces con una clase de dependencia que le indica si una interfaz es común a todas las plataformas y procesadores Solaris, o si la interfaz está asociada a una arquitectura de sistema determinada. La clase de dependencia es ortogonal a los niveles de estabilidad descritos anteriormente. Por ejemplo, una interfaz DTrace puede ser Stable pero sólo compatible con microprocesadores SPARC, o puede ser Unstable pero común a todos los sistemas Solaris. Las clases de dependencia DTrace se describen en la siguiente lista, ordenadas de menos común (es decir, más específica a una arquitectura determinada), hasta más común (es decir, común a todas las arquitecturas).

Unknown

La interfaz tiene un conjunto de dependencias arquitectónicas desconocido. DTrace no tiene por qué conocer las dependencias arquitectónicas de todas las entidades, como por ejemplo tipos de datos definidos en la implementación del sistema operativo. La etiqueta Unknown suele aplicarse a interfaces con nivel de estabilidad muy bajo, de las que no es posible computar las dependencias. La interfaz podría no estar disponible al utilizar DTrace en una arquitectura que no sea la que está utilizando actualmente.

CPU

La interfaz es específica del modelo de CPU del sistema actual. Dentro de la utilidad psrinfo(1M) puede utilizar la opción -v para visualizar el modelo de CPU actual y los nombres de implementación. Puede que interfaces con dependencias de modelo de CPU no estén disponibles en otras implementaciones de CPU, incluso si estas CPU exportan la misma arquitectura de conjunto de instrucciones (ISA). Por ejemplo, una interfaz dependiente de CPU en un microprocesador UltraSPARC-III+ podría no estar disponible en un microprocesador UltraSPARC-II, incluso aunque ambos procesadores admitan el conjunto de instrucciones SPARC.

Platform

La interfaz es específica de la plataforma de hardware del sistema actual. Una plataforma suele asociar un conjunto de componentes de sistema y características de arquitectura, como por ejemplo un conjunto de modelos de CPU compatibles, con un nombre de sistema, como podría ser SUNW,Ultra-Enterprise-10000 . Es posible visualizar el nombre de la plataforma actual utilizando la opción uname(1) -i. La interfaz podría no estar disponible en otras plataformas de hardware.

Group

La interfaz es específica del grupo de plataformas de hardware del sistema actual. Un grupo de plataformas suele reunir un conjunto de plataformas con características relacionadas bajo un único nombre, como por ejemplo sun4u. Es posible visualizar el nombre del grupo de plataformas actual empleando la opción uname(1) - m. La interfaz estará disponible en otras plataformas del grupo de plataformas, pero podría no estar disponible en plataformas de hardware que no pertenezcan al grupo.

ISA

La interfaz es específica de la arquitectura del conjunto de instrucciones (ISA) que admiten los microprocesadores de este sistema. ISA describe una especificación del software que puede ejecutarse en el microprocesador, incluyendo detalles como las instrucciones del lenguaje de ensamblaje y registros. Es posible visualizar los conjuntos de instrucciones nativas que admite el sistema mediante la utilidad isainfo(1). La interfaz podría no ser compatible en sistemas que no exporten ninguno de los mismos conjuntos de instrucciones. Por ejemplo, una interfaz dependiente de ISA en un sistema Solaris SPARC podría no admitirse en un sistema Solaris x86.

Común

La interfaz es común a todos los sistemas Solaris, independientemente del hardware subyacente. Los programas DTrace y las aplicaciones estratificadas que dependan exclusivamente de interfaces Common pueden ejecutarse e implementarse en otros sistemas Solaris que cuenten con las mismas revisiones de Solaris y DTrace. La mayoría de interfaces DTrace son Common, lo que significa que puede utilizarlas con independencia de dónde utilice Solaris.

Atributos de la interfaz

DTrace describe las interfaces utilizando tres atributos, que constan de dos niveles de estabilidad y una clase de dependencia. La convención establece que los atributos de la interfaz se escriben en el orden siguiente, separados por barras:

nombre-estabilidad /  datos-estabilidad / dependencia-clase

La estabilidad del nombre de una interfaz describe el nivel de estabilidad asociado con su nombre, tal y como aparece en el programa D o en la línea de comandos de dtrace(1M). Por ejemplo la variable D execname es un nombre Stable: Sun garantiza que este identificador seguirá admitiéndose sus programas de D, de acuerdo con las reglas descritas anteriormente para las interfaces Stable.

La estabilidad de datos de una interfaz es diferente a la estabilidad asociada al nombre de la interfaz. Este nivel de estabilidad describe el compromiso de Sun de mantener los formatos de datos utilizados por la interfaz y cualquier semántica de datos asociada. Por ejemplo, la variable D pid es una interfaz Stable: los ID de proceso son un concepto estable en Solaris, y Sun garantiza que la variable pid será del tipo pid_t con la semántica establecida en el ID de proceso que corresponde al subproceso que activó un sondeo determinado, de acuerdo con las reglas de las interfaces Stable.

La clase de dependencia de una interfaz es diferente de su estabilidad de nombre y datos, y describe si la interfaz es específica de la plataforma o del microprocesador que se encuentra en funcionamiento en ese momento.

DTrace y el compilador D realizan un seguimiento de los atributos de estabilidad de todas las entidades de la interfaz DTrace, incluyendo proveedores, descripciones de sondeos, variables y funciones D, tipos e instrucciones de programas, tal y como veremos en breve. Tenga en cuenta que los tres valores pueden variar de forma independiente. Por ejemplo, la variable D curthread tiene atributos Stable/Private/Common: el nombre de variable es Stable y Common a todas las plataformas Solaris, pero esta variable proporciona acceso a un formato de datos Private, que es un artefacto de la implementación del núcleo de Solaris. La mayoría de variables D se proporcionan con atributos Stable/Stable/Common, dado que son las variables que define el usuario.

Cálculos e informes de estabilidad

El compilador D realiza cálculos de estabilidad de cada una de las descripciones de sondeo e instrucciones de acción de sus programas D. Puede utilizar la opción -v del comando dtrace para visualizar un informe de estabilidad de su programa. El siguiente ejemplo utiliza un programa escrito en la línea de comandos:


# 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

Puede que también desee combinar la opción - v del comando dtrace con la opción -e, que indica a dtrace que compile pero no ejecute el programa D, de modo que pueda determinar la estabilidad del programa sin tener que habilitar ningún sondeo ni ejecutar el programa. A continuación se muestra otro ejemplo de informe de estabilidad:


# 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
#

Tenga en cuenta que en nuestro nuevo programa hemos hecho referencia a la variable D curthread, que tiene un nombre Stable, pero semántica de datos Private (es decir, si puede verla, estará accediendo a detalles de implementación Private del núcleo), y este estado se refleja ahora en el informe de estabilidad del programa. Los atributos de estabilidad del informe del programa se calculan seleccionando el nivel de estabilidad mínimo y las clases de los valores correspondientes de cada trío de atributos de la interfaz.

Los atributos de estabilidad de una descripción de sondeo se calculan tomando los atributos de estabilidad mínima de todos los campos de descripción de los sondeos especificados, de acuerdo con los atributos publicados por el proveedor. Los atributos de los proveedores DTrace disponibles se muestran en el capítulo correspondiente de cada proveedor. Los proveedores de DTrace exportan tres atributos de estabilidad para cada uno de los cuatro campos de descripción de todos los sondeos publicados por dicho proveedor. Por lo tanto, el nombre de un proveedor podría tener más estabilidad que los sondeos que exporta. Por ejemplo, la descripción del sondeo:

fbt:::

que indica que DTrace debe realizar un seguimiento de las entradas y devoluciones de todas las funciones del núcleo, tiene más estabilidad que la descripción del sondeo:

fbt:foo:bar:entry

que nombra una función interna específica bar() en el módulo del núcleo foo. Por razones de sencillez, la mayoría de los proveedores utilizan un único conjunto de atributos para todos los valores module:function :name que publican. Los proveedores también especifican atributos para la matriz args[], ya que la estabilidad de los argumentos de los sondeos varían según el proveedor.

Si no se especifica el campo proveedor en la descripción de un sondeo, a la descripción se le asignan los atributos de estabilidad Unstable/Unstable/Common, ya que la descripción podría terminar haciendo coincidir sondeos de proveedores que aún no existen cuando se utilizan en una futura versión de Solaris. Por lo tanto, Sun no puede garantizar la futura estabilidad y comportamiento de este programa. Debería siempre especificar de forma explícita cuál es el proveedor a la hora de escribir las cláusulas del programa D. Asimismo, todos los campos de descripción de sondeo que contengan caracteres coincidentes de patrón (consulte el Capítulo 4Estructura del programa D) o variables de macro como $1 (consulte el Capítulo 15Secuencias de comandos), se tratan como si no estuvieran especificados, ya que estos patrones de descripción podrían expandirse para coincidir con proveedores o sondeos publicados por Sun en futuras versiones de DTrace y del SO Solaris.

Los atributos de estabilidad se calculan para la mayoría de instrucciones del lenguaje D tomando la estabilidad y clase mínimas de las entidades de la instrucción. Por ejemplo, las siguientes entidades del lenguaje D tienen los siguientes atributos:

Entidad 

Atributos 

Variable D integradacurthread

Stable/Private/Common 

Variable D definida por el usuario x

Stable/Stable/Common 

Si escribe la siguiente instrucción de programa D:

x += curthread->t_pri;

los atributos resultantes de la instrucción son Stable/Private/Common, los atributos mínimos asociados a los operandos curthread y x. La estabilidad de una expresión se computa tomando los atributos de estabilidad mínimos de cada uno de los operandos.

A las variables D que defina en el programa se asignarán automáticamente los atributos Stable/Stable/Common. Asimismo, a la gramática del lenguaje D y a los operadores D se les asigna de forma implícita los atributos Stable/Stable/Common. A las referencias a símbolos del núcleo que utilicen el operador comilla inversa (`) se les asignan siempre los atributos, porque reflejan artefactos de implementación. A los tipos que defina en el código fuente de su programa D, específicamente a los que están asociados con el espacio de nombre de tipo C y D, se les asignan los atributos Stable/Stable/Common. A los tipos que se definen en la implementación del sistema operativo y proporcionados por espacios de nombres de otro tipo, se les asignan los atributos Private/Private/Unknown. El operador de conversión de tipo D devuelve una expresión cuyos atributos de estabilidad son el mínimo de los atributos de la expresión de entrada y los atributos del tipo de salida de conversión.

Si utiliza el preprocesador C para incluir los archivos de cabecera del sistema C, estos tipos se asociarán al espacio de nombre de tipo C, y se les asignarán los atributos Stable/Stable/Common, ya que la única opción del compilador D es asumir que el usuario toma la responsabilidad de estas declaraciones. Por lo tanto, es posible que no obtenga una percepción clara de la estabilidad del programa si utiliza el preprocesador C para incluir un archivo de cabecera que contenga artefactos de implementación. A fin de determinar los niveles de estabilidad correctos, debe siempre consultar la documentación correspondiente a los archivos de cabecera.

Cumplimiento de la estabilidad

A la hora de desarrollar una secuencia de comandos de DTrace o de cualquier herramienta subyacente, puede que desee identificar la raíz de los problemas de estabilidad o asegurarse de que su programa cuenta con el conjunto de atributos de estabilidad deseado. Puede utilizar la opción dtrace -x amin=attributes para hacer que el compilador D devuelva un error cuando cualquier cálculo de atributos devuelva un trío de atributos inferior a los valores mínimos especificados por el usuario en la línea de comandos. El siguiente ejemplo muestra el uso de -x amin empleando un fragmento de código fuente de programa D. Tenga en cuenta que los atributos se especifican empleando tres etiquetas delimitadas por / en el orden habitual.


# 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
#