每个服务器(communicator)都有2个线程池:
Client thread pool:处理对客户端请求的回复,并回调(通知客户端异步回调对象AMI callback objects)。
Server thread pool:处理客户端的请求。
name.Size
线程池的初始大小,默认值1。
name.SizeMax
线程池最大体积。默认值1。如果name.SizeMax小于name.Size,name.SizeMax会被调整到等于name.Size。
name.SizeWarn
当线程池中的线程数达到此属性的值时,会打印告警信息。如果你的程序经常产生这种告警,说明应该增加name.SizeMax,以达到更高效率。默认值0,不显示告警。
name.StackSize
设置线程的栈大小。此属性没被定义或者设为0时,将使用操作系统指定的默认值。
name.Serialize
如果此值大于0,线程池会将一个连接上接收的消息串行化。
name.ThreadIdleTime
线程池中的线程终结前,必须达到的空闲时间。默认值60秒。设置为0时,线程不会终结。
客户端线程池和服务器线程池的属性名分别为
Ice.ThreadPool.Client,Ice.ThreadPool.Server,例如:
Ice.ThreadPool.Client.Size=1
Ice.ThreadPool.Client.SizeMax=10
Ice.ThreadPool.Server.Size=1
Ice.ThreadPool.Server.SizeMax=10
想要监视线程池的活动,可以使能 Ice.Trace.ThreadPool。当线程池增加或减小的时候,将会打印日志。
动态线程池可以根据程序的运行情况,动态的增大或者减小。通过下边几个例子,来进行说明。
name.SizeMax=5
这个线程池,初始有一个线程,因为name.Size的默认值为1,最多可以有5个线程。当线程空闲60秒后会终结,直到线程池中剩下一个线程为止。
name.Size=3
name.SizeMax=5
此线程池初始有三个线程,其他和上面的线程行为一致。当空闲时,线程池依然会减小到一个线程。
name.Size=3
name.ThreadIdleTime=10
此线程池初始有三个线程,当线程空闲时,会迅速的减小(10秒空闲)。他的最大线程数也为3,name.SizeMax默认为name.Size的值。
name.SizeMax=5
name.ThreadIdleTime=0
此线程池初始一个线程,最大五个线程,但此线程池不会减小,因为ThreadIdleTime被设为0。
name.Size=5
name.ThreadIdleTime=0
此线程池初始五个线程,最大也是五个线程,不能增加也不能减小
将线程池配置为多线程,可以让ICE并发处理请求和异步回调。尽管,设计一个线程安全的程序需要付出更多的努力,但这可以提高程序的可扩展性和吞吐量。
想要合理的配置线程池,需要对程序做仔细的分析。比如,对一个运算密集型的程序,最好将他的线程设置为CPU核心数,如果线程数大于核心数的话,就会因为上下文切换的增加而影响性能。线程数增加,可以提高服务器的响应性,但如果有太多线程时,可能会产生相反的效果,反而使服务器响应降低。具体还是需要在真实的运行环境下进行实验。