性能和可观察性

本节介绍本发行版中新增的平台和性能增强功能。这些功能帮助优化基于 SPARC 和 x86 的系统的 Oracle Solaris,从而提高性能并为系统提供更好的诊断。

DTrace SCSI 提供者

Oracle Solaris 11.4 发行版引入了一个新的 DTrace SCSI 提供者,该提供者旨在跟踪由 Oracle Solaris 系统发布的 SCSI 命令和任务管理功能。SCSI 提供者具有以下优势:

允许您在不知道内部结构的情况下在 Oracle Solaris 系统上跟踪 SCSI 命令。

包括尽可能遵循 SCSI T10 标准的探测器和结构

提供 DTrace I/O 提供者的配对部分,以跟踪其他层的 I/O 流量

提供使用新探测器的 scsitrace 脚本

下面的示例说明了一个用来标识 SCSI 目标重置的单行跟踪:

# dtrace -n 'scsi:::tmf-request
/(args[1] == SCSI_TMF_TARGET_RESET) &&
(args[0]->addr_path != "NULL")/ {
printf("Target Reset sent to %s", args[0]->addr_path);}'

DTrace fileops 提供者

fileops 提供者公开一整套标准 UNIX 文件操作探测器,这些探测器更适用于 Oracle Solaris 管理员,而不是开发者。例如,提供者可以显示所有文件系统(包括伪文件系统)的 read 或 write 延迟信息。

fileops 探测器与文件操作 open、close、read、write 等有关。这些探测器既不特定于任何文件系统类型,又不依赖对外部存储设备的 I/O。例如,fileops:::read 探测器触发从文件的任何读取操作,而与数据来自磁盘还是缓存在内存中无关。

可以使用 read 探测器观察不同文件系统类型上的读取延迟时间。例如:

fileops:::read
{
@[args[0]->fi_fs] =
quantize(args[1]);
}

所得到的输出提供一个图形,其中包括系统上所有类型的文件系统的读取次数和延迟时间。

TCP、UDP 和 IP 的 DTrace MIB 提供者

Oracle Solaris 11.4 发行版扩展了现有的 DTrace MIB 提供者,可以使用协议信息观察网络堆栈中的事件,以便可以识别 TCP、UDP 和 IP 连接。

DTrace pcap() 操作

向 DTrace 添加了一个新操作 pcap()。pcap() 操作将执行以下操作之一:

数据包数据的显示方式与 tracemem() 基本相同,但合并到连续缓冲区中。

如果 freopen() 已指定了一个捕获文件,pcap() 操作会通过 libpcap 函数 pcap_dump() 将数据包数据捕获到数据包捕获文件中。DTrace 对于数据包数据执行以下操作:

在探测器上下文中收集数据包数据。

将数据包数据合并到连续缓冲区中(如果数据尚未在连续缓冲区中)。

通过 pcap_dump() 函数(在收集数据时调用)将数据转储到指定的文件。

如 tracemem() 一样,下面的 pcap() 操作将内存转储到 stdout:

pcap(mblk, protocol);

下面的调用将数据包数据转储到其后缀指定当前 pid 的捕获文件:

freopen("/tmp/cap.%d", pid);

pcap(mblk, protocol);

例如,这允许您按进程或服务整理数据包跟踪。由于 freopen() 归为破坏性操作,因此上述脚本必须指定 –w(“破坏性”)dtrace 选项。pcap() 操作没有破坏性。

DTrace print() 操作

DTrace 具有一个新的 print() 操作,该操作显示任意类型,如下面的示例中所示:

