acm-header
登录

ACM通信

Kode恶性

知道你的算法


成排的服务器

信贷:WhiteMocca

回到顶部

亲爱的KV,

我和我的团队正在为我们的项目选择一个新的服务器平台,并试图决定是需要更多的核心还是更高频率的cpu,这似乎是在当前服务器系统上的主要权衡。我们的系统部署在最高端的系统上,因此是我们两年前能买到的最高频率的系统。我们一直以100%的CPU利用率运行这些系统。我们的部署不消耗大量内存,只消耗大量CPU周期,因此我们再次倾向于从我们的供应商购买最新的、顶级的服务器。我们已经考虑过重构我们的一些软件,但是从成本的角度来看,昂贵的服务器比昂贵的程序员时间更便宜,程序员时间被用来添加新特性,而不是重新编写旧代码。在您看来,在现代系统中,频率和核心计数哪个更重要?

丰富的服务

亲爱的,

我真希望我能知道你的卖主是谁,这样我就能从这个利润丰厚的馅饼里分一杯羹了。由于最高端的服务器目前享有大量的利润,您的销售人员可能会感谢每次您的电话。

对于你关于频率与核心计数的问题,简单的回答是:“你告诉我。”你似乎很少或根本没有花时间去了解自己的工作量,只是落入了“更新会更好”的现代谬论。即使不考虑频率缩放的结束,也很少会认为仅仅为系统添加更多的活力是提高性能的最佳方法。提高性能的真正关键是测量和理解算法。

知道您的CPU在100%的时间内都在使用,除了它很忙之外,并不能告诉您关于整个系统的更多信息,但是忙什么呢?也许它处于一个紧密的循环中,或者有人在测试过程中添加了一些不必要的延迟循环。在分析系统之前,您不知道CPU为什么会繁忙。所有系统都提供某种形式的分析,以便您能够跟踪瓶颈在哪里,在您花钱购买全新硬件之前,您有责任应用这些工具,尤其是考虑到在过去五年中,新硬件是多么古怪,特别是由于NUMA(非统一内存访问)和所有复杂的安全缓解措施,这些措施已经耗尽了现代系统的生命来应对Spectre等问题。曾几何时,千伏渴望拥有一款速度缓慢的8位微处理器的简洁性,人们可以通过看一看飞驰而过的组装流程来理解这一点。但那些日子已经过去了,老实说,没有人想在Commodore 64上看猫的视频,所以它对现代互联网来说不是一个可行的解决方案。

既然我之前已经讨论过度量,那么现在让我们讨论一下算法的重要性。算法是我们作为软件工程师工作的核心,尽管这一事实现在经常被库和广泛使用的api所掩盖。这个理论似乎是,对程序员隐藏算法的复杂性可以让他们更有效率。如果我能像乐高积木一样把盒子摞在盒子上来完成我的工作,那么我就不需要知道盒子里面是什么,只需要知道如何把它们钩在一起。当一个或多个盒子成为你的瓶颈时,盒子堆叠模型就崩溃了。然后你必须打开盒子,看看里面是什么,希望它看起来不像有毒的黑色粘液。

细致入微地理解算法需要很多年的时间,但也有很好的参考资料,比如唐纳德·克努斯的系列书籍,计算机编程的艺术,这可以在整个过程中帮助你。考虑算法的最简单方法是每单位输入所需的操作数。在本科计算机科学中,这通常是通过比较搜索和排序算法来教授的。假设您想在数组中找到一段数据。你知道你想找到的价值,但不知道在哪里找到它。第一种简单的方法是从元素0开始,然后依次将目标值与每个元素进行比较。在最好的情况下,您的目标值出现在元素0处,在这种情况下,您执行了一个非常小的数字,可能只有一个或两个指令。最糟糕的情况是,目标元素在数组中根本不存在,您将执行许多指令——对数组中的每个元素进行一次比较,结果发现搜索结果为空。这叫做线性搜索。


就我个人而言,我从不纠结于最好的情况,因为我总认为,平均而言,所有的事情都会变成最坏的情况。


对于许多数据结构和算法,我们希望知道实现目标所需的最佳、最差操作和平均操作数。对于搜索一个数组,最佳值是1,最差值是N(数组的大小),平均值介于两者之间。如果你存储和搜索的数据非常小,只有几千字节,那么数组可能是你最好的选择。这是因为即使是最坏情况下的搜索时间也只有几千次操作,而在任何现代处理器上,这不会花费很长时间。而且,数组非常容易操作和理解。只有当数据集的大小增长到兆字节或更大时,选择一种算法才有意义,尽管它可能更复杂,但能够提供更好的平均操作数。

一个例子可能是选择一个哈希表,其平均搜索时间为一个操作,而最差搜索时间为表中元素数量的n倍。哈希表的实现比数组更复杂,但是如果搜索确实是您的系统最常做的事情,那么这种复杂性可能值得更短的搜索时间。在过去30年里开发的数据结构和搜索算法具有不同的性能特征,这些数据结构和搜索算法的列表太长、太乏味、太无聊,因此无法在这里深入讨论。主要考虑的是,在最好、最坏和平均情况下,需要多长时间来:

  • 向数据结构中添加一个元素(插入时间)。
  • 删除一个元素。
  • 找到一个元素。

就我个人而言,我从不纠结于最好的情况,因为我总认为,平均而言,所有的事情都会变成最坏的情况。如果你足够幸运,你所需要的数据结构和算法已经在一个不同于你现在使用的盒子里有了一个很好的实现,而不是打开盒子看粘粘物,你可以选择更好的盒子,然后进入下一个瓶颈。无论您在优化代码时做了什么,更好的算法选择几乎总是胜过更高的频率或核心计数。

最后回到测量驱动算法的选择,然后进行更多的测量,再进行更多的细化。或者,你可以打开钱包,继续为据称更快的硬件付钱,但它永远不会提供你认为你买的东西。如果您选择后一种方式,请联系KV,以便我们建立供应商关系。

KV

ACM队列的q戳相关文章
queue.acm.org

KV的高声讲话的人
https://queue.acm.org/detail.cfm?id=1255426

10优化线性搜索
托马斯·a·Limoncelli
https://queue.acm.org/detail.cfm?id=2984631

计算没有处理器
辛格分水岭
https://queue.acm.org/detail.cfm?id=2000516

回到顶部

作者

乔治诉Neville-Neilkv@acm.org)是内维尔-尼尔咨询公司的所有人,也是ACM队列编辑委员会。他从事网络和操作系统的代码编写工作,从中获得乐趣和利润,教授各种与编程相关的课程,并鼓励您发表与他有关的评论、妙语和代码片段通信列。


版权归作者所有。
向所有者/作者请求(重新)发布许可

数字图书馆是由计算机协会出版的。版权所有©2019 ACM股份有限公司


没有发现记录

登录为完全访问
»忘记密码? *创建ACM Web帐户
文章内容:
Baidu
map