天猫|引人入胜,实战讲解“Java 性能调优六大工具”之 linux 命令行工具( 三 )



输出结果中 , 各列含义如表所示 。
vmstat 命令输出结果的含义

以下代码显示了一个线程切换频繁的 Java 程序 。


使用 vmstat 工具监控上述 Java 程序的执行情况:

通过加粗部分可以看到 , 系统有着很高的 cs 值(上下文切换)和 us 值(用户 CPU 使用时间) , 表明系统的上下文切换频繁 , 用户 CPU 占用率很高 。
注意:vmstat 工具可以查看内存、交互分区、I/O 操作、上下文
切换、时钟中断及 CPU 的使用情况 。
四 , iostat 命令
iostat 命令可以提供详尽的 I/O 信息 。 它的基本使用方式如下:

以上命令显示了 CPU 的使用概况和磁盘 I/O 的信息 。 对输出信息每秒采样 1 次 , 合计采样两次 。 如果只需要显示磁盘情况 , 不需要显示 CPU 使用情况 , 则可以使用以下命令:

-d 表示输出磁盘的使用情况 。 在输出结果中 , 各个列的含义如下:
·tps:该设备每秒的传输次数 。
·kB_read/s:每秒从设备读取的数据量 。
·kB_wrtn/s:每秒向设备写入的数据量 。
·kB_read:读取的总数据量 。
·kB_wrtn:写入的总数据量 。
如果需要得到更多的统计信息 , 可以使用-x 选项 。 例如:

注意:磁盘 I/O 很容易成为系统性能的瓶颈 。 通过 iostat 命令可以
快速定位系统是否产生了大量的 I/O 操作 。
pidstat 工具
pidstat 是一个功能强大的性能监测工具 , 它也是 Sysstat 的组件之一 。 读者可以

http://www.icewalkers.com/Linux/Software/59040/Sysstat.html上下载这个工具 。 下载后 , 通过./configure、make 和 makeinstall 三个命令即可安装 pidstat 工具 。 pidstat 的强大之处在于 , 它不仅可以监视进程的性能情况 , 也可以监视线程的性能情况 。 本小节将详细介绍 pidstat 的功能 。
1.CPU 使用率监控
下面是一个简单的占用 CPU 的程序 , 它开启了 4 个用户线程 , 其中 1 个线程大量占用 CPU 资源 , 其他 3 个线程则处于空闲状态 。

运行以上程序 , 要监控该程序的 CPU 使用率 , 可以先使用 jps 命令找到 Java 程序的 PID , 然后使用 pidstat 命令输出程序的 CPU 使用情况 。 执行命令如下:

其中 , pidstat 的参数-p 用于指定进程 ID , -u 表示对 CPU 使用率的监控 , 最后的参数 1 和 3 分别表示每秒采样 1 次与合计采样 3 次 。 从输出结果中可以看到 , 该应用程序的 CPU 占用率几乎达到 100% 。 pidstat 的功能不仅限于观察进程信息 , 它还可以进一步监控线程的信息 , 执行命令如下:

该命令的部分输出结果如下:

-t 参数将系统性能的监控细化到线程级别 。 从输出结果中可以看到 , 该 Java 应用程序之所以占用如此高的 CPU , 是因为线程 1204 的缘故 。
注意:使用 pidstat 工具不仅可以定位到进程 , 甚至可以进一步定位到线程 。
使用以下命令可以导出指定 Java 应用程序的所有线程 。

在输出的 t.txt 文件中可以找到这样一段输出内容:

从加粗的文字可以看到 , 这个线程正是 HoldCPUTask 类 , 它的 nid(nativeID)为 0x4b4 , 转为十进制后正好是 1204 。
通过这个方法 , 开发人员可以使用 pidstat 很容易地捕获在 Java 应用程序中大量占用 CPU 的线程 。
2.I/O 使用监控
磁盘 I/O 也是常见的性能瓶颈之一 。 使用 pidstat 也可以监控进程内线程的 I/O 情况 。 下面的代码开启了 4 个线程 , 其中 , 线程 HoldIOTask 产生了大量的 I/O 操作 。

在程序运行过程中 , 使用以下命令监控程序 I/O 的使用情况:

其中 , 22796 是通过 jps 命令查询到的进程 ID , -d 参数表明监控对象为磁盘 I/O , 1 和 3 分别表示每秒采样 1 次 , 合计采样 3 次 。