云时代架构阅读笔记二——一次CPU负载超高的分析
?本文為轉載,博客原地址:http://www.jianshu.com/p/4a6fe6c82311
上線發號器,發現該進程的cpu占用率很高,接近100% 。
top結果如下:
?查詢具體的線程cpu占用率,如下:
可以看到 15505號線程基本占用了全部的cpu資源 。繼續查看該線程的具體執行情況。如下:
FileInputStream.java中關于readBytes的代碼,如下:
從代碼中可知, 該方法調用的是?native readBytes 。本地方法如下:
繼續跟代碼:
通過代碼可以看到 ,readBytes 是通過調用IO_Read來實現文件讀取。
在io_util_md.h 可以找到?IO_Read的宏定義:
在 jvm.h 找到JVM_Read的申明:
在往下無法找到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.c 找到 handleRead的實現:
可以看到windows提供的ReadFile是最終讀取數據的地方。
? ? ? ?相同的代碼在本地windows上運行 ,cpu利用率一直極低,可見IO的阻塞效果很好 ;而在服務器上cpu利用高,則懷疑是因為Linux在操作系統read上與windows優化不一致。此外還需要繼續分析不同版本linux系統才能得出這是單獨某個版本的問題亦或是系列問題。
本次分析所用系統相關信息如下:
linux相關版本信息
windows相關版本信息
回到應用層看發號器服務化版本實現,發號器簡單的輪訓等待控制臺實現,修改為每一分鐘輪訓一次控制臺,因為發號器的主線程僅僅用于啟動服務線程,并不做任何有用的事情,保持運行狀態即可,修改后的代碼如下:
? BufferedReader br = new BufferedReader(new InputStreamReader(System.in));while (!"exit".equals(br.readLine()))try {Thread.sleep(60000);} catch (InterruptedException e) {// If error, print it to console e.printStackTrace();};
?
轉載于:https://www.cnblogs.com/DaisyYuanyq/p/11014811.html
總結
以上是生活随笔為你收集整理的云时代架构阅读笔记二——一次CPU负载超高的分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 换肤多少钱啊?
- 下一篇: Vue $createElement