我被要求使用 Windows Azure 用 C# 重写某个程序。
该程序现在产生大量线程来完成它从数据库中作为数据行接收的任务(新的不断出现)。线程的数量必须是动态的(以最大限度地提高效率),但每个线程执行的确切代码取决于作业类型,每种类型都有一个单独的类来处理数据。
看看 Azure,我认为放置这个程序的最佳位置是云服务中的工作线程。一般来说,那是个好地方吗?
如果是这样,一个工作人员应该产生大量线程/任务还是应该产生大量工作人员?
先感谢您。
我被要求使用 Windows Azure 用 C# 重写某个程序。
该程序现在产生大量线程来完成它从数据库中作为数据行接收的任务(新的不断出现)。线程的数量必须是动态的(以最大限度地提高效率),但每个线程执行的确切代码取决于作业类型,每种类型都有一个单独的类来处理数据。
看看 Azure,我认为放置这个程序的最佳位置是云服务中的工作线程。一般来说,那是个好地方吗?
如果是这样,一个工作人员应该产生大量线程/任务还是应该产生大量工作人员?
先感谢您。
这个问题并没有一个简单的答案,因为它在很大程度上取决于正在完成的工作的性质以及您对快速部署的需求和/或对机器环境控制的要求。我同意云服务中的 Worker 角色是一个不错的选择,但是,您也可以使用具有上周宣布的新“始终在线”功能的 Windows Azure 网站来完成这项工作。您可以编写一个 Web 应用程序,使用后台线程提取作业并根据需要生成新线程。网站方法可能在标准模式下效果最好,在这种模式下,您将获得一个专用的虚拟机,但在这一点上,走云服务路线可能会更好。对于相同大小的机器,云服务每小时比标准模式下的网站稍微便宜一些;然而,Web 服务提供了更快的部署机制。在我说哪一个更适合你之前,有很多问题需要回答。现在,我们假设您走的是云服务中的 Worker 角色。
理想情况下,您希望尽可能多地利用每台机器,而不是在启动另一个实例之前将其完全最大化。如果您的工作受 CPU 限制,那么如果您的机器上只有几个内核,您将无法在一台机器上同时处理尽可能多的工作。CPU 绑定作业的作业必须尽可能快地完成,但是 CPU 都固定在 100% 上,一旦所有 CPU 都被利用,在一台机器上拥有更多作业将无济于事。随着多个作业都在争夺 CPU,抖动开始发生。在这种情况下,拥有多个实例将帮助您扩展。但是,如果您有一个 IO 绑定的作业,那么读取/写入数据库、BLOB 存储等的东西。
您提到每个线程可能会获得不同的“工作”,这意味着它可能具有不同的特征,这反过来又使决策变得更加困难。我能说的最好的事情是开始测量每个作业的特征,是 CPU 密集型、IO 密集型等,看看什么是最有意义的。这可能意味着您识别一种或另一种类型的作业并将它们分段,以便 IO 绑定作业仅在一组工作人员上运行,而 CPU 绑定作业在另一组工作人员上运行。这将使您可以独立扩展它们。
您还可以看到多核机器如何帮助您;请注意,放大是相当线性的,因此 2 核盒的成本是 4 核盒的一半。因此,虽然倾向于尽可能地获得最大的盒子,但如果您最终需要 10 个内核来完成工作,那么运行 10 个 1 核实例而不是运行 3 个 4 核盒子可能会更好,因为您会得到更好的可扩展性的颗粒,如果一台机器离线,您不会失去太多的容量。我会指出,您选择的框越大,分配给您的网络容量也越大,因此如果您的瓶颈是网络带宽,您需要一个更大的框。
无论您做什么,都不要简单地在 Worker Role 上运行一个线程并根据需要对其进行扩展。这很可能是对资源的完全浪费。衡量您的工作负载并为您的方案做出最佳决策。