国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux 系統(tǒng) CPU 100% 打滿了!

這篇具有很好參考價值的文章主要介紹了Linux 系統(tǒng) CPU 100% 打滿了!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、事件

昨天下午突然收到運維郵件報警,顯示數(shù)據(jù)平臺服務(wù)器cpu利用率達到了98.94%,而且最近一段時間一直持續(xù)在70%以上,看起來像是硬件資源到瓶頸需要擴容了,但仔細思考就會發(fā)現(xiàn)咱們的業(yè)務(wù)系統(tǒng)并不是一個高并發(fā)或者CPU密集型的應(yīng)用,這個利用率有點太夸張,硬件瓶頸應(yīng)該不會這么快就到了,一定是哪里的業(yè)務(wù)代碼邏輯有問題。

2、排查思路

2.1?定位高負載進程?pid

首先登錄到服務(wù)器使用top命令確認服務(wù)器的具體情況,根據(jù)具體情況再進行分析判斷。

Linux 系統(tǒng) CPU 100% 打滿了!

通過觀察load average,以及負載評判標準(8核),可以確認服務(wù)器存在負載較高的情況;

Linux 系統(tǒng) CPU 100% 打滿了!

觀察各個進程資源使用情況,可以看出進程id為682的進程,有著較高的CPU占比

2.2?定位具體的異常業(yè)務(wù)

這里咱們可以使用 pwdx 命令根據(jù) pid 找到業(yè)務(wù)進程路徑,進而定位到負責(zé)人和項目:

Linux 系統(tǒng) CPU 100% 打滿了!

可得出結(jié)論:該進程對應(yīng)的就是數(shù)據(jù)平臺的web服務(wù)。

2.3?定位異常線程及具體代碼行

傳統(tǒng)的方案一般是4步:

1、top oder by with P:1040 // 首先按進程負載排序找到? maxLoad(pid)

2、top -Hp 進程PID:1073 ? ?// 找到相關(guān)負載 線程PID

3、printf “0x%x ”線程PID:?0x431 ?// 將線程PID轉(zhuǎn)換為 16進制,為后面查找 jstack 日志做準備

4、jstack ?進程PID | vim +/十六進制線程PID - ? ? ? ?// 例如:jstack 1040|vim +/0x431 -

但是對于線上問題定位來說,分秒必爭,上面的 4 步還是太繁瑣耗時了,之前介紹過淘寶的oldratlee 同學(xué)就將上面的流程封裝為了一個工具:show-busy-java-threads.sh,可以很方便的定位線上的這類問題:

Linux 系統(tǒng) CPU 100% 打滿了!

可得出結(jié)論:是系統(tǒng)中一個時間工具類方法的執(zhí)行cpu占比較高,定位到具體方法后,查看代碼邏輯是否存在性能問題。

※?如果線上問題比較緊急,可以省略 2.1、2.2 直接執(zhí)行 2.3,這里從多角度剖析只是為了給大家呈現(xiàn)一個完整的分析思路。

3、根因分析

經(jīng)過前面的分析與排查,最終定位到一個時間工具類的問題,造成了服務(wù)器負載以及cpu使用率的過高。

  • 異常方法邏輯:是把時間戳轉(zhuǎn)成對應(yīng)的具體的日期時間格式;

  • 上層調(diào)用:計算當(dāng)天凌晨至當(dāng)前時間所有秒數(shù),轉(zhuǎn)化成對應(yīng)的格式放入到set中返回結(jié)果;

  • 邏輯層:對應(yīng)的是數(shù)據(jù)平臺實時報表的查詢邏輯,實時報表會按照固定的時間間隔來,并且在一次查詢中有多次(n次)方法調(diào)用。

那么可以得到結(jié)論,如果現(xiàn)在時間是當(dāng)天上午10點,一次查詢的計算次數(shù)就是 10*60*60*n次=36,000*n次計算,而且隨著時間增長,越接近午夜單次查詢次數(shù)會線性增加。由于實時查詢、實時報警等模塊大量的查詢請求都需要多次調(diào)用該方法,導(dǎo)致了大量CPU資源的占用與浪費。

