日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php100并发cpu告警,多线程并发导致CPU100%的一种原因和解决办法

發(fā)布時間:2023/12/2 php 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php100并发cpu告警,多线程并发导致CPU100%的一种原因和解决办法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在用自定義線程池的時候,遇到cpu100%,經(jīng)過驗證后,發(fā)現(xiàn)問題來源于我定義的子線程。

子線程的主要功能是從任務(wù)隊列(LinkedBlockingQueue)里面持續(xù)拿出任務(wù),并且執(zhí)行。

以下為令CPU100的代碼。

private class WorkThread extends Thread

{

@Override

public void run()

{

while(flag)

{

Runnable task=null;

if(flag&&!taskQueue.isEmpty())//當隊列非空

{

try

{

task=taskQueue.poll();//拿到任務(wù),若沒有則拿到null

if(task!=null)

task.run();//執(zhí)行任務(wù)

} catch (Exception e)

{

e.printStackTrace();

}

}

}

}

}

之后,隨便往while循環(huán)里面添加進System.out.println(“xxxx”);

發(fā)現(xiàn)CPU降低了,不會升到100,于是我修改了代碼如下:

//增加一句Thread.sleep(),令所有線程每次進入while循環(huán)的時候,都先休眠釋放資源,這CPU就不會升到100

private class WorkThread extends Thread

{

@Override

public void run()

{

while(flag)

{

try {

Thread.sleep((long) 0.5);//先釋放資源,避免cpu占用過高

} catch (Exception e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

Runnable task=null;

if(flag&&!taskQueue.isEmpty())//當隊列非空

{

try

{

task=taskQueue.poll();//拿到任務(wù),若沒有則拿到null

if(task!=null)

task.run();//執(zhí)行任務(wù)

} catch (Exception e)

{

e.printStackTrace();

}

}

}

}

}

造成上述現(xiàn)象的原因:LinkedBlockingQueue是線程安全,當多線程同步從隊列里面取出任務(wù),在微觀時刻,有且只有一個線程能進入隊列中取,因此其他線程阻塞等待,此時各線程都持有cpu資源,不釋放,

就造成了大量cpu等待,因而CPU會升高;

值得注意的一點:

LinkedBlockingQueue中取出任務(wù)方法有幾種,比如take(),poll(),一開始我用take方法,發(fā)現(xiàn)運行后,線程資源無法得到釋放,后來看了api發(fā)現(xiàn)take()是阻塞拿,意思是:線程往隊列里面拿任務(wù),

如果隊列里面沒有任務(wù),則進行等待知道有任務(wù)再次喚醒。

而poll()方法則是有任務(wù)就拿,沒任務(wù)就返回null,因此不會出現(xiàn)阻塞等待,若上面代碼改成用take方法,同樣會出現(xiàn)cpu100的問題,也在于阻塞,同時也會出現(xiàn)線程不被GC回收。

總結(jié)

以上是生活随笔為你收集整理的php100并发cpu告警,多线程并发导致CPU100%的一种原因和解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。