关于多线程的问题

粗人-512794511 2016-06-23 08:51:34
问题:
多线程并发处理:图片下载、缩放、图片切割、上传。
一次性提交30个任务时(每个任务大概有10张图片,每张图片有500KB左右),服务器CPU达到96%。

关键是任务都已经执行完成了之后,CPU仍然报错在96左右

注:tomcat每次启动时会初始化30个线程放在线程池,最大允许创建200个线程,以下是我的线程池的代码。请各位兄弟帮看。
此应用上线后的使用人数为2000人左右。所以实际使用的时候可能会产能非常高的并发。部分用户可能会一次性提交500个任务。每个任务平均10个图。每张图平均500KB。我这个服务器为后台处理服务器,现在等稳定之后是要建立负载均衡的。有懂的帮忙计算一下这样大概的需求大概需要多少后台服务器,什么样的配置要求。我的分就这么多了。希望各位不吝赐教!


package com.sq.system.util.easy;

import java.util.HashMap;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* 线程池管理类
* @author 粗人
* @date 2016-06-06
* @version 1.0_160606
*/
public class EasyThread {

//初始值、最大值、保持时间、单位、队列类型
static ThreadPoolExecutor executor = new ThreadPoolExecutor(30, 200, 200, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(30));

/**
* 查看线程池列表状态
* @return
*/
public static HashMap<String,String> getPoolStatus()
{
HashMap<String,String> map = new HashMap<String,String>();
map.put("CorePoolSize", "初始线程: "+executor.getCorePoolSize()+"");
map.put("MaximumPoolSize", "最大线程: "+executor.getMaximumPoolSize()+"");
map.put("PoolSize", "线程池: "+executor.getPoolSize()+"");
map.put("QueueSize", "队列: "+executor.getQueue().size()+"");
map.put("CompletedTaskCount", "已完成: "+executor.getCompletedTaskCount()+"");
return map;
}

/**
* 重新设置线程池
* @param initPoolSize 初始线程池大小
* @param maxPoolSize 最大线程池大小
* @param timeout 线程超时时间毫秒
*/
public static void setPoolParam(int initPoolSize,int maxPoolSize,int timeout )
{
executor = new ThreadPoolExecutor(initPoolSize, maxPoolSize, timeout, TimeUnit.MILLISECONDS,new ArrayBlockingQueue<Runnable>(initPoolSize));
}
/**
* 添加线程
* @param object
* @return
*/
public static boolean addTask(Thread object)
{
boolean result = false;
try
{
executor.execute(object);
result = true;
}catch(RejectedExecutionException e){
result = false;
}
return result;
}

/**
* 关闭线程池
*/
public static void shutdown() {
executor.shutdown();
}
}


环境:
linux(ubuntu 14)+tomcat8+jdk8

CPU:AMD(型号忘记了)
内存:2G
网络:5M


...全文
303 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ArayChou 2016-06-23
  • 打赏
  • 举报
回复
搜索jstack, 多运行几次,可以看出虚拟机里哪些线程在执行,这些的线程在干什么,很容易就就查出问题了
xianaofei 2016-06-23
  • 打赏
  • 举报
回复
10个并发线程。进程可以用shell脚本调用
xianaofei 2016-06-23
  • 打赏
  • 举报
回复
内存:2G 网络:5M 这个配置是硬伤啊。可以提升内存和CPU。 同时可以使用进程处理,进程里面使用线程。测试的时候需要看最大并发多少个线程合适。 估计你现在这个10个并发进程是最优值;

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