Linux 系统 CPU 100% 打满了!

这篇具有很好参考价值的文章主要介绍了Linux 系统 CPU 100% 打满了!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、事件

昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就会发现咱们的业务系统并不是一个高并发或者CPU密集型的应用,这个利用率有点太夸张,硬件瓶颈应该不会这么快就到了,一定是哪里的业务代码逻辑有问题。

2、排查思路

2.1 定位高负载进程 pid

首先登录到服务器使用top命令确认服务器的具体情况,根据具体情况再进行分析判断。

Linux 系统 CPU 100% 打满了!

通过观察load average,以及负载评判标准(8核),可以确认服务器存在负载较高的情况;

Linux 系统 CPU 100% 打满了!

观察各个进程资源使用情况,可以看出进程id为682的进程,有着较高的CPU占比

2.2 定位具体的异常业务

这里咱们可以使用 pwdx 命令根据 pid 找到业务进程路径,进而定位到负责人和项目:

Linux 系统 CPU 100% 打满了!

可得出结论:该进程对应的就是数据平台的web服务。

2.3 定位异常线程及具体代码行

传统的方案一般是4步:

1、top oder by with P:1040 // 首先按进程负载排序找到  maxLoad(pid)

2、top -Hp 进程PID:1073    // 找到相关负载 线程PID

3、printf “0x%x ”线程PID: 0x431  // 将线程PID转换为 16进制,为后面查找 jstack 日志做准备

4、jstack  进程PID | vim +/十六进制线程PID -        // 例如:jstack 1040|vim +/0x431 -

但是对于线上问题定位来说,分秒必争,上面的 4 步还是太繁琐耗时了,之前介绍过淘宝的oldratlee 同学就将上面的流程封装为了一个工具:show-busy-java-threads.sh,可以很方便的定位线上的这类问题:

Linux 系统 CPU 100% 打满了!

可得出结论:是系统中一个时间工具类方法的执行cpu占比较高,定位到具体方法后,查看代码逻辑是否存在性能问题。

※ 如果线上问题比较紧急,可以省略 2.1、2.2 直接执行 2.3,这里从多角度剖析只是为了给大家呈现一个完整的分析思路。

3、根因分析

经过前面的分析与排查,最终定位到一个时间工具类的问题,造成了服务器负载以及cpu使用率的过高。

  • 异常方法逻辑:是把时间戳转成对应的具体的日期时间格式;

  • 上层调用:计算当天凌晨至当前时间所有秒数,转化成对应的格式放入到set中返回结果;

  • 逻辑层:对应的是数据平台实时报表的查询逻辑,实时报表会按照固定的时间间隔来,并且在一次查询中有多次(n次)方法调用。

那么可以得到结论,如果现在时间是当天上午10点,一次查询的计算次数就是 10*60*60*n次=36,000*n次计算,而且随着时间增长,越接近午夜单次查询次数会线性增加。由于实时查询、实时报警等模块大量的查询请求都需要多次调用该方法,导致了大量CPU资源的占用与浪费。

4、解决方案

定位到问题之后,首先考虑是要减少计算次数,优化异常方法。排查后发现,在逻辑层使用时,并没有使用该方法返回的set集合中的内容,而是简单的用set的size数值。确认逻辑后,通过新方法简化计算(当前秒数-当天凌晨的秒数),替换调用的方法,解决计算过多的问题。上线后观察服务器负载和cpu使用率,对比异常时间段下降了30倍,恢复至正常状态,至此该问题得已解决。

Linux 系统 CPU 100% 打满了!

5、总结

  • 在编码的过程中,除了要实现业务的逻辑,也要注重代码性能的优化。一个业务需求,能实现,和能实现的更高效、更优雅其实是两种截然不同的工程师能力和境界的体现,而后者也是工程师的核心竞争力。

  • 在代码编写完成之后,多做 review,多思考是不是可以用更好的方式来实现。

  • 线上问题不放过任何一个小细节!细节是魔鬼,技术的同学需要有刨根问题的求知欲和追求卓越的精神,只有这样,才能不断的成长和提升。

附上show-busy-java-threads.sh脚本:文章来源地址https://www.toymoban.com/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

