使用 IBM AIX RAS 基础架构跟踪服务的技术库

用于内核扩展程序与设备驱动程序

本文介绍了如何使用 IBM® AIX® 可靠性、可用性与可服务性 (RAS) 基础架构服务对内核扩展程序与设备驱动程序启用跟踪功能。AIX 基础架构主要管理内核扩展程序与设备驱动程序的核心错误日志记录、组件跟踪与转储设备。AIX 基础架构提供了注册和控制针对内核扩展程序与驱动程序组件的跟踪设备级别的接口。AIX 基础架构还通过一个示例实现说明了使用 RAS 基础架构需要了解的概念与要遵循的最佳实践。

Premkumar Nagarajan, 高级系统工程师, IBM

Premkumar Nagarajan 是 AIX RAS 开发团队的一名高级系统工程师。他一直致力于 AIX 的各种特性,包括可靠性、可服务性与可用性。在加入 IBM 之前,他从事过各种存储技术与各种核心内核组件开发活动。



2013 年 5 月 27 日

概述

搭建 IBM AIX RAS 基础架构的目的是了解 AIX 和第三方组件层次的结构,以提供错误日志记录、组件跟踪与转储设备。组件层次结构基于基本组件、子组件以及组件路径名称而构建。组件层次结构支持在组件粒度等级上修改错误日志记录、转储与跟踪的组件特征。所有组件均在逻辑命名空间 ("<base component name>.<component specific subcomponents>") 中注册,以表示分层的命名结构。


术语

组件:一个独立的基础组件或子组件。在文件系统术语中,这类似于一个独立的目录(每个组件都是一个独立目录,可以拥有下一层的子组件)。每个组件都有一个与其父组件相关的名称,并能拥有下一层的子组件。

基础组件:没有任何父组件的组件。

子组件:有父组件的组件。

组件路径:一个完整的组件名称。在文件系统术语中,这类似于一个文件的完整路径。

注册机:处理组件层级结构的子系统或代码。

注册:注册机使用服务 ras_registerras_unregister 来注册和注销组件。注册过程中将给每个组件指定一个 ras_block_t,可用作句柄来控制注册机的 RAS 特征。这里,组件打算将其注册为可被追溯(traceware)。


RAS 内核服务程序

typedef long (*ras_callback_t)(
              ras_block_t,
              long,
              void *,
              void *);
 
long ras_register(
              ras_block_t *rasbp,
              char *name,
              ras_block_t parent,
              ras_type_tlong typesubtype,
              char *desc,
              long flags,
              ras_callback_t ras_callback,
              void *private_data);

注册基础组件时,还需要注册一个 typesubtype 字段。此字段提供访问基础组件功能的线索。scdisk 组件就是这样的一个示例,注册其使用的 typesubtype 字段是 RAS_TYPE_STORAGE_DISK。这表明了组件命名规范中的父子类型关系。

语法:

long (*ras_callback)(
              ras_block_t ras_blk,
              long command,
              void *arg
              void *private_data);
 

#include <sys/ras.h>
 
long ras_customize(ras_block_t *ras_blk);

#include <sys/ras.h>
 
long ras_control(
              ras_block_t ras_blk,
              long command,
              void *arg,
              long argsize);

为了提高组件注册的持久性,组件必须完成三个步骤。

  • 调用注册机指定一个名称并设置属性。
  • 在 RAS 基础架构的帮助下,调用 ras_control 设置组件的默认设置。例如,可以设置 trace buffer sizeerror logging level 属性的值。
  • 调用同步的 ras_customize 来验证设置并使之持久。可以通过修改内容的回调来通知注册机,但 RAS 基础架构会完成所有的工作,比如调用 ras_control 来更改为该组件定制的属性。回调命令将在进行来自 RAS 基础架构的默认操作之前在组件中执行完毕。

内核扩展程序样例

#include <errno.h>
#include <syslog.h>
#include <sys/device.h>
#include <sys/ras_trace.h>
#include <sys/ras.h>
#include <sys/trchkid.h>
ras_block_t rascb;
#define  HKWD_SAMPLE 0xcccc

#define CTRC_HOOK(level , hook,tag,d1,d2,d3,d4) \
        CT_HOOK5 (rascb, level, MT_SYSTEM|MT_PRIV,    \
          hook, *(ulong *)tag,  \
          (ulong)d1, (ulong)d2, (ulong)d3, (ulong)d4 );


