如何配置线程池

需求:08:00-20:00,12个小时之内,发送200万数据到短信网关,每个小时17万,保证每分钟2800(max_hour_count=2800)条,之前客户配的活动做多也就只有几万,十几万,过年期间短信量陡增,配了一个70万的活动,要求一天发出去,结果发现一天只能发出去40万(每个小时3万,每分钟500条,min_hour_count=500)左右的数据。没办法,只能并行发送了,所有配置了一个线程池。

分析过程:短信网关一天只能接受200万数据,因此我们可以将所有的并发请求限制在200万之内,也就是说如果数据库中短信数量超过200万,可以只发送200万,如果数量低于200万,必须全部发送出去。那我们应该开启多少个线程呢,max_thread_count = max_hour_count/min_hour_count = 5.6个线程,max_thread_count这个参数说明我们至少需要配置6个线程才能保证200万的发送量。开始这么多线程,我们的服务器cpu和内存是否允许呢?我们分别来看一下服务器cpu和内存。

服务器cpu:1个cpu,8核

内核为8个,理论上来说开启8个线程效果是最好的,但是因为该服务器上还在运行其他的应用程序,所有我们需要给其他应用预留核心,所以我们暂且占用5个核心,每条数据都要对数据库进行2次插入,1次删除操作,为了合理利用cpu在等待对数据库的I/O操作时的空闲时间,我参考这篇文章https://blog.csdn.net/w05980598/article/details/78797310,设置线程池的maxPoolSize=10(这样可以保证我们在最短的时间内最高效地完成任务)

服务器内存

参考文章https://www.cnblogs.com/shihaiming/p/5949272.html,可以计算平时服务器空闲可用内存为:11G,我给该应用程序分配了3G的内存。

应用程序JVM参数设置如下:-Xmx2048M,-Xmn128M,-XX:MaxPermSize=256M,3096M-128M-256M = 2588M,这里我们暂且分配给发送短信的内存为1200M,每条数据大小为byte_data_size = 0.6K,内存中可同时存在的数据量为204万,满足我们同时网内存中加载200万数据的要求。

具体操作:先确定数据量大小n万

如果:n<=100万,每个线程分配10万数据,corePoolSize=(n/10万),workQueueCount=0。

如果:100万<n<=200万,corePoolSize=10,每个线程分配(n/10)万条数据,workQueueCount=0。

一次配置线程池的分析,如有问题,欢迎批评指正。   

猜你喜欢

转载自blog.csdn.net/qq_35689573/article/details/82588452