2014-01-16 47 views
8

我是新来的java 多线程编程。我想到的问题是,根据我的CPU内核的数量,我可以运行多少个线程。如果我运行的线程超过CPU核心会是机器运行应用程序的开销。例如,当我们有一台运行2个线程(主线程+开发者线程)的服务器软件的服务器时,当更多的同时发生的客户端与服务器进行套接字连接或者没有更多的同步客户端时,它会成为服务器的开销吗?java内核中的CPU内核数量和线程数量之间的关系是什么?

谢谢。

回答

3

这取决于线程在做什么。 CPU只能一次执行X件事情,其中​​X是它拥有的内核数量。这意味着X线程最多可以在任何时候都处于活动状态 - 但是其他线程可以等待轮到它们,并且CPU将在适当的时刻处理它们。

你还应该考虑很多时间线程正在等待响应,或等待数据加载,或网络消息到达等,所以实际上并没有试图做任何事情。这些空闲/等待线程在系统上负载很少。

+0

服务器是否在每个客户端连接的main()方法中创建自己的一个对象,如果是这样,服务器每个对象会运行一个额外的线程(我的意思是它对网络速度有什么影响)?谢谢先生。 – Ramin

+0

我不太了解你的评论。有一个线程用于运行main。线程只是松散地连接到网络速度。 –

2

具有比CPU更少的线程可能意味着您没有使用系统中的所有CPU。如果CPU是瓶颈,拥有更多线程可能会提高吞吐量。

拥有比CPU更多的线程确实引入了开销,如果CPU是瓶颈,这可能会损害性能。但是,如果网络IO是你的瓶颈,这个开销是值得付出的代价,因为它通常允许你处理更多的连接。例如您可以使用自己的线程拥有1000个TCP连接。

0

最佳性能将在核心(NOC)的数量等于()线程的数量,因为如果不是> NOC那么处理器应该开关背景或操作系统将尝试做这项工作,这是昂贵的操作。但是你必须明白,在Web服务器上不可能有NOC = NOT,因为你无法预测同时有多少客户。看看load balancing概念,以最佳方式解决此问题。

+1

这是一个常见的误解。如果上下文切换非常糟糕,操作系统开发人员是不是只编写操作系统而不去做它们?显然,除非你的操作系统是由白痴开发的,否则上下文切换只能在有利的地方进行。所以避免上下文切换是减少线程数量的合理原因。每秒可以有10个线程并执行X上下文切换,或者可以有100个线程,并且每秒执行相同的X上下文切换。所需的上下文切换次数取决于其他设计因素。 –

+2

上下文切换可能一直很昂贵,但肯定不是NOW;操作系统不再是硬件包装硬件,而且CPU很快就会变得邪恶。人们并没有花时间去检查他们所知道的是否仍然是最新的(“Java很慢!”),这更像是这种类型的语句IMO的问题。 – Gimby

+0

我不认为java很慢,我认为它足够快。可能的操作系统会尽量避免上下文切换,并会在SW级别上进行切换,但我的文章的主要思想并没有因此而改变,而且绝对是正确的。 – Divers

3

不用担心获取比CPU核心更多的线程数量;这实际上不在你手中,而是在操作系统中。

假设JVM将您的Java线程映射到操作系统线程(这些日子相当正常),这取决于您的操作系统所执行的线程管理。在那里你可以依靠内核实现的多么聪明来获得核心性能。

你必须记住的是你的设计必须是可持续的。例如,应用程序服务器构建在充满工作线程的线程池上。这些线程被唤醒以便为请求提供服务。你想为每个请求提供一个线程吗?那么你肯定会遇到一个问题 - 请求可能会以数千到达服务器,这可能是内核管理的问题。实际上,线程池的大小应该是有限的(在1到X之间,即使是实时也很容易改变),线程应该从并发队列中获得工作(java为你提供了一些很好的类),并且每个请求都顺序地发出请求。

希望的帮助

5

线程的数量的系统可以执行同时是(当然)相同系统中的核的数量。

系统中可以存在的线程数量受可用内存的限制(每个线程需要一个堆栈和一个由OS用来管理线程的结构),并且可能存在限制多少个线程的OS允许(这取决于操作系统体系结构,有些操作系统可能会使用固定大小的表,一旦它完全不再创建线程)。

通常,今天的电脑可以处理数百到数千个线程。

系统中存在多个线程的原因是:大多数线程将不可避免地花费大部分时间对于某些事件等待(例如:等待用户在键盘上输入的文字处理器)。 OS管理它,以这种方式等待的线程不占用CPU时间。

3

它背后的想法是不要让你的CPU休眠,既不会加载它太多,它浪费大部分时间在线程切换。

它有助于检查Tuning the pool size, In IBMs paper

理念的背后是,这取决于任务的性质,如果其内存中的所有计算任务可以使用N + 1个线程(核N个(包括超线程))。最佳线程

或者

,我们需要做的应用程序分析,并找出等待时间(WT),服务时间(ST)为典型的请求和大约N *(1 + WT/ST)号我们考虑到CPU的100%利用率可以有。

相关问题