4、解決方案

定位到問題之后,首先考慮是要減少計算次數(shù),優(yōu)化異常方法。排查后發(fā)現(xiàn),在邏輯層使用時,并沒有使用該方法返回的set集合中的內(nèi)容,而是簡單的用set的size數(shù)值。確認邏輯后,通過新方法簡化計算(當(dāng)前秒數(shù)-當(dāng)天凌晨的秒數(shù)),替換調(diào)用的方法,解決計算過多的問題。上線后觀察服務(wù)器負載和cpu使用率,對比異常時間段下降了30倍,恢復(fù)至正常狀態(tài),至此該問題得已解決。

Linux 系統(tǒng) CPU 100% 打滿了!

5、總結(jié)

  • 在編碼的過程中,除了要實現(xiàn)業(yè)務(wù)的邏輯,也要注重代碼性能的優(yōu)化。一個業(yè)務(wù)需求,能實現(xiàn),和能實現(xiàn)的更高效、更優(yōu)雅其實是兩種截然不同的工程師能力和境界的體現(xiàn),而后者也是工程師的核心競爭力。

  • 在代碼編寫完成之后,多做 review,多思考是不是可以用更好的方式來實現(xiàn)。

  • 線上問題不放過任何一個小細節(jié)!細節(jié)是魔鬼,技術(shù)的同學(xué)需要有刨根問題的求知欲和追求卓越的精神,只有這樣,才能不斷的成長和提升。

附上show-busy-java-threads.sh腳本:文章來源地址http://www.zghlxwxcb.cn/news/detail-472598.html

