关于通过线性回归来实现线程池的自动调优的讨论

1.一个人提议引起

这虾子(153193053) 10:05:01

想写个工具类来实现线程池的自动调优,大概就是采集一些相关指标,然后利用线性回归来预测最优设置,你们觉得这个靠谱不。

2.和木的建议

1、收集数据;

2、数据建模;

3、用R语言快速验证,得出回归模型

4、用Weka的包引入到监控程序

线性回归到不复杂,不过要收集原始数据,维度比较多;有些是分类变量或者多余参数,就涉及到哑变量和多重共线性的问题。

R语言有些工具,可以自动进行哑变量转换,去掉多余的维度。

这样最终得出的相关系数比较高的回归模型,拟合度较好。

然后呢作为程序员,把Weka中对应的java代码考到你的程序中,就可以给你们老板好好炫一下了

涉及到java线程池,要根据你们的业务场景进行压测,采集数据:

  • 主机的CPU个数(建议分为1、2、4、8、16、32)
  • 线程池大小(建议至少取10组数据,比如1、2、4、8、16、32、64、128等)
  • 测试的TPS
  • 对应的CPU使用率
  • 对应的磁盘IO
  • 对应的网络IO
  • 另外,有可能的话,也要对应调整JVM参数(这些回归时分类变量要转换为哑变量)
    • 如垃圾回收策略,是用CMS还是G1
    • 用CMS的话分配给CMS的线程是多少
    • xmx多大?new和old的比例?new中survive和Eden的的比例

这个你要先有调优经验,在丰富经验的基础上,才有可能进行线性回归。如果java调优经验不是很丰富,恐怕会漏掉关键参数。采集样本不准确,即使做线性回归了,最后出来的拟合函数也没有什么意义

开始可以模型简单些,只对应几个核心参数,先落地。

时间: 2024-10-11 07:49:38

关于通过线性回归来实现线程池的自动调优的讨论的相关文章

下载深入Java程序性能调优(阿姆达尔定律、缓存组件、并行开发、线程池、JVM调优)

深入Java程序性能调优(阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:http://pan.baidu.com/s/1cvD3rw 密码:eevh 1.1. 性能概述--两个实战在线项目对比突出性能的重要性1.2. 性能概述--阿姆达尔定律解决性能的关键点2.1. 设计优化--模式在实际开发中运用012.2. 设计优化--模式在实际开发中运用02-延迟加载的核心2.3. 设计优化--模式在实际开发中运用03-基于动态代理的拦截器2

线程池大小如何调?

在项目中经常使用到多线程来提升业务处理速度,但线程池的大小该定义为多大,这块该怎么确定? 1.IO密集型 单核心 最佳线程数=1+(IO耗时/CPU耗时) 多核心线程数 星佳线程数=CPU核数*(1+(IO耗时/CPU耗时)) 注:如何获取CPU耗时和IO耗时,可以通过APM之类系统 2.CPU密集型 最佳线程数=CPU核数+1 说明一下这个1哪来的,是为了防止突然有线程出现内存页失效或者其它原因导致阻塞: 3.总结 在真正生产中,肯定不是这么配置的,为什么?生产应用一般CPU使用率达到70%就

MySQL IO线程及相关参数调优

一.关于一个SQL的简单的工作过程 1.工作前提描述 1.启动MySQL,在内存中分配一个大空间innodb_buffer_pool(其中log_buffer) 2.多用户线程连接MySQL,从内存分配用户工作空间(其中排序空间) 3.磁盘上有数据库文件.ib_logfile.tmp目录.undo 2.SQL的简易流程 1.DQL操作 1.首先进行内存读 2.如果buffer pool中没有所需数据,就进行物理读 3.物理读数据读入buffer pool,再返回给用户工作空间 2.DML操作(例

[Java Performance] 线程及同步的性能 - 线程池/ThreadPoolExecutors/ForkJoinPool

线程池和ThreadPoolExecutors 虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理来自客户端的请求.Java中对于线程池的支持,来自ThreadPoolExecutor.一些应用服务器也确实是使用的ThreadPoolExecutor来实现线程池. 对于线程池的性能调优,最重要的参数就是线程池的大小. 对于任何线程池而言,它们的工作方式几乎都是相同的: 任务被投放到一个队列中(队列的

Java并发编程:线程及同步的性能——线程池

线程池和ThreadPoolExecutors 虽然在程序中可以直接使用Thread类型来进行线程操作,但是更多的情况是使用线程池,尤其是在Java EE应用服务器中,一般会使用若干个线程池来处理来自客户端的请求.Java中对于线程池的支持,来自ThreadPoolExecutor.一些应用服务器也确实是使用的ThreadPoolExecutor来实现线程池. 对于线程池的性能调优,最重要的参数就是线程池的大小. 对于任何线程池而言,它们的工作方式几乎都是相同的: 任务被投放到一个队列中(队列的

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

Java四种线程池

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:2015-10-20 22:37:40      阅读:8762      评论:0      收藏:0      [点我收藏+] 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异

java自带线程池和队列详细讲解(转)

Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪

Linux多线程实践(9) --简单线程池的设计与实现

线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务(不止一个不同的任务)就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.比如大家所熟悉的数据库连接池正是遵循这一思想而产生的,本文将介绍的线程池技术同