到了这里,关于Linux 系统 CPU 100% 打满了!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】Linux突然发现CPU占用100%该怎么办?如何排查进程(带你一文解决)

    目录 Linux的CPU发现占用率100%,一般会由什么情况引起? 1、进程负载过高: 2、错误配置的服务或应用程序: 3、恶意软件或病毒: 4、不良硬件或驱动程序: 5、系统内核问题: 6、CPU过热: 对于排查CPU占用率过高的原因,可以采取以下步骤和工具: 一、top/htop方法 1、使用

    2024年02月08日
    浏览(32)
  • Java 开发,当cpu占用率100%,window和Linux分别如何定位问题

    导言 Java服务,有时候会遇到CPU 100%的问题,对于这样的问题,我们如何快速定位并解决呢?一般会有如下三个步骤: 找到最耗CPU的进程 找到这个进程中最耗CPU的线程 使用jdk自带工具jstack 查看堆栈信息,定位线程的什么操作消耗了大量CPU,定位对应代码 Java程序CPU占用过高

    2024年02月04日
    浏览(31)
  • /dev/mapper/centos-root 100% 目录空间占满了 解决方法

    今天突然遇到公司一个平台 验证码无法加载 查看redis nginx nacos上开的服务也都正常  后来重启验证码相关服务 开一会又挂了。经查日志发现是系统盘沾满了  [root@redis-zuul-eureka-mysql ~]# df -h  //查看到/dev/mapper/centos-root 100% 满载了 解决方法: [root@redis-zuul-eureka-mysql ~]# cd /root 

    2024年02月09日
    浏览(42)
  • Linux系统盘满了,如何解决。

    查看Linux系统中磁盘的情况,使用下面的命令: 可以查看到根目录下磁盘使用率100%。 解决方法: 优先删除根目录下的日志文件及安装包。 删除了根目录下的日志文件,但是磁盘使用率仍然显示为满,可能是因为某些进程仍然在使用该文件。在Linux系统中,当一个进程打开一

    2024年02月15日
    浏览(52)
  • ubuntu20.04磁盘满了 /dev/mapper/ubuntu--vg-ubuntu--lv 占用 100%

    执行 mysql 大文件导入任务,最后快完成了,查看结果发现错了!悲催!都执行了 两天了 The table ‘XXXXXX’ is full ? 磁盘满了? 刚好之前另一个 centos 服务器上也出现过磁盘满了,因此,虽然悲催,但是并不慌张! Centos 7 出现 write error (disk full?) 查看磁盘状况 ubuntu 和 centos 磁

    2024年02月13日
    浏览(37)
  • wpf 系统在显示器分辨率和缩放设置为非1920*1080和100%时,SelectionChanged事件响应问题分析?

    系统在显示器分辨率和缩放设置为1920*1080和100%时,窗口四分格能正常响应SelectionChanged事件,但是当缩放为125%时,或是分辨率大于1920*1080时四分格其中一个格子的下侧和右侧点击不响应,什么原因?   描述的问题可能由以下几个原因导致: 布局问题 : 在高分辨率或较高缩放

    2024年02月03日
    浏览(60)
  • 【面试】线上 CPU 100% 问题排查

    回答套路一般为:线上服务器没有排查过,线上服务器只有运维才有操作权限。在平时开发的时候,在测试服务器上排查过。 2.1、将代码打包成 jar 包 参考: 点我 2.2、传到服务并运行 运行好的效果如下 3.1、拿到进程 id 通过 top 命令,就可以看到让 cpu 100% 的进程 id,pid 就是

    2024年02月11日
    浏览(39)
  • 常见内存溢出与CPU 100%问题

    SQL in 过多 https://mp.weixin.qq.com/s/g5Y47cQ25KbVjzHhZcjN7g 面对 OOM 问题如果代码不是有明显的问题,下面几个JVM参数相当有用,尤其是在容器化之后。 另外提一个参数也很有用,正常来说如果程序出现 OOM 之后,就是有代码存在内存泄漏的风险,这个时候即使能对外提供服务,其实也

    2024年02月01日
    浏览(31)
  • 虚拟机CPU占用100%问题记录

    kswapd0占用CPU过高,严重影响服务器及虚拟机的使用。 kswapd0 是 Linux 系统虚拟内存管理中负责换页的进程。 系统物理内存不足时,kswapd0 会频繁的进行换页操作(使用swap分区与内存换页操作交换数据),而换页操作非常消耗 CPU 资源,所以导致该进程持续占用 CPU 资源过高。

    2024年02月04日
    浏览(32)
  • java 应用cpu飙升(超过100%)故障排查

    害。。。 昨天刚写完一份关于jvm问题排查相关的博客,今天线上项目就遇到了一个突发问题。 现象是用户反映系统非常卡,无法操作。 然后登录服务器查看发现cpu 一直100%以上。 发现线上pid 29737的 java应用cpu达到100% 输入上述命令,然后按H显示cpu最高排名的线程。可以看到

    2023年04月26日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包