Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaJ2EE服务器上平衡CPU/内存资源的线程使用_Java_Multithreading_Jboss_Jakarta Ee_Cpu Usage - Fatal编程技术网

在JavaJ2EE服务器上平衡CPU/内存资源的线程使用

在JavaJ2EE服务器上平衡CPU/内存资源的线程使用,java,multithreading,jboss,jakarta-ee,cpu-usage,Java,Multithreading,Jboss,Jakarta Ee,Cpu Usage,我正在开发一个在JBoss上运行的文档协作网站/在线服务。在具有2.5Ghz cpu和2GB RAM的Linux机器上进行测试期间,页面响应非常快,我们正在考虑使用此机器启动 问题出现在文档处理过程中。用户上载文档后,将启动一个新线程,该线程将转换文档,从文档中提取文本和图像,并通过https在另一台服务器上上载文档。用户可以一次上载多个文档,处理这些文档的线程可以并行工作。在此处理完成之前,网站几乎没有响应 你能给我一些建议,告诉我如何在处理文档的线程上分配一定百分比的CPU/内存(例如,最大

我正在开发一个在JBoss上运行的文档协作网站/在线服务。在具有2.5Ghz cpu和2GB RAM的Linux机器上进行测试期间,页面响应非常快,我们正在考虑使用此机器启动

问题出现在文档处理过程中。用户上载文档后,将启动一个新线程,该线程将转换文档,从文档中提取文本和图像,并通过https在另一台服务器上上载文档。用户可以一次上载多个文档,处理这些文档的线程可以并行工作。在此处理完成之前,网站几乎没有响应

你能给我一些建议,告诉我如何在处理文档的线程上分配一定百分比的CPU/内存(例如,最大40%)?如果这是不可能的,请告诉我一种方法/模式,它将以某种方式在响应页面请求的JBoss和处理文档的线程之间共享机器上的负载


关于

对于给定的线程,实际上没有办法分配一定百分比的CPU/内存时间。您可以降低线程优先级,这样就不会占用所有资源:

int oldPriority = Thread.currentThread().getPriority();
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// process your documents here
Thread.currentThread().setPriority(oldPriority);
一种更好的方法可能会让您更接近于指定百分比,那就是使用带有固定线程数的
ExecutorService
,并通过它运行所有文档处理。如果将服务器中处理器数量的一半分配给它,那么它将有效地将文档处理限制在服务器CPU时间的50%。您需要一个设置线程池的单例服务,如下所示:

int threads = Runtime.getRuntime().availableProcessors() / 2;
ExecutorService service = Executors.newFixedThreadPool(threads);
然后,在web请求中,您可以将实现文档处理的
Callable
传递给服务,并阻止,直到完成:

Callable<Result> callable = new DocumentProcessorCallable<Object>(doc);
Result result = service.submit(callable).get();
Callable Callable=新文档处理程序Callable(doc);
结果=service.submit(可调用).get();

或者,您可能不希望通过提供传递给
service.execute(Runnable)
Runnable
的实现来阻止并立即返回。有关更多示例和文档,请参阅。

在用户提交文档后,您可以将它们全部提交到JMS队列中,在该队列中只有一个MDB实例正在侦听。因此,文档处理将是串行的,因此只使用一个线程(这仍然会占用大量CPU)


如果这个解决方案还不够,您可以在不同的服务器上放置一个远程MDB来处理文档,基本上减轻文档处理的负担。这里的美妙之处在于,此更改基本上只是配置更改,不需要重新编译应用程序。

+1同意executor解决方案,但有一点需要注意。一旦您开始使用executor服务进行资源管理,您就已经本地化了一个问题,这实际上是一个系统范围的策略。为了使其易于管理,您需要有一个策略,将您的执行器(以及任何其他线程生成)放在一个位置以跟踪它们。如果您在系统中的其他位置随机添加/删除线程,您将隐含地更改您的全局资源分配决策。另一种方法可能是将JVM固定到单个处理器/处理器子集上。谢谢您的推荐。在将来的某个时候,这是一个不错的选择,但现在我们希望从一台服务器开始。