This is why I can’t have conversations using Twitter

Salvatore Sanfilippo

这就是为什么我无法用 Twitter 进行对话

昨天,Stripe 的工程师写了一份详细报告,说明他们为什么遇到了 Redis 问题。这非常值得肯定。在 Hacker News 的讨论串中,我解释过,因为现在我们有了无磁盘复制(http://antirez.com/news/81),所以对于使用主从副本集的人来说,持久化已经不再是必需的。这改变了设计约束:既然现在可以进行无磁盘副本同步,那么以更安全的方式更好地支持 Stripe(前?)那种关闭持久化的副本集用例,就值得去做。这项工作仍在进行中。

Stripe 的工程师还在同一篇文章中说,对于他们在 Redis 上遇到问题的那个用例,他们打算切换到 PostgreSQL。PostgreSQL 确实是一个很棒的数据库,而且很多时候,如果你可以采用 SQL 数据模型和磁盘数据库,那么使用它通常比使用 Redis 更好。Redis 的设计目标,是在你确实想要将大量复杂操作扩展到每秒很多次时使用。Stripe 的工程师还说,他们测量了第 99 百分位数,结果 PostgreSQL 比 Redis 更好,因此 @aphyr 发了一条推文:

“请注意,跨 AZs 进行的同步 Postgres 复制,其第 99 百分位延迟低于异步 Redis。”

我的回复是:

“看看平均延迟可能会有助于更好地理解发生了什么,因为我认为,在 EC2 上运行时,Redis 可能出现的延迟尖峰会严重影响第 99 百分位数。”

也就是说,如果你同时有平均值,就能判断第 99 百分位数是否被延迟尖峰拖垮,而这些尖峰很多时候是可以解决的。通常事情就这么简单:如果平均值非常低,但第 99 百分位数很差,那么很可能不是 Redis 运行缓慢——比如执行的操作非常耗时或会造成阻塞——而是某一小部分查询响应缓慢,原因在于 EC2 中常见的问题:某些实例上的 fork 时间、远程磁盘 I/O,等等。这些问题很可能可以处理,例如就有不存在 fork 延迟问题的实例类型。

在 Twitter IT 圈子里,有一半人把我的话理解成:我是在主张平均延迟是优于第 99 百分位数的正确指标:

“平均值是延迟所能采用的最糟糕指标。我见过的延迟从来没有呈钟形曲线。平均值给出的都是胡说。”
“你显然没有理解分布式系统中的数学原理,也没有理解为什么尾延迟(tail latency)很重要。我认为我们没什么可谈的了。”
“确实如此;问题在于,在存在离群值(outliers)的情况下,平均值并不稳健。”

呃,谁说平均值是一个好指标了?我提出它,是为了检测是否存在大的离群值。所以,在本来应该是一次正常交流的过程中,10 分钟后我发现自己的 Twitter 已经被一群人彻底刷满了,他们都在说我是个白痴,因为我支持把平均值作为全世界“延迟的新指标”。一旦有了第一批转推,转推就越来越多。甚至还有一位知名的其他 NoSQL 数据库构建者抽空通过 Twitter 来教训我几句:我回复说,我写得很清楚,如果你同时有第 99 百分位数和平均值,就能更完整地了解这条曲线,并判断问题是否来自 Redis 在 EC2 上的延迟尖峰;但神奇的是,原推文被删除了,于是我的推文现在更加脱离上下文。我的三条推文是:

  1. “我的意思是,即使在互联网噪音中我也不确定它是否仍然有用,平均值有助于理解为什么(……)”
  2. “第 99% 百分位数很差。如果平均值非常好,但第 99% 百分位数很差,你就可以怀疑存在少数几个非常糟糕的样本”
  3. “这对 Redis 很有用,因为通过适当的配置,有时可以大幅改善那些糟糕的延迟样本。”

猜猜怎么着?甚至有人把第 2 条推文单独截了出来——它其实是“理解为什么第 99% 百分位数很差”的后半句(这里的“差”是指无法提供好的数据)——然后脱离上下文阅读,把它看成:“第 99% 百分位数很差”。

曾几何时,人们会在 Usenet 上争论好几天,但至少大多数时候,针对一个新观点会有另一个观点进行回应,如此往复;大家会提供足够的文字和上下文,从而维持正常的讨论条件。而现在,这只是仇恨的放大器和工程学 101 的规则混杂在一起。第 99 百分位延迟是正确指标,平均值很差?那就务必连在适用的上下文中也不要谈平均值,否则你会收到 10000 条烂回复。

那该怎么办?我的一个优点是,我个人并不会太受这些事情影响;但同样很明显的是,因为我出于工作需要使用 Twitter,以便告诉大家 Redis 正在发生什么,所以这里并不是一个可行的工作环境。以延迟为例:我非常在意延迟,多年来为改善延迟做了大量工作(包括无磁盘复制)。我们也有监控机制,用来理解是否存在延迟尖峰以及它们为何出现;Redis 可以通过监控不同的执行路径,提供一份人类可读的报告,说明内部正在发生什么。做了这一切之后,你得到的却是那条错误信息被转推一百万次,这毫无帮助。大多数人不会跟着推文逐条阅读、自己形成判断;现实在这一刻已经被改写成:我说平均百分位数很好,而且没有意识到应该关注长尾。下次我再谈延迟时,对很多人来说,我会成为那个对延迟只有一些模糊想法的人——谁知道我在说什么,或者我究竟在做什么呢?

与此同时,Twitter 就像是给人类使用的 RSS,对于让很多人及时了解我热爱的事情而言,它极其有用——也就是投入精力开发我的开源项目,而到目前为止,我一直努力谨慎地进行开发。所以我正在思考一个可行的安排。也许我可以多写博客,多使用 Redis 邮件列表,而 Twitter 只用来发布链接,让感兴趣的人去阅读,让感兴趣的人进行真正有用的讨论。

对于那些使用 Redis 很愉快的用户,我有很多事情要做;对于那些正在遇到问题的用户,我也有很多事情要做。我觉得,与其在 Twitter 上进行这种并非对话的对话,不如把时间花在编程上。我喜欢争论,但这只是一种徒劳的活动。