Play 2 框架如何以每秒为基础测量线程
Play 2 framework how are threads measured on a per second basis
这是我的第一个 post,我是数据库管理员,希望使用 play framework 2.4 版。我已经阅读了 play 2 文档,但仍然有一些问题,因为我对它还很陌生。我有一个消息传递系统,每秒需要处理多达 50,000 个阻塞线程的负载。如果我是正确的,播放中可用的最大线程数如下:
并行度因子 * 可用处理器
Parallism-Factor 是每个内核可以使用的线程数?我已经看到大多数示例都将此数字设置为 1.0,设置 100 左右有什么问题?我现在将此 P 因子设置为 10.0,并且我有 150 cpu 个内核,这意味着如果是这种情况,我最多有 1,500 个可用线程,我必须处理多达每秒 50,000 个阻塞请求,那么系统会很慢,对吗? 所以扩展的唯一方法是添加更多内核,因为所有请求都在阻塞?
Play 是为异步编程而创建的。这就是并行度因子为 1.0 的原因。当你做很多小而快的非阻塞算法时,这是最优化的。
问题是“每秒 50,000 个阻塞线程”是什么意思。阻塞可能不同。最常见的阻塞示例是对 RDBMS 的访问。我很确定在这种情况下,您的系统可以像魅力一样处理 50000 个阻塞数据库访问。
Play Thread Pool 文档中的示例指出,对于使用阻塞数据库调用的应用程序,将并行度因子设置为 300 是可以的,因此 150*300 = 45 000 - 几乎是您的数字。
“每秒 50,000 个阻塞请求”并不一定意味着您需要 50,000 个线程来处理它们。您不需要为每个数据库调用创建一个线程。
做一个非常简单的计算:每次数据库调用需要0.1秒,这是一个任意数字,因为我不知道你的调用需要多长时间。这 50.000 个请求中的每一个都会导致一个单一的、阻塞的数据库调用。那么你的系统需要每秒处理 5000 个数据库调用。因此,如果您有 10 个 CPUs,则每个 CPU 需要 500 个线程来处理它们,或者如果您有 250 个 CPUs,则每个 CPU 需要 20 个线程.但这只是在理想情况下,这些请求实际上除了阻塞和等待之外什么都不做。
Play 使用 Akka 进行线程管理和并发。好处是在你的应用程序编程中再也不用担心并发的麻烦了。
Akka 计算最大线程数available CPUs * parallelism-factor
。此外,您可以使用 parallelism-min
或 parallelism-max
来限制它们。因此,如果您有 250 个 CPU,而您的 parallelism-factor
是 20,那么您一次最多有 5000 个线程可用,这可能不足以处理您的请求。
所以回到你的问题:这很难说。这取决于您的数据库调用所花费的时间以及您使用 CPU 进行其他计算的程度。我认为除了尝试并进行一些性能测量之外别无他法。但一般来说,线程越少越好,因为创建线程会占用大量资源。我猜 parallelism-factor
为 20 是你的 250 CPUs 的一个很好的起点。
我还找到了这份 akka-concurrency-test 的文档,它本身就有很好的来源列表。
这是我的第一个 post,我是数据库管理员,希望使用 play framework 2.4 版。我已经阅读了 play 2 文档,但仍然有一些问题,因为我对它还很陌生。我有一个消息传递系统,每秒需要处理多达 50,000 个阻塞线程的负载。如果我是正确的,播放中可用的最大线程数如下:
并行度因子 * 可用处理器
Parallism-Factor 是每个内核可以使用的线程数?我已经看到大多数示例都将此数字设置为 1.0,设置 100 左右有什么问题?我现在将此 P 因子设置为 10.0,并且我有 150 cpu 个内核,这意味着如果是这种情况,我最多有 1,500 个可用线程,我必须处理多达每秒 50,000 个阻塞请求,那么系统会很慢,对吗? 所以扩展的唯一方法是添加更多内核,因为所有请求都在阻塞?
Play 是为异步编程而创建的。这就是并行度因子为 1.0 的原因。当你做很多小而快的非阻塞算法时,这是最优化的。
问题是“每秒 50,000 个阻塞线程”是什么意思。阻塞可能不同。最常见的阻塞示例是对 RDBMS 的访问。我很确定在这种情况下,您的系统可以像魅力一样处理 50000 个阻塞数据库访问。
Play Thread Pool 文档中的示例指出,对于使用阻塞数据库调用的应用程序,将并行度因子设置为 300 是可以的,因此 150*300 = 45 000 - 几乎是您的数字。
“每秒 50,000 个阻塞请求”并不一定意味着您需要 50,000 个线程来处理它们。您不需要为每个数据库调用创建一个线程。
做一个非常简单的计算:每次数据库调用需要0.1秒,这是一个任意数字,因为我不知道你的调用需要多长时间。这 50.000 个请求中的每一个都会导致一个单一的、阻塞的数据库调用。那么你的系统需要每秒处理 5000 个数据库调用。因此,如果您有 10 个 CPUs,则每个 CPU 需要 500 个线程来处理它们,或者如果您有 250 个 CPUs,则每个 CPU 需要 20 个线程.但这只是在理想情况下,这些请求实际上除了阻塞和等待之外什么都不做。
Play 使用 Akka 进行线程管理和并发。好处是在你的应用程序编程中再也不用担心并发的麻烦了。
Akka 计算最大线程数available CPUs * parallelism-factor
。此外,您可以使用 parallelism-min
或 parallelism-max
来限制它们。因此,如果您有 250 个 CPU,而您的 parallelism-factor
是 20,那么您一次最多有 5000 个线程可用,这可能不足以处理您的请求。
所以回到你的问题:这很难说。这取决于您的数据库调用所花费的时间以及您使用 CPU 进行其他计算的程度。我认为除了尝试并进行一些性能测量之外别无他法。但一般来说,线程越少越好,因为创建线程会占用大量资源。我猜 parallelism-factor
为 20 是你的 250 CPUs 的一个很好的起点。
我还找到了这份 akka-concurrency-test 的文档,它本身就有很好的来源列表。