gpt4 book ai didi

java - 平衡 Java J2EE 服务器上 CPU/内存资源的线程使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:54 27 4
gpt4 key购买 nike

我正在开发一个在 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();

或者您可能不希望通过提供传递给 service.execute(runnable)Runnable 实现来立即返回。参见 ExecutorService获取更多示例和文档。

关于java - 平衡 Java J2EE 服务器上 CPU/内存资源的线程使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com