【性能优化】-如何降低CPU飙升,解决系统卡主。

【背景】

随着我们系统使用,数据的增多,系统还是之前的架构,那么如何面对数据增多,优化我们系统呢?

【方法】

一、内存

多台服务器,会涉及分布式,而且放到内存重启机器,数据会丢失。

二、中间件

redis可以,但是迁移成本高

三、锁

可以,但是mysql乐观锁和悲观锁,加锁效率会低,操作不当可能导致锁全表

四、分片

在分布式任务调度平台有执行模式,有分片模式,可以先将数据建立一个索引,这个索引就是分配给那台机器处理的编号。

然后在定时任务执行的时候,获取分布式任务调度平台传递的分片,机器根据分片去获取自己所处理的数据。

我们只执行分片有时候效率还是比较低,我们可以再加上多线程,但是多线程没有限制的话,会继续导致CPU的飙升。

java 复制代码
     //分批处理:每批最的数据
        final int batchSize = 25;
        int totalProcessed = 0;
        //创建固定大小的线程池用于处理每个批次
        int processedCount = Runtime.getRuntime().availableProcessors();
        logger.info(" 目前可用的线程数,线程池大小为:" + processedCount);
        int threadPoolSize = Math.min(5,processedCount);//最多使用5个线程,避免过度占用率CPU
        logger.info(" 这次定时任务处理使用的线程数,线程池大小为:" + threadPoolSize);
        ExecutorService batchExecutor = Executors.newFixedThreadPool(threadPoolSize);

   try {
            //遍历所有批次,顺序处理
            for (int batchIndex=0; batchIndex<shardList.size();batchIndex+=batchSize){
                //获取当前批次的任务
                int endIndex = Math.min(batchIndex+batchSize,shardList.size());
                List<ConfigGenerationShard> batch = shardList.subList(batchIndex, endIndex);

                logger.info("TwoBDDeployConfigTaskExecJob 处理批次 " + (batchIndex/batchSize + 1) + "/" +
                        (int)Math.ceil((double)shardList.size()/batchSize) + ", 任务数量: " + batch.size());

                // 在当前批次内使用多线程处理每个任务
                List<CompletableFuture<Void>> futures = new ArrayList<>();

                for (ConfigGenerationShard record : batch) {
                    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
                    //任务逻辑
                            }, batchExecutor);
                    futures.add(future);
finally {
            //关闭线程池
            batchExecutor.shutdown();
        }

这样的话,就完全解决了CPU飙升导致系统卡主的问题,而且处理速度也很快。

相关推荐
YIN_尹2 小时前
【MySQL】数据分析双剑客:聚合函数 与 group by子句的完美搭配
mysql·性能优化·数据分析
TracyCoder1232 小时前
全面解析:Elasticsearch 性能优化指南
大数据·elasticsearch·性能优化
白日梦想家6812 小时前
JavaScript性能优化实战系列(三篇完整版)
开发语言·javascript·性能优化
王和阳3 小时前
一种简洁优雅的纯客户端 Snapshot 方案
性能优化·indexeddb·snapshot
我真的是大笨蛋16 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
2501_9400078921 小时前
Flutter for OpenHarmony三国杀攻略App实战 - 性能优化与最佳实践
android·flutter·性能优化
zhyongrui1 天前
托盘删除手势与引导体验修复:滚动冲突、画布消失动画、气泡边框
ios·性能优化·swiftui·swift
●VON1 天前
React Native for OpenHarmony:ScrollView 事件流、布局行为与性能优化深度剖析
学习·react native·react.js·性能优化·openharmony
●VON1 天前
React Native for OpenHarmony:Image 组件的加载、渲染与性能优化全解析
笔记·学习·react native·react.js·性能优化·openharmony