线程池规模调优浅析 - 其它 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > 其它 > 正文

线程池规模调优浅析

来源: www.bianceng.cn 阅读:

线程池应该配置成多大?

先前一位朋友通过Skype问我关于运行在64位机器JVM集群一些问题,该集群每天会运行几次30万+个线程的任务。30万+个线程运行时,核心模块花了太多时间管理它们,导致应用程序极其不稳定。很明显,该应用程序需要一个线程池,从而保证可以杀死客户端,而不是放任客户端把整个应用程序搞崩溃。

上面的示例是比较极端的情况,但它强调了我们使用线程池的原因。尽管我们合理使用了线程池,仍可能由于数据丢失或交易失败惹恼用户。若我们的线程池定义得过大或过小,都有可能让应用程序完全瘫痪。大小合适的线程池允许运行尽可能多的请求,只要硬件和软件支持合理。换句话说,我们不想在有能力处理时让请求在队列中等待,也不想让运行的请求超出我们的管理能力。究竟线程池应该设置为多大合适呢?

若我们遵从“测量不猜”典故的话,就需要看一下与问题相关的技术,问一下可用的度量方法和我们系统获取它们的方法。我们需要使用一些数学方法。我们认为线程池是由队列连接的一个或多个服务提供程序,这样就知道这是可以用利特尔法则(Little’s law)解释的系统。让我们深入地了解一下。

利特尔法则(Little’s law)

利特尔法则(Little’s law)是说,一个系统请求数等于请求的到达率与平均每个单独请求花费的时间之乘积。整个法则在我们日常生活中很常见,令人吃惊的是直到上世纪50年代才提出来,然后到60年代才被证明。下面有个例子,是实际生活中利特尔法则的一种形式。你是否曾经排队,然后试图计算要等多长时间?你可能考虑排队的人数,然后快速算一下服务队列前面的人需要花多长时间。此时,你可以将两个值相乘,产生你在队列时间的估算。若不看队列的长度,你记住新人加入队列的频率,然后乘以服务时间,照样可以知道在队列中或被服务的人平均数。

\

有很多其它相似的游戏,同样适用于利特尔法则(Little’s law),可以回答其它的问题,如“在队列中等待服务的一个人平均所花时间?”,诸如此类。

\

图1 利特尔法则(Little’s law)

同样,我们可以使用利特尔法则(Little’s law)来判定线程池大小。我们只需计算请求到达率和请求处理的平均时间。然后,将上述值放到利特尔法则(Little’s law)就可以算出系统平均请求数。若请求数小于我们线程池的大小,就相应地减小线程池的大小。与之相反,如果请求数大于线程池大小,事情就有点复杂了。

当遇到有更多请求待处理的情况时,我们首先需要评估系统是否有足够的能力支持更大的线程池。准确评估的前提是,我们必须评估哪些资源会限制应用程序的扩展能力。在本文中,我们将假定是CPU,而在实际中可能是其它资源。最简单的情况是,我们有足够的空间增加线程池的大小。若没有的话,你不得不考虑其它选项,如软件调优、增加硬件,或者调优并增加硬件。

查看本栏目更多精彩内容:http://www.bianceng.cn/Programming/extra/

Tags:
相关文章列表: