Solaris 性能与调整( 四 )



lockstat执行一个命令,报告在命令执行期间所有内核锁的活动情况,不论请求锁的是哪个进程或设备 。请看lockstat(1M)的手册页 。-s 10选项报告在每一个锁上进行竞争的内核线程栈 。

2.3.6. trapstat -运行时的陷阱统计
trapstat是一个在运行着普通Solaris内核的UltraSPARC?处理器上提供运行时陷阱(trap)统计信息的工具 。对于I-TLB和D-TLB未命中,trapstat能够可选地显示花在操作系统TLB未命中处理程序中的时间量 。对于中断向量陷阱,trapstat能够可选地显示中断设备 。

2.3.7. gprof -应用程序性能分析
对于C、C和FORTRAN应用,试试用-xpg选项编译,并且在会产生性能问题的典型负载下运行这个程序 。对生成的tmon.out文件执行gprof 。这可以显示出该应用程序大部分的时间花在哪里 。

Forte[tm] TeamWare (以前的Sun WorkShop[tm] TeamWare) 有很多有用的工具,比如用图形化的方式表示应用程序的时间都花在哪里的分析工具 。要想了解更进一步的信息,请看Forte TeamWare文档以及Rajat Garg与Ilya Sharapov的Sun[tm] BluePrints书籍,应用程序的优化技巧:高性能计算(Techniques for Optimizing Applications: High Performance Computing).

2.3.8. proc工具
proc是一个利用/proc的特性来报告比如这样一些进程属性的实用工具:

pstack -调用栈
ptree -进程关系树
pfiles -打开的文件描述符列表
pldd -正在运行中的进程使用的动态链接库的列表
更多信息请看proc(1)的手册页 。

3. 一些常见问题和一些建议
3.1. 64位的运算与容量能带来什么?
从性能的角度看,可以运行64位应用程序的能力有两大好处 。首先是更大规模的问题能够利用更大的进程地址空间获得有效解决 。其次是整数运算可以使用64位的寄存器和指令 。

整体来说,因为代码中的指针和数据结构都更大了所以程序也稍微变大一些 。反过来,这意味着CPU的缓存也很有可能没有足够的缓存行,那些在32位环境下就能够运行得很好的程序可能会稍微有一点慢 。

内核线程栈是16Kb而不是8Kb,不过产生的效果经常是可以忽略的 。

3.2. 空闲内存
检查一个Solaris系统以确定还有多少空闲内存一直以来都是个容易引起混淆的地方 。

对于Solaris 8操作环境之前的版本,要想察看是否内存不够,是不依赖于"free"列或者"sr"列的 。在"fr"列中的值并不能指示内存缺乏 。页面缓存一直保留住页面以备再次需要用到它们 。虚拟内存子系统只在需要的时候才收回内存 。

在SunWorld文章与SUN性能与调整——Java[tm]与Internet(Sun Performance and Tuning - Java[tm] and the Internet)中这个题目已经被写了很多了 。为了确定是否有内存不足的情况存在,同时检查第12列("sr",也就是扫描率)和交换分区的磁盘I/O流量(用iostat -P) 。如果大量的I/O活动由文件系统产生并且需要运行页面扫描程序为I/O释放页面,"sr"列会有比较大的数值 。

只有在空闲链表缩短到一个门限值 (lotsfree,以页面为单位)以下,pageout扫描程序才运行 。任何非活动的并且没有被锁在内存中的进程或文件页面都可能被换出 。freelist的大小看上去会缩短并保持在那个数值(lotsfree) 。当freelist的数量下降到lotsfree门限以下的时候,页面守护进程将启动,扫描需要从页面缓存以及已退出和空闲的进程中回收的内存 。没有办法能够让"空闲"值增长到这个门限以上很多,因为没有办法让页面扫描程序在这个门限之外回收内存 。让页面保留在页面缓存中比把它们不必要地放到空闲链表中更有效率 。

Solaris 8操作环境在segmap驱动程序内实现了一个更为有效的算法给I/O提供所需的页面 。vmstat中的"fr"列确实反映了空闲并且没有被页面缓存所使用的内存 。-p选项被加到vmstat中,用来给出更准确的页面调度行为细节 。

推荐阅读