#!/bin/bash# @Function# Find out the highest cpu consumed threads of java, and print the stack of these threads.## @Usage#   $ ./show-busy-java-threads.sh## @author Jerry Lee
readonly PROG=`basename $0`readonly -a COMMAND_LINE=("$0" "$@")
usage() {    cat <<EOFUsage: ${PROG} [OPTION]...Find out the highest cpu consumed threads of java, and print the stack of these threads.Example: ${PROG} -c 10
Options:    -p, --pid       find out the highest cpu consumed threads from the specifed java process,                    default from all java process.    -c, --count     set the thread count to show, default is 5    -h, --help      display this help and exitEOF    exit $1}
readonly ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "$@"`[ $? -ne 0 ] && usage 1eval set -- "${ARGS}"
while true; do    case "$1" in    -c|--count)        count="$2"        shift 2        ;;    -p|--pid)        pid="$2"        shift 2        ;;    -h|--help)        usage        ;;    --)        shift        break        ;;    esacdonecount=${count:-5}
redEcho() {    [ -c /dev/stdout ] && {        # if stdout is console, turn on color output.        echo -ne "\033[1;31m"        echo -n "$@"        echo -e "\033[0m"    } || echo "$@"}
yellowEcho() {    [ -c /dev/stdout ] && {        # if stdout is console, turn on color output.        echo -ne "\033[1;33m"        echo -n "$@"        echo -e "\033[0m"    } || echo "$@"}
blueEcho() {    [ -c /dev/stdout ] && {        # if stdout is console, turn on color output.        echo -ne "\033[1;36m"        echo -n "$@"        echo -e "\033[0m"    } || echo "$@"}
# Check the existence of jstack command!if ! which jstack &> /dev/null; then    [ -z "$JAVA_HOME" ] && {        redEcho "Error: jstack not found on PATH!"        exit 1    }    ! [ -f "$JAVA_HOME/bin/jstack" ] && {        redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!"        exit 1    }    ! [ -x "$JAVA_HOME/bin/jstack" ] && {        redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!"        exit 1    }    export PATH="$JAVA_HOME/bin:$PATH"fi
readonly uuid=`date +%s`_${RANDOM}_$$
cleanupWhenExit() {    rm /tmp/${uuid}_* &> /dev/null}trap "cleanupWhenExit" EXIT
printStackOfThreads() {    local line    local count=1    while IFS=" " read -a line ; do        local pid=${line[0]}        local threadId=${line[1]}        local threadId0x="0x`printf %x ${threadId}`"        local user=${line[2]}        local pcpu=${line[4]}
        local jstackFile=/tmp/${uuid}_${pid}
        [ ! -f "${jstackFile}" ] && {            {                if [ "${user}" == "${USER}" ]; then                    jstack ${pid} > ${jstackFile}                else                    if [ $UID == 0 ]; then                        sudo -u ${user} jstack ${pid} > ${jstackFile}                    else                        redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/${threadId0x}) stack of java process(${pid}) under user(${user})."                        redEcho "User of java process($user) is not current user($USER), need sudo to run again:"                        yellowEcho "    sudo ${COMMAND_LINE[@]}"                        echo                        continue                    fi                fi            } || {                redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/${threadId0x}) stack of java process(${pid}) under user(${user})."                echo                rm ${jstackFile}                continue            }        }        blueEcho "[$((count++))] Busy(${pcpu}%) thread(${threadId}/${threadId0x}) stack of java process(${pid}) under user(${user}):"        sed "/nid=${threadId0x} /,/^$/p" -n ${jstackFile}    done}

ps -Leo pid,lwp,user,comm,pcpu --no-headers | {    [ -z "${pid}" ] &&    awk '$4=="java"{print $0}' ||    awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'} | sort -k5 -r -n | head --lines "${count}" | printStackOfThreads

到了這里,關(guān)于Linux 系統(tǒng) CPU 100% 打滿了!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Linux】Linux突然發(fā)現(xiàn)CPU占用100%該怎么辦?如何排查進程(帶你一文解決)

    目錄 Linux的CPU發(fā)現(xiàn)占用率100%,一般會由什么情況引起? 1、進程負載過高: 2、錯誤配置的服務(wù)或應(yīng)用程序: 3、惡意軟件或病毒: 4、不良硬件或驅(qū)動程序: 5、系統(tǒng)內(nèi)核問題: 6、CPU過熱: 對于排查CPU占用率過高的原因,可以采取以下步驟和工具: 一、top/htop方法 1、使用

    2024年02月08日
    瀏覽(22)
  • Java 開發(fā),當(dāng)cpu占用率100%,window和Linux分別如何定位問題

    Java 開發(fā),當(dāng)cpu占用率100%,window和Linux分別如何定位問題

    導(dǎo)言 Java服務(wù),有時候會遇到CPU 100%的問題,對于這樣的問題,我們?nèi)绾慰焖俣ㄎ徊⒔鉀Q呢?一般會有如下三個步驟: 找到最耗CPU的進程 找到這個進程中最耗CPU的線程 使用jdk自帶工具jstack 查看堆棧信息,定位線程的什么操作消耗了大量CPU,定位對應(yīng)代碼 Java程序CPU占用過高

    2024年02月04日
    瀏覽(17)
  • /dev/mapper/centos-root 100% 目錄空間占滿了 解決方法

    /dev/mapper/centos-root 100% 目錄空間占滿了 解決方法

    今天突然遇到公司一個平臺 驗證碼無法加載 查看redis nginx nacos上開的服務(wù)也都正常? 后來重啟驗證碼相關(guān)服務(wù) 開一會又掛了。經(jīng)查日志發(fā)現(xiàn)是系統(tǒng)盤沾滿了? [root@redis-zuul-eureka-mysql ~]# df -h? //查看到/dev/mapper/centos-root 100% 滿載了 解決方法: [root@redis-zuul-eureka-mysql ~]# cd /root?

    2024年02月09日
    瀏覽(21)
  • Linux系統(tǒng)盤滿了,如何解決。

    查看Linux系統(tǒng)中磁盤的情況,使用下面的命令: 可以查看到根目錄下磁盤使用率100%。 解決方法: 優(yōu)先刪除根目錄下的日志文件及安裝包。 刪除了根目錄下的日志文件,但是磁盤使用率仍然顯示為滿,可能是因為某些進程仍然在使用該文件。在Linux系統(tǒng)中,當(dāng)一個進程打開一

    2024年02月15日
    瀏覽(30)
  • ubuntu20.04磁盤滿了 /dev/mapper/ubuntu--vg-ubuntu--lv 占用 100%

    ubuntu20.04磁盤滿了 /dev/mapper/ubuntu--vg-ubuntu--lv 占用 100%

    執(zhí)行 mysql 大文件導(dǎo)入任務(wù),最后快完成了,查看結(jié)果發(fā)現(xiàn)錯了!悲催!都執(zhí)行了 兩天了 The table ‘XXXXXX’ is full ? 磁盤滿了? 剛好之前另一個 centos 服務(wù)器上也出現(xiàn)過磁盤滿了,因此,雖然悲催,但是并不慌張! Centos 7 出現(xiàn) write error (disk full?) 查看磁盤狀況 ubuntu 和 centos 磁

    2024年02月13日
    瀏覽(24)
  • wpf 系統(tǒng)在顯示器分辨率和縮放設(shè)置為非1920*1080和100%時,SelectionChanged事件響應(yīng)問題分析?

    系統(tǒng)在顯示器分辨率和縮放設(shè)置為1920*1080和100%時,窗口四分格能正常響應(yīng)SelectionChanged事件,但是當(dāng)縮放為125%時,或是分辨率大于1920*1080時四分格其中一個格子的下側(cè)和右側(cè)點擊不響應(yīng),什么原因? ? 描述的問題可能由以下幾個原因?qū)е拢?布局問題 : 在高分辨率或較高縮放

    2024年02月03日
    瀏覽(51)
  • 【面試】線上 CPU 100% 問題排查

    【面試】線上 CPU 100% 問題排查

    回答套路一般為:線上服務(wù)器沒有排查過,線上服務(wù)器只有運維才有操作權(quán)限。在平時開發(fā)的時候,在測試服務(wù)器上排查過。 2.1、將代碼打包成 jar 包 參考: 點我 2.2、傳到服務(wù)并運行 運行好的效果如下 3.1、拿到進程 id 通過 top 命令,就可以看到讓 cpu 100% 的進程 id,pid 就是

    2024年02月11日
    瀏覽(28)
  • 虛擬機CPU占用100%問題記錄

    虛擬機CPU占用100%問題記錄

    kswapd0占用CPU過高,嚴重影響服務(wù)器及虛擬機的使用。 kswapd0 是 Linux 系統(tǒng)虛擬內(nèi)存管理中負責(zé)換頁的進程。 系統(tǒng)物理內(nèi)存不足時,kswapd0 會頻繁的進行換頁操作(使用swap分區(qū)與內(nèi)存換頁操作交換數(shù)據(jù)),而換頁操作非常消耗 CPU 資源,所以導(dǎo)致該進程持續(xù)占用 CPU 資源過高。

    2024年02月04日
    瀏覽(21)
  • 常見內(nèi)存溢出與CPU 100%問題

    SQL in 過多 https://mp.weixin.qq.com/s/g5Y47cQ25KbVjzHhZcjN7g 面對 OOM 問題如果代碼不是有明顯的問題,下面幾個JVM參數(shù)相當(dāng)有用,尤其是在容器化之后。 另外提一個參數(shù)也很有用,正常來說如果程序出現(xiàn) OOM 之后,就是有代碼存在內(nèi)存泄漏的風(fēng)險,這個時候即使能對外提供服務(wù),其實也

    2024年02月01日
    瀏覽(13)
  • .report_system 占用100% CPU

    .report_system 占用100% CPU

    故障現(xiàn)象: 突然發(fā)現(xiàn)CPU利用好高,好在CPU 配置還行 CPU100%,通過htop 查看進程對應(yīng)PID? 查看進程,top靠前的進程 ?查看服務(wù)和端口 netstat -tlnp 查看任務(wù)計劃,發(fā)現(xiàn)三個非常規(guī)計劃,清理任務(wù)計劃,刪除計劃相關(guān)文件 crontab -l? 查看任務(wù) crontab -e 編輯任務(wù) rm -r *對應(yīng)文件 serive cr

    2024年02月10日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包