“性能是一项功能” —专访堆栈溢出的Marco Cecconi

多年来,.NET应用程序的性能一直是一个热门话题。 最早的一篇文章的日期为2001年,为开发人员提供了许多有用的模式。

这个话题是十年之后的实际情况,人们仍然对Stack Overflow上最好的Profiler工具感到疑惑。 这对现代.NET开发意味着什么? 我们决定去问Marco Cecconi

伦敦Stack Overflow的软件工程师Marco Cecconi。 Marco撰写有关软件开发,编码,体系结构和团队领导力的文章。 他还在全球会议上发表演讲。

问: 您为Stack Overflow工作,在性能方面,解决方案的主要“痛点”是什么?

有两个主要的痛点,一方面,我们必须非常小心创建的对象实例的数量以及对垃圾回收的影响,另一方面,我们必须非常小心如何使用SQL Server,编写SQL查询,我们建立表格的方式等等。

这是我们目前最关注的两件事,它们对性能的影响最大

:您的解决方案是基于.NET技术构建的吗,还是有些外来语言(如C ++,Java,Python等)的零件?

我想说我们是99%的C#,尽管我们在C ++或C中确实有一些位,但是就代码行数而言,它们确实确实很小。 当然我们有TypeScript和JavaScript。 我们在服务器上使用Javascript,以便将Javascript打包成包并缩小。 当然,我们使用SQL,这是另一种语言。 就是这样。

问: 为什么您决定开始使用C#而不是某些其他语言和其他技术的项目?

好吧,我可以转一个问题吗? 我认为这个问题最有趣的一点是,为什么我们今天仍在使用这些技术。 Stack Overflow已经存在8年了,从最初的每天十万次页面访问发展到现在每月每月数十亿次页面访问,而我们仍在使用C#,那么为什么不放弃它呢? 答案并不是因为对Microsoft的某种形式的忠诚度,而是因为它是一种运行时间非常好的语言,可以满足我们的需求。 而且我们真的没有理由花时间投入到其他方面。 对于我们来说,它现在已经足够好用了。

问: 那么,您有一些额外的功能来为有一天来Stack Overflow的访客提供服务吗?

目前,我们的产能为5%。 我们可以处理20倍的负载。 在这一点上,我们将遭受痛苦,我们并不是一直希望一直都是100%,但是现在负载在5%到10%之间波动,因此我们可以轻松应对流量高峰

:我们真的要继续进行采访,因为你们似乎根本没有遇到任何性能问题(笑)吗?

哦,不,我们有很多性能问题。 但是您知道,优化性能并不是您仅在垂死之时才能做的事情,因为您的CPU一天要消耗80%的电量。 我们将其[容量]设置为5%是有原因的-因为我们不断进行优化,这并不是偶然发生的,而是持续不断的性能工作的结果。

问: 好的,您是否曾经遇到过性能方面的严重问题,是否还记得市场中一些特殊事件,里程碑事件,您确实遇到过解决方案的延迟或中断?

不,在那个水平上它从未发生过。 原因是我们有很多开销。 因此,即使我们现在获得了DDoS,我们仍然可以使用。 当然,不可能总是那么确定,但是我印象中,在超大型DDoS情况下,第一件事就是我们的互联网连接。 在这一点上,我们实际上几乎无能为力。

有些事件我们实际上可以在日志中看到峰值。 因此,当《 Pokemon-Go》问世时,几天的所有图表都出现了巨大的颠簸。 或美国大选陷入低谷,大选后的第二天来现场的人就大大减少了。

我们看到这样的东西,但是我们谈论的是不到100%的颠簸。

问: 让我们转到工具部分。 您最喜欢使用什么工具来识别代码中的瓶颈?

我们有自己的工具MiniProfiler。 这是一个开源工具,您可以在GitHub上找到它。 它适用于.NET和Ruby。 在.NET中,它可以使用“ using”语句。 我们使用那些“使用”语句来标识我们想要计时的一段代码。 因此,如果您想对通话计时,可以将其包装在“ using”语句中,这样我们就可以创建请求执行的配置文件。 例如,我们有一个计时器,该计时器在我们开始处理请求时启动,而同一计时器在我们完成该请求时结束。 每个数据库调用,每个Redis调用,每个Elastic搜索调用都有计时器。 每个页面的不同部分都有计时器,因此例如在主页上呈现问题列表时,与在页脚或页眉中呈现时比较。

基本上,该工具通过将这些结果作为参考插入响应头中来工作。 因此,发生的事情是,如果您是开发人员,则可以在页面的右上角看到一个小方框,其中包含页面的时间安排,通过单击该方框,您可以确切地看到在此期间发生的所有细目分类。该特定页面的呈现。

这是我们用于识别特定问题的工具,因此,如果我正在导航并且有一个页面花费很长时间,那么我可以确切地看到发生了什么。

但是,我们使用这些数据的一部分并将其与日志一起存储,然后可以针对日志运行SQL查询,并创建统计信息,确定哪些页面的性能更好或更差。

:您如何监控解决方案? 它是否有助于您识别瓶颈。

我们拥有的另一个工具称为Bosun,它是一个时间序列警报系统。 基本上,它会监视我们选择的一些指标,例如内存,分配数,并且只要这些指标发生重大变化,它就会发出警报。