首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure云服务

Azure云服务
EN

Stack Overflow用户
提问于 2014-01-21 16:35:34
回答 1查看 266关注 0票数 3

我被要求使用Windows Azure用C#重写某个程序。

程序现在产生了许多线程来完成它从数据库中接收到的数据行(新的数据行不断出现)。线程的数量必须是动态的(以最大限度地提高效率),但每个线程执行的确切代码取决于作业类型,每个类型都有一个单独的类来处理数据。

看看Azure,我认为最好的地方是云服务中的Worker Thread。总的来说,这是一个好地方吗?

如果是这样的话,一个worker是否应该产生多个线程/任务,或者我是否应该产生多个worker?

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2014-01-21 20:20:14

这个问题实际上没有一个简单的答案,因为它在很大程度上取决于所做工作的性质,以及您对快速部署的需求和/或对控制计算机环境的需求。我同意云服务中的工作者角色是一个很好的选择,但是,您也可以使用Windows Azure网站以及上周宣布的新的"always on“功能来完成这项工作。您可以编写一个web应用程序,该应用程序使用后台线程提取作业,并根据需要生成新的线程。网站方法可能在标准模式下工作得最好,在标准模式下,您将获得一个专用的虚拟机,但在这一点上,它可能只是更好的云服务路线。对于相同大小的机器,云服务每小时比标准模式下的Web站点稍微便宜一些;但是,web服务提供了更快的部署机制。在我说哪一个对你更好之前,有很多问题需要回答。现在,我们假设您使用云服务中的Worker角色。

理想情况下,在启动另一个实例之前,您希望尽可能多地利用每台机器,而不完全耗尽它。如果你的作业是CPU密集型的,那么如果你的机器上只有几个核心,你就不能在一台机器上同时处理这么多的作业。CPU绑定作业的作业必须以最快的速度通过,但CPU都是100%固定的,一旦所有CPU都被利用,那么在一台机器上拥有更多的作业将不会有任何帮助。当多个作业都争用CPU时,就开始发生颠簸。在这种情况下,拥有多个实例将有助于扩展。但是,如果您有一个受IO限制的作业,例如正在读/写数据库、BLOB存储等的作业,则CPU大部分是空闲的,因此您可以在同一台计算机上处理大量这些类型的作业,直到网络容量饱和。

您提到每个线程可能会得到不同的“工作”,这意味着它可能具有不同的特征,这反过来会使决策变得更加困难。我能说的最好的事情是开始测量每个作业的特征,它是CPU限制,IO限制,等等,并看看什么是最有意义的。这可能意味着您需要识别一种或另一种类型的作业,并对它们进行分段,以便IO绑定的作业仅在一组工作线程上运行,而CPU绑定的作业则在另一组工作线程上运行。这将允许您独立地对它们进行缩放。

您还可以看到多核机器是如何帮助您的;请注意,向上扩展是非常线性的,因此2核盒的成本是4核盒的一半。因此,虽然可能倾向于获得最大的计算机,但如果您最终需要10个核心来完成这项工作,那么让10个1核心实例运行可能比运行3个4核心计算机更好,因为您将获得更好的可伸缩性,并且如果一台计算机脱机,您不会释放那么多容量。我要指出的是,您选择的框越大,分配给您的网络容量也越大,因此,如果您的瓶颈是网络带宽,则需要更大的框。

无论您做什么,都不要简单地在Worker角色上运行一个线程,然后根据需要扩展这些线程。这很可能是对资源的完全浪费。测量您的工作负载,并为您的方案做出最佳决策。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21252921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档