使用 emstat 工具检测指令仿真
为了保持与旧版二进制文件的兼容性,AIX内核包含了仿真例程,为特定芯片架构中可能不包含的指令提供支持。 试图执行不受支持的指令会导致非法指令异常。 内核对该非法指令进行解码,如果是一条不受支持的指令,内核运行一个仿真例程模拟该指令的功能。
根据不受支持的指令的执行频率及其仿真路径的长度,因为内核上下文切换和指令仿真的开销,仿真会造成不同程度的性能下降。 甚至一个很小比例的仿真也会造成性能上的很大差别。 下表显示了对几个不受支持的指令路径长度的估计。
| 指令 | 仿真语言 | 估计的路径长度(指令) |
|---|---|---|
| abs | 汇编程序 (assembler) | 117 |
| doz | 汇编程序 (assembler) | 120 |
| mul | 汇编程序 (assembler) | 127 |
| rlmi | C | 425 |
| sle | C | 447 |
| clf | C | 542 |
| div | C | 1079 |
在用汇编语言写的代码中,必须除去那些不在所有平台上通用的指令,因为重新编译只对高层源代码有效。 汇编程序中的例程必须改变,使得它们不使用缺少的指令,因为这种情况下重新编译不起作用。
第一步是用 emstat 工具确定有没有指令仿真。
要确定是否安装了 emstat 程序且可以使用,运行下列命令:
# lslpp -lI bos.perf.toolsemstat 命令的操作与 vmstat 命令相似,您可以在此命令中指定一个以秒为单位的间隔时间和间隔的次数(可选)。 第一列中的值是从系统引导以来的累积计数,第二列中的值是在该时间间隔内仿真指令的个数。 仿真达到每秒钟大约好几千次时会对性能产生影响。
下面是发出 emstat 1 命令后的输出示例:
# emstat 1
Emulation Emulation
SinceBoot Delta
0 0
0 0
0 0一旦检测到仿真,下一步是确定哪个应用程序在仿真指令。 这确定起来比较困难。 一个办法是每次只运行一个应用程序,并用 emstat 程序监视。 有时某些仿真导致遭遇跟踪挂钩。 可以在 ASCII 跟踪报告文件中使用文字查看此内容PROGRAM CHECK。与此跟踪事件关联的进程/线程正在仿真指令,原因是它自己的代码仿真指令,或者它正在执行库或正在仿真指令的其他模块中的代码。