# dtrace -q -n 'fop_close:entry {print(*args[0]);exit(0)}'
vnode_t {
v_lock = {
_opaque = [ NULL ]
}
v_flag = 0x0
v_count = 0x1
v_data = 0xffffc10054425378
v_vfsp = specfs`spec_vfs
v_stream = 0xffffc100623354e8
v_type = VCHR
v_rdev = 0xee00000026
v_vfsmountedhere = NULL
v_op = 0xffffc10029d98040
v_pages = NULL
v_filocks = NULL
v_shrlocks = NULL
v_nbllock = {
_opaque = [ NULL ]
}
v_cv = {
_opaque = 0x0
}
v_pad = 0xbadd
v_count_dnlc = 0x0
v_locality = NULL
v_femhead = NULL
v_path = "/devices/pseudo/udp@0:udp"
v_rdcnt = 0x0
v_wrcnt = 0x0
v_mmap_read = 0x0
v_mmap_write = 0x0
v_mpssdata = NULL
v_fopdata = NULL
v_vsd_lock = {
_opaque = [ NULL ]
}
v_vsd = NULL
v_xattrdir = NULL
v_fw = 0xbaddcafebaddcafe
}
#

Kstat v2 框架

与先前的 kstat 框架相比,内核统计 (kstat) v2 框架提供更好的性能和大量优化。下面是所包含的一些新的绝佳组件:

内核 API,提供用来创建和处理 v2 kstat 的功能。Kstat 使用一个唯一的 URI 进行标识,其中既包括 kstat 的元数据又包括 kstat 所含的名称-值对的元数据。此 API 允许 kstat 描述它所报告的值。

libkstat2 库,提供对在内核中创建的 v2 kstat 的访问。Kstat 通过其唯一的 URI 来查找,可表示为 HashMap。开发者可以订阅特定 kstat URI 级别的事件,当在 URI 树中这些事件的下方添加或删除任何 kstat 时,开发者将收到通知。

/usr/bin/kstat2 实用程序,提供 CLI 对 kstat 的访问权限。这个新的实用程序检查系统中的可用 kstat,并报告与命令行上指定的条件匹配的统计信息。输出每条匹配的统计信息时,将会同时输出其 URI 和实际值。支持许多不同的输出格式(包括人工可读的、可解析的 JavaScript 对象表示法 (JavaScript Object Notation, JSON) 格式)。

FMA 核心文件诊断

Oracle Solaris 11.4 包括核心文件诊断功能,该功能概述用户级核心文件中的基本遥测、引发 FMA 警报以通知用户并提供诊断核心保持策略和 SMF 案例关联。

诊断核心文件仅包含必要的内容,这会使得内容所占空间很小。在生成文本摘要文件之后将删除核心文件,从而减少所占用的磁盘空间。使用其他新功能(如堆栈诊断),FMA 将能够在 Oracle 数据库中的摘要文件中搜索堆栈,看是否存在已知问题。保持策略允许用户通过 coreadm 命令设置诊断核心策略。coreadm 命令还提供立即删除核心或者将一定量的核心保持一段时间等功能。案例关联功能针对的是 sw-diag-response 诊断引擎。所有导致软件服务失败的核心诊断警报都可以与每个事件的堆栈和环境数据集一起查看。

用户现在可以对诊断核心进行更多的控制。当软件服务无法正常运行并停止服务时,管理员可以轻松快捷地查看所有导致服务失败的事件,而且可以更好地了解哪些进程失败以及每个进程在代码执行期间在什么位置失败。

有关更多信息,请参见 coreadm(8) 手册页。

pfiles 增强功能

在 Oracle Solaris 11.4 中,pfiles 命令接受一个核心文件作为其参数,而且可以显示有关用来转储核心的进程所打开文件描述符的信息。此功能在调试进程核心转储方面为确定转储的根本原因提供额外的帮助。

与先前的 Oracle Solaris 发行版不同的是,在 Oracle Solaris 11.4 中,在检索该进程中已打开文件的数据时,pfiles 命令不再停止正在运行的目标进程。

有关更多信息,请参见 proc(1) 手册页。

通过 fsstat 监视 I/O 延迟

fsstat 命令有一个新的 –l 选项,该选项报告 read、write 和 readdir 操作的延迟信息。延迟信息独立于物理 I/O 操作,因此代表应用程序所看到的文件系统性能。此功能允许用户观察文件系统类型和各个文件系统的文件系统延迟。此功能对于诊断文件系统性能问题非常有用。

有关更多信息,请参见 fsstat(8) 手册页。

SCSI I/O 响应时间分布统计信息

Oracle Solaris 11.4 现在提供 SCSI I/O 响应时间或 I/O 延迟分布信息,以提高可观察性。I/O 响应时间分布可用于标识响应时间异常值。分布情况存储在具有以下三个不同 x 标度选项的直方图:linear、log2-based 和 log10-based。分布情况可以使用 iostat 命令来显示。–L 选项是与 –x 和 –Y 选项一起添加的,目的在于显示直方图。此分布信息可用来调查性能问题。

有关更多信息,请参见 sd(4D) 和 iostat(8) 手册页。