<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    經驗不在于年限,在于積累---專注互聯網軟件開發

    把工作當事業做,把項目當作品做!

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      55 Posts :: 0 Stories :: 66 Comments :: 0 Trackbacks

    一個應用占用CPU很高,除了確實是計算密集型應用之外,通常原因都是出現了死循環。

    (友情提示:本博文章歡迎轉載,但請注明出處:hankchen,http://www.tkk7.com/hankchen

    以我們最近出現的一個實際故障為例,介紹怎么定位和解決這類問題。

    clip_image002

    根據top命令,發現PID為28555的Java進程占用CPU高達200%,出現故障。

    通過ps aux | grep PID命令,可以進一步確定是tomcat進程出現了問題。但是,怎么定位到具體線程或者代碼呢?

    首先顯示線程列表:

    ps -mp pid -o THREAD,tid,time

    1

    找到了耗時最高的線程28802,占用CPU時間快兩個小時了!

    其次將需要的線程ID轉換為16進制格式:

    printf "%x\n" tid

    2

    最后打印線程的堆棧信息:

    jstack pid |grep tid -A 30

    3

    找到出現問題的代碼了!

    現在來分析下具體的代碼:ShortSocketIO.readBytes(ShortSocketIO.java:106)

    ShortSocketIO是應用封裝的一個用短連接Socket通信的工具類。readBytes函數的代碼如下:

    public byte[] readBytes(int length) throws IOException {

        if ((this.socket == null) || (!this.socket.isConnected())) {

            throw new IOException("++++ attempting to read from closed socket");

        }

        byte[] result = null;

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        if (this.recIndex >= length) {

               bos.write(this.recBuf, 0, length);

               byte[] newBuf = new byte[this.recBufSize];

               if (this.recIndex > length) {

                   System.arraycopy(this.recBuf, length, newBuf, 0, this.recIndex - length);

               }

               this.recBuf = newBuf;

               this.recIndex -= length;

        } else {

               int totalread = length;

               if (this.recIndex > 0) {

                    totalread -= this.recIndex;

                    bos.write(this.recBuf, 0, this.recIndex);

                    this.recBuf = new byte[this.recBufSize];

                    this.recIndex = 0;

        }

        int readCount = 0;

        while (totalread > 0) {

             if ((readCount = this.in.read(this.recBuf)) > 0) {

                    if (totalread > readCount) {

                          bos.write(this.recBuf, 0, readCount);

                          this.recBuf = new byte[this.recBufSize];

                          this.recIndex = 0;

                   } else {

                         bos.write(this.recBuf, 0, totalread);

                         byte[] newBuf = new byte[this.recBufSize];

                         System.arraycopy(this.recBuf, totalread, newBuf, 0, readCount - totalread);

                         this.recBuf = newBuf;

                         this.recIndex = (readCount - totalread);

                 }

                 totalread -= readCount;

            }

       }

    }

    問題就出在標紅的代碼部分。如果this.in.read()返回的數據小于等于0時,循環就一直進行下去了。而這種情況在網絡擁塞的時候是可能發生的。

    至于具體怎么修改就看業務邏輯應該怎么對待這種特殊情況了。

     

    最后,總結下排查CPU故障的方法和技巧有哪些:

    1、top命令:Linux命令??梢圆榭磳崟r的CPU使用情況。也可以查看最近一段時間的CPU使用情況。

    2、PS命令:Linux命令。強大的進程狀態監控命令。可以查看進程以及進程中線程的當前CPU使用情況。屬于當前狀態的采樣數據。

    3、jstack:Java提供的命令。可以查看某個進程的當前線程棧運行情況。根據這個命令的輸出可以定位某個進程的所有線程的當前運行狀態、運行代碼,以及是否死鎖等等。

    4、pstack:Linux命令??梢圆榭茨硞€進程的當前線程棧運行情況。

    (友情提示:本博文章歡迎轉載,但請注明出處:hankchen,http://www.tkk7.com/hankchen

    posted on 2012-05-09 20:20 hankchen 閱讀(41727) 評論(7)  編輯  收藏 所屬分類: 工作感悟

    Feedback

    # 非常感謝![未登錄] 2012-08-09 10:05 lk
    最近我們的應用極不正常,CPU都占到700%了,用你的方法查了一下,終于找到了原因!非常感謝!  回復  更多評論
      

    # re: 線上應用故障排查之一:高CPU占用 2013-03-01 17:11 netcat
    您好,請教個問題:如何查看tomcat連接池的排隊請求數。我email:297020555@qq.com,多謝。  回復  更多評論
      

    # re: 線上應用故障排查之一:高CPU占用 2013-03-13 14:38 boys99@163.com
    非常謝謝你,用你的方法幫我快速定位到問題所在點。謝謝!  回復  更多評論
      

    # re: 線上應用故障排查之一:高CPU占用 2014-08-18 17:27 少林功夫好
    如果不是java進程呢?如果是php-fpm,是nginx怎么辦呢?新人,求一些指導。  回復  更多評論
      

    # re: 線上應用故障排查之一:高CPU占用 2015-06-25 12:49 Jerry Lee
    腳本show-busy-java-threads.sh https://github.com/oldratlee/useful-scripts/blob/master/docs/java.md#beer-show-busy-java-threadssh 可以一鍵找出出在運行的Java進程中,消耗CPU最多的線程棧。用于快速排查Java的性能問題。 可以試試 :)
      回復  更多評論
      

    # re: 線上應用故障排查之一:高CPU占用 2015-08-06 16:41 王亮
    很感謝您的這篇文章,謝謝  回復  更多評論
      

    # re: 線上應用故障排查之一:高CPU占用[未登錄] 2016-03-09 18:09 QQ
    嗯 太贊了  回復  更多評論
      

    主站蜘蛛池模板: 四虎影永久在线高清免费| 亚洲天天在线日亚洲洲精| 久久WWW免费人成—看片| 亚洲VA中文字幕不卡无码| 国产曰批免费视频播放免费s| 国产精品亚洲AV三区| 亚洲情综合五月天| 欧美男同gv免费网站观看| 成人a毛片视频免费看| 亚洲精品美女久久久久| 日本一道一区二区免费看 | 久久国产精品成人免费| 国产成人精品日本亚洲专| 国产成人亚洲精品91专区手机| 四虎影视在线影院在线观看免费视频| 亚洲色大18成人网站WWW在线播放| 久久久久国产成人精品亚洲午夜 | 免费看国产成年无码AV片| 国产精品午夜免费观看网站| 亚洲偷偷自拍高清| 亚洲成色WWW久久网站| 国产又粗又长又硬免费视频| 91精品免费观看| v片免费在线观看| 亚洲天然素人无码专区| 亚洲国产精品一区| 亚洲国产人成中文幕一级二级| 我们的2018在线观看免费高清| 中文字幕免费在线看| 国产精品无码亚洲精品2021| 亚洲色图古典武侠| 亚洲尤码不卡AV麻豆| 日韩高清在线免费观看| 美女网站免费福利视频| 久久青草免费91线频观看不卡| 免费人成再在线观看网站| 亚洲黄页网在线观看| 亚洲精品电影天堂网| 亚洲精品国产成人99久久| 色久悠悠婷婷综合在线亚洲 | 亚洲电影在线播放|