一次CPU超高分析

近期上线发号器,发现该进程的cpu占用率很高,接近100% 。

top结果如下:


top

查询具体的线程cpu占用率。如下:

线程cpu占用率

可以看到 15505号线程基本占用了全部的cpu资源 。继续查看该线程的具体执行情况。如下:

线程栈

FileInputStream.java中关于readBytes的代码,如下:

FileInputStream.java

从代码中可知, 该方法调用的是 native readBytes 。本地方法如下:

\openjdk\jdk\src\share\native\java\io\FileInputStream.c

继续跟代码

\openjdk\jdk\src\share\native\java\io\io_util.c

通过代码可以看到 ,readBytes 是通过调用IO_Read来实现文件读取。

在io_util_md.h 可以找到 IO_Read的宏定义

\openjdk\jdk\src\solaris\native\java\io\io_util_md.h

在 jvm.h 找到JVM_Read的申明。

openjdk\jdk\src\share\javavm\export\jvm.h

在往下无法找到JVM_Read的实现 ,故只能猜测其调用了系统的read 或fread实现读取。为证明猜测选用windows的实现做旁证 。前面都一样 ,从 io_util_md.h 开始有变化

\openjdk\jdk\src\windows\native\java\io\io_util_md.h 发现 IO_Read的宏定义如下:

\openjdk\jdk\src\windows\native\java\io\io_util_md.h

\openjdk\jdk\src\windows\native\java\io\io_util_md.c 找到 handleRead的实现

\openjdk\jdk\src\windows\native\java\io\io_util_md.c

可以看到windows提供的ReadFile是最终读取数据的地方。

       相同的代码在本地windows上运行 ,cpu利用率一直极低,可见IO的阻塞效果很好 ;而在服务器上cpu利用高,则怀疑是因为Linux在操作系统read上与windows优化不一致。此外还需要继续分析不同版本linux系统才能得出这是单独某个版本的问题亦或是系列问题。

本次分析所用系统相关信息如下:

linux相关版本信息
windows相关版本信息
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,950评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,301评论 19 139
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光剑书架上的书阅读 9,372评论 2 8
  • 《我喜欢临窗的位置》 作者:风语 我喜欢坐在临窗的位置 不止于 白天偶有飞过的鸟斑斓的艳羽,抽出嫩叶,银杏飘...
    风语996阅读 1,131评论 0 0
  • S是我的一个朋友,每次和她有点小矛盾的时候,她总是会开玩笑的对我吼到:“滚滚滚,你赶紧的,麻溜的给我滚开。”有次故...
    點下阅读 4,463评论 0 2