int
hello_callback(ras_block_t cb,
                                unsigned long long cmd,
                                void *arg, void *callback_data)
{
        int rc;


 switch (cmd) {
        /* Component Trace commands */
        case RASCT_MEMTRC_ON:
                rc = ras_control(cb, RASCT_SET_ALLOC_BUFFER, 0, 0);
                if (rc) break;
                /* fall through */
        case RASCT_MEMTRC_RESUME:
                rc = ras_control(cb, RASCT_SET_MEMTRC_RESUME, 0, 0);
                break;
        case RASCT_MEMTRC_OFF:
                rc = ras_control(cb, RASCT_SET_MEMTRC_SUSPEND, 0, 0);
                if (rc) break;
                rc = ras_control(cb, RASCT_SET_FREE_BUFFER, 0, 0);
                break;
        case RASCT_MEMTRC_SUSPEND:
                rc = ras_control(cb, RASCT_SET_MEMTRC_SUSPEND, 0, 0);
                break;


 case RASCT_MEMTRC_LVL:
                rc = ras_control(cb, RASCT_SET_MEMTRC_LVL, arg, 0);
                break;
        case RASCT_SYSTRC_ON:
                /* Apply cmd to support API, although we do not use systrace */
                rc = ras_control(cb, RASCT_SET_SYSTRC_ON, 0, 0);
                break;
        case RASCT_SYSTRC_OFF:
                /* Apply cmd to support API, although we do not use systrace */
                rc = ras_control(cb, RASCT_SET_SYSTRC_OFF, 0, 0);
                break;
        default:
                rc = -1;
        }

        return rc;
}
int hello_init(int cmd, struct uio *uio)
{

        kerrno_t krc=0;
        rascb = RAS_BLOCK_INVALID;
        char *name="mydriver";
        if (krc = ras_register(&rascb,name, NULL, RAS_TYPE_FILESYSTEM, 
        "All ethernet devices", RASF_TRACE_AWARE, hello_callback, NULL)) {
                return;
        }

         if (krc = ras_control(rascb, RASC_LOGICAL_ALIAS, 0, 0)) {
                goto ras_error;
        }
        if (krc = ras_control(rascb, RASCT_SET_SYSTRC_ON, 0, 0)) {
                goto ras_error;
        }
        if (krc = ras_control(rascb, RASCT_SET_MEMBUFSIZE,
                                                        (void *)2048, 0)) {
                goto ras_error;
        }


 if (krc = ras_control(rascb, RASCT_SET_ALLOC_BUFFER, 0, 0)) {
                goto ras_error;
        }
        if (krc = ras_control(rascb, RASCT_SET_MEMTRC_RESUME, 0, 0)) {
                goto ras_error;
        }
        krc = ras_customize(rascb);

     CTRC_HOOK(0,HKWD_SAMPLE,"ACLE","BCLE","CCLE","DCLE","ECLE");

     ras_error:

       return 0;
}

以上命令的样例输出:

从组件缓冲区中的输出:

mtrcsave -M rare -C all -d <dir>

Display:(it can be formatted by including HKWD_SAMPLE  entry in /etc/trcfmt)
# trcrpt mtrcrare
..
60C   409.451976437    9433.321187           D1=ACLE D2=BCLE D3=CCLE D4=DCLE D5=ECLE

可被追溯组件需要考虑的最佳实践

  • 组件可以使用两类序列化来访问其跟踪缓存区。第一类是灵巧的 RAS,可以通过控制缓冲区访问权限来维护来自多个缓冲操作的序列化,比如来自驱动程序与挂起/恢复操作的多个代码位置的日志记录。另一类序列化是让组件本身控制序列化。借助这种序列化,组件可以通过与 RAS 基础架构相同的方式来处理一些场景,比如与缓冲区大小调整并行的组件跟踪。在以上的示例中,应该从任意操作之一访问跟踪缓存区,而且也应将该缓冲区序列化。CT_TRCON 是用于识别特定组件的跟踪是否启用的宏。CT_TRCON 可以用作记录组件的跟踪数据的指示符。CT_TRCON 还可以指示跟踪缓冲区处于激活状态,而非挂起或恢复状态。组件进行序列化时,必须确保是锁定状态以便访问这个宏。
  • 等级与缓冲区大小

    组件可以根据用户等级与组件缓冲区大小来检查跟踪等级,而这可以使用 ctctrl 命令进行设置。因此,组件可以根据相应的要求进行灵活调整。

  • 注册/注销

    如果对可能停止的驱动程序、内核扩展程序或子系统启用组件跟踪,那么就应该注销该组件。如果一个组件有一些子组件,则不能从框架中注销。因此,必须首先注销子组件。

    此外,注销组件时不能出现任何组件跟踪操作。

    在我们的示例中,代码如下:

    ras_unregister(rasb_eth0);
    ras_unregister(rasb_eth);

    ras_unregister 调用必须在流程环境中完成。

  • __INFREQUENT 宏可以在跟踪之前运行,因此可将其作为一个少见的执行代码路径通知给编译器。

    if (CT_TRCON(rascb, CT_LVL_DETAIL) 
    {
    __INFREQUENT;  /* the above condition is rare */
    if (adapter->opened)
         {
               TRACE_CODE();
          }
    }
  • 组件必须在 CT_HOOK 中指定一个参数,根据需要分别表明所跟踪的数据是在系统跟踪 (MT_SYSTEM)、轻量级内存跟踪 (MT_COMMON, MT_RARE) 还是组件专用缓存区 (MT_PRIV) 中。

参考资料

学习

  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。

讨论

  • 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=931440
ArticleTitle=使用 IBM AIX RAS 基础架构跟踪服务的技术库
publish-date=05272013