系统性能的艺术

遇到系统性能问题是软件工程师生活中不可避免的方面。 常见性能问题的示例包括:

· 磁盘I / O:例如从磁盘加载应用程序代码或加载资源

· 网络I / O:从服务器加载数据或图像

· 进程间调用:用于进行单点登录或与操作系统交互

在Java中,大多数这些问题在编写代码时不会立即显现出来。 类负载是隐式的,大多数磁盘IO都被抽象化了,看起来像是普通的方法调用。 实际上,大多数情况下,所有这些功能(网络IO除外)的执行速度都足够快,以至于在临时本地测试中不会引起注意。 代码加载迅速,因为它仍在上一次运行时保留在内存中,而您正在调用的进程在上一次调用中仍然有效。 即使对于网络IO,如果内部网络太快而无法注意到问题,则某些问题可能会拖延到生产中。

如果工程师可以"看到"他们的通话速度变慢,那不是很好吗?

线程数

平均而言,应用程序需要保持60fps或每帧16ms的帧速率。 为此,UI线程必须在该时间范围内更新UI。 网络IO通常需要16ms的倍数,这给了我们2种选择:在较小的时间片中分块工作,让其他人执行工作并返回结果。 在Java中,第二个选项是使用线程实现的。

让后台线程执行耗时的工作,需要在UI中显示结果。 仍然需要将数据从后台线程传递到UI线程。 实际上,可能有几种模式:

· UI线程订阅数据事件

· UI线程从共享对象读取/轮询数据。

第一种模式更可靠,但需要更多工作。 第二个更自然,但风险更大。 例如,在整个应用程序中,开发人员可能需要了解当前用户。 但是,在启动应用程序时,仍然需要从磁盘加载此信息。 这造成了一种有趣的情况,开发人员阻塞了UI线程以等待后台线程生成的结果。 不幸的是,这种模式使开发人员使UI线程等待后台结果,这种模式比预期的更为普遍。

如果工程师在调用阻塞方法时可以"看到",那不是很好吗?

权衡取舍

在UI线程上完成所有工作是最简单的解决方案,并且它在很多时候都有效。 但是,在现实世界中,某些工作存在严重的性能异常。 因此,随着时间的流逝,开发人员会将大部分工作转移到后台线程上。

通常可以直接从后台线程准备的结果中读取数据,除非在读取数据时进行并发写入时除外。 因此,可以保证通过同步进行独占数据访问。

通过独占访问直接从结果中读取数据通常很快,除非有时在争用中获得对数据的独占访问。 因此,随着时间的流逝,开发人员会将其中一些工作移至请求-响应模型,UI线程在该模型中订阅结果。

订阅数据更改还需要预先计划,这可能会增加复杂性,从而为用户提供正确的服务。

如果工程师可以提供一个更简单的模式来实现正确,高性能代码的目标,那不是很好。

尽管这些挑战听起来似乎很难解决,但是工程师可以克服这些挑战:

· 向工程师提供相关的运行时信息,以帮助他们在编码时做出更好的决策: 创建一个插件来显示数据。

· 原型化反应式/ redux风格的用户界面,该界面应具有高性能并且易于推理。

不用说,不管工程师的辛勤工作水平如何,这些系统挑战除具有"硬件"背景外,还需要工程师具备一些"软"技能。

作为个人贡献者,工程师有责任将他们的问题和疑虑带到系统审查会议上。 可能需要考虑创建与经理共享的文档,提出一个想要讨论的主题,并跟踪承诺。

不要等待公司范围内的正式调查表或全体会议提出一个复杂的话题。 确保您正在与经理讨论艰难的事情。 这都是关于相互信任。

运送产品,并让所有人知道

在各个公司中,以不同的方式衡量单个工程师的成功。 然而,对于每个想要得到认可和奖励的人来说,一件事情都是相关的。 这是在运送产品[或相应的系统开发工作-用于基础架构团队]。 这应该反映在所有的自我审查和讨论中:交付的内容。

如果您解释您面临的挑战以及如何克服挑战,您将对您的经理大有帮助。 也许您的经理需要一些理由来提名您晋升。 帮助他们成为有力的案例!

进入下一个级别

永远不要低估校准会议的价值,也不要忘记在组织中找到表现最好的人。 其他团队中可能已经有高级工程师可能正是因为该校准而被提名晋升!

如果您想获得晋升,请从下一个级别开始工作,并承担更大的责任和更大的项目范围。 不要等到有人要您接手。 只需继续,并为此承担责任! 认可将随之而来。

在下一个级别执行意味着什么?

系统性能的艺术

大多数科技公司都具有资深级别(他们可能将专业人员称为"初级","中级","高级","职员",或具有一些相应的代码,例如IC3-IC6)。 一些公司定义了职业期望:在每个资历级别上您应该做什么。 很少见的是职业期望的"交付时间"维度。

例如,如果高级工程师可以在两周内交付功能X,那么中级工程师可以在三周内交付功能X。 如果组织希望提名中级工程师来晋升,他们不仅应该交付高质量的工作,而且还要在下一级别的时间范围内完成工作。

以可持续的方式执行

大多数公司都采用两种薪酬来表彰其雇员的出色业绩。 第一个是奖金,第二个是晋升。 奖金是人们在过去一段时间里付出的额外努力。 晋升是对他们在下一级的能力和持续表现的认可。 这两种奖励并不总是同时存在。 一个好的经理应该发现某人是否全天候工作,并考虑将其标记为不在下一级别工作。

没有人可以一直24x7全天候工作,因此将来性能可能会下降。 在花费合理的时间工作的同时,请确保您超出预期。

(本文翻译自The AI LAB的文章《The Art of System Performance for Engineers》,参考:https://levelup.gitconnected.com/the-art-of-system-performance-for-engineers-1c85a398d6f2)


分享到:


相關文章: