按关键词阅读: 俞敏洪 罗永浩 锤子科技 李国庆
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 操作 。
【罗永浩|引人入胜,实战讲解“Java 性能调优六大工具”之 linux 命令行工具】在程序运行过程中 , 使用以下命令监控程序 I/O 的使用情况:
其中 , 22796 是通过 jps 命令查询到的进程 ID , -d 参数表明监控对象为磁盘 I/O , 1 和 3 分别表示每秒采样 1 次 , 合计采样 3 次 。
从输出结果中可以看到 , 进程中的 22813(0x591D)线程产生了大量的 I/O 操作 。 通过前文中提到的 jstatck 命令可以导出当前线程的堆栈 , 查找 nid 为 22813(0x591D)的线程 , 即可定位到 HoldIOTask 线程 。
注意:使用 pidstat 命令可以查看进程和线程的 I/O 信息 。
3.内存监控
使用 pidstat 命令还可以监控指定进程的内存使用情况 。 下面的代码使用 pidstat 工具对进程 ID 为 27233 的进程进行内存监控 , 每秒刷新 1 次 , 共进行 5 次统计 。
输出结果中各列含义如下:
·minflt/s:该进程每秒错误(不需要从磁盘中调出内存页)的总数 。
·majflt/s:该进程每秒错误(需要从磁盘中调出内存页)的总数 。
·VSZ:该进程使用的虚拟内存大小 , 单位为 KB 。
·RSS:该进程占用的物理内存大小 , 单位为 KB 。
·%MEM:占用内存比率 。
注意:pidstat 工具是一款多合一的优秀工具 , 它不仅可以监控 CPU、I/O 和内存资源 , 甚至可以将问题定位到相关线程 , 以方便进行应用程序故障排查 。
稿源:(未知)
【傻大方】网址:/c/112EL2b2021.html
标题:罗永浩|引人入胜,实战讲解“Java 性能调优六大工具”之 linux 命令行工具( 三 )