CPU100%问题解决

CPU 缓存

  伪共享 --- CPU 缓存了不需要缓存的数据,导致外部读取 影响程序的时间

  缓存行填充 --- 强行把数据隔离开【空间换时间】

 

  多线程优化的本质,就是 空间换时间,更多的服务器,

 

  程序优化 ----> 单次 ------>  事少

  资源少 ----> 时间短

 

死锁

  jcmd 看当前机器 jvm 进程信息,让它执行指令

  jstack : Found one java-level dealLock

  对应生产环境,用户反馈有些功能,点击之后没有结果,一直转圈圈。

  当前系统在忙什么。

jstack 6364

打印 

                       

 

CPU 100%

  top 命令查看当前系统资源情况

  cpu 可以达到 200% 或者更高

  程序优化 ----> 单次 ----> 事少

  资源少 ----> 时间短     

    1、top 找到进程 --- 对应进程的 ID 【27605】

  

  2、线程本身 操作系统的资源,进程管理单元

  3、找到资源占用比较高的线程

top -H -p 27605 

    之后显示了,各个线程的运行状况, 可以看到 【27625】CPU 占用 98.7

      

 

  4、查看对应线程状况

jstack 27625 

    

 

   把屏幕内容输入到文件

jstack 27625  > 202008.log  

     

 

                 27625 的十六进制是 【0x6B19】对应下图的线程

      

 

       可以看到下图,划线的是代码第 9 行

           

 

      对应代码的如下图,第 9 行

            

 

 

活锁 --- jstack 检测不出来

    park unpark  wait/ notify 一直处于等待的情况

    利用工具查看线程的状态是否长时间处于  wait 

 

线程数量多少合适

    业务场景:点赞请求,保存点赞操作 --- 保存点赞历史 --- 统计点赞次数

    电脑配置:8 核  16 G

    问题   :达到 1 秒 处理 1000 个请求, 是否能够实现?

    java, jmeter, mysql, redis

    1、分析业务流程的处理步骤 ----- 单次处理程序需要 40 ms   

      a、java 程序调用 ---> 9.78 ms 一次 

      b、mysql 程序插入【或查询】---->  6000ms/ 2000次 = 30 ms 一次请求

      c、redis 点赞次数统计  ----> 假设 11000 ms / 5000 次 = 0.22 ms 一次 redis 请求

    2、 tomcat 接收请求 --->  线程数量

      a、归属于 java 程序运行的时间,非等待的时间 ---- 10ms

      b、单核 CPU ---> 一秒处理的请求 1000ms / 10 ms = 100 请求 【乘以CPU核数】

      c、(理论)如果是 8 线程【I/O型】,CPU 的空闲时间 3/4 ---- 理论达到 100% 利用 --- 32线程

        CPU 跑满,8 核支撑 800 /s     

    3、实际上,波动,取一个可以接受的值,要求 40ms 就返回    

     [公式作用] 面试的作用, 不要太离谱

          面试 问 公司服务器什么样,答:qps 5000/s,

             再问:电脑配置8核16G;

             问:RT是多少(Response Time)

     [实际使用] 理解推理过程,结合性能测试,不断调整,达到最优

          推理过程  6000 / 3  = 2000, 10000 / 5 = 2000 qps 是 查询量( tps 是事务请求)

 

线程的数量

    计算型:线程任务没有太多等待/阻塞, 线程数量和CPU 核数接近

    I/O 型:网络 I/O, 磁盘 I/O 场景多阻塞,所以线程多一些

    【注意】如果超过一定数量,会导致 其他资源 不够用

 

内存和CPU 都爆掉的情况 --- 实际

    警报

    两台机器 后台运营系统出现内存占用率,CPU使用率都高

    切断两天机器访问,不分配流量

    堡垒机--线上排查---【切断访问,内存占用,CPU 没有降低】

    ssh 操作比较慢,一台机器 10 分钟还是处于 高资源占用,一台机器出现 OOM 异常,产生日志,

    事后排查 ---- 内存快照 

    故障原因, 从数据库查询一个结果集

    分页没有添加限制、默认值 ----- 前端出现加载问题,根据未分页查询结果

    三百万多的数据全部查出来了 

    内存不够 ---- 内存 OOM 原因 ---->

    导致其他请求 --->  堆积 ----> 处理很慢, CPU 使用率高

 

 

      

 

posted @ 2020-10-21 19:09  抽象Java  阅读(514)  评论(0编辑  收藏  举报