是否可以从Java应用程序控制CPU使用率?

时间:2009-01-21 07:59:51

标签: java streaming cpu-usage

我正在开发一个通过HTTP流式传输音乐的Java应用程序,我遇到的一个问题是,当应用程序从磁盘读取音频文件并将其发送到客户端时,它通常最大化CPU 90-100%(这可能会导致用户在运行其他应用时遇到问题)。

是否可以控制执行此工作的线程使用较少的CPU,或者是否需要由OS控制?是否有任何技术可以管理您目前的应用程序密集程度?

我知道您可以启动具有高/低优先级的线程,但在这种情况下,这似乎对我没有任何影响。

(我无法理解“我已经要求计算机做某事了,所以它显然会尽可能快地完成它......”)

谢谢!

杆。

9 个答案:

答案 0 :(得分:6)

该任务(从磁盘读取文件并通过HTTP发送)应该使用任何大量的CPU,尤其是在音乐流所需的比特率时(除非你在讨论多个-channel未压缩的PCM或类似的东西,但即便如此它应该是I / O绑定而不是使用大量的CPU)。

你可能以非常低效的方式进行阅读/写作。你是单独读/写每个字节还是使用某种缓冲区?

答案 1 :(得分:2)

您可以使用Thread中的方法降低优先级(如果需要,可以通过Thread.currentThread())。

你也可以在它的处理循环(Thread.sleep())中加入延迟。

除此之外,让O / S负责。如果您的程序可以使用100%的CPU,并且没有其他任何需要CPU的应用程序也可以使用它而不是让O / S空闲任务拥有它。

流数据也应该受I / O限制,因此您应该清楚地查看读取数据和发送数据之间的操作。您是在逐字节地读取/发送,例如,无缓冲?

编辑:为了回应marr75的评论,我绝对不是在提倡你编写那些浪费 CPU资源的糟糕,低效的代码 - 有一个article on my web site清楚地传达了我的想法这种心态。相反,我所说的是,如果你的代码合法地需要CPU,并且如果用户想要做其他事情你已经优先考虑它的行为很好,那么人为地延迟结果以避免挂钩就没有任何意义了。 CPU - 只会让用户无法让他们等待更长时间才能获得最终结果,而这可能是他们想要的尽可能快。

答案 2 :(得分:2)

我会检查你正在使用多少缓冲。如果一次读/写一个字节,则会占用大量CPU。但是,如果您正在读/写4 kB的块,则根本不应使用太多的CPU。如果您的网络是互联网,那么您的CPU不应该超过单个客户端的10%。

缓冲区大小的一个近似值是带宽*延迟。例如如果您希望用户以500 KB / s的速率进行流式传输,并且网络延迟时间最长为0.1秒,则缓冲区大小应为50 KB左右。

答案 3 :(得分:1)

你有一个或多个:

  • 软件RAID
  • 压缩文件夹
  • 侵入式病毒检查程序
  • 环回文件系统

答案 4 :(得分:0)

我不认为你可以降低优先级而不会失去功能(流音乐)。你的程序从操作系统中获取了这么多cpu,因为它需要它。这并不是因为操作系统无缘无故地提供了cpu-time,或者因为“它有心情”。

如果你认为,你可以在不使用那么多cpu-utilization的情况下完成任务,你可以对应用进行概要分析,找出发生这种高cpu利用率的地方,然后尝试改进你的代码。

我认为你是以低效的方式进行流式传输,但我说流式传输CAN是一项高度利用的任务。

我再说一遍,不要考虑通过降低进程的优先级或告诉操作系统“不要给这个进程提供那么多的CPU时间”来降低cpu利用率。那是我眼中的错误直觉。通过改进分析后的算法和代码来降低cpu利用率。

分析java的一个好开头是这篇文章:http://www.ibm.com/developerworks/edu/os-dw-os-ecl-tptp.html

答案 5 :(得分:0)

除了上面给出的信息之外:JVM在使用OS线程方面是免费的。 Java应用程序中的Thread可能在单独的OS线程中运行,也可能与其他Thread共享该线程。有关其他信息,请查看您正在使用的JVM的文档。

答案 6 :(得分:0)

好的,谢谢你的建议吧!看起来我只是需要考虑尝试提高我的应用程序流式传输方式的效率(虽然不确定这会走多远,因为我基本上只是从磁盘读取文件并将其写入客户端...)。

答案 7 :(得分:0)

VisualVM非常易于使用,可以找出Java应用程序花费的CPU时间,并且它包含在最新版本的JDK中(在Windows上名为jvisualvm.exe)

答案 8 :(得分:0)

跟进我的“深思熟虑的缓冲区”评论,这是TCP缓冲的一个很好的经验法则, 缓冲区大小= 2 *带宽*延迟

因此,如果你想传输214kbps的音乐(大约27kB / s)并且让我们说60ms的延迟,那么你看看3.24千字节,并且四舍五入到一个漂亮的4kB缓冲区对你来说非常有效。广泛的系统。