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 使用率高