对读者反馈的回应

2020-05-09 10:03:19

啊,是的,所以昨天关于我愚蠢的小RPC负载测试的帖子炸了。有很多关于它的反馈和其他几个相关的帖子。我将尝试回答或以其他方式解决一些问题。

我不会告诉你,至少现在不会。这实际上无关紧要。我认为您可以用任何语言编写糟糕的服务,也可以用任何语言编写相当不错的服务。然而,当你开始从你的硬件中挤出最后66%的时候,橡胶就会遇到麻烦。

如果您没有在一个认为主机上CPU利用率达到33%的情况下正常工作的地方工作,那么这可能没有任何意义。我曾经这样做过。这太可怕了。

通过不告诉你它用的是哪种语言,我设法饿死了一整场关于对话的次要表演,在这场对话中,人们进行了一场全面的语言战争,忘记了他们仍然没有用自己选择的语言完成同样的事情。

我打赌它可以用这种语言来做。那些整天吠个不停、干得很少的人,能不能做到呢?那完全是另一回事了。

我要指出的是,在这个过程的早期,一位朋友决定用一种完全不同的语言编写一个类似的服务器,并设法完全销毁了其他地方认为理所当然的数字。这位朋友使用的语言在这里也无关紧要。

哦,我相信他们会的。有些人可能想要它,因为它能传递信息。我不会就这么把它送人的。鉴于目前这类事情在世界上似乎不合理地罕见,我想这里可能会赚到很多钱。

好好想想。这是一个不受限制的代码库,其中唯一的外部依赖项是protocol buf,上次我检查过它基本上是一个包含3个条款的BSD,所以只要您遵循文档/版权要求,您基本上可以做任何您想做的事情。

另外,协议部分并不是非常关键的。您可以将其替换为二进制兼容的实现,没有人会知道其中的区别。Wire协议有很好的文档记录,如果您只是想测试一些东西,那么可以很容易地*手工*修改它。

有没有人尝试过为GRPC制作第二个资源?你知道,说相同的语言,但不使用相同的实现?那会是什么样子?

想象一下,当你签出某个东西时,它不会从互联网上的随机位置克隆出50个不同的子模块。多好的概念啊,对吧?

此外,正如我已经说过的,出于多种原因,我不是整个社区的一部分。我肯定不会带着这样的东西跳进去的。

它不是单线的,对不起。它将每个连接使用一个线程作为精心设计的选择。我不想为线程池而烦恼。我可以吗?好的。我有吗?没有,或者至少现在还没有。如果我需要,我会加进去的。现在,简单是值得的。

我是专用服务器市场的老手,因为很久以前我曾为世界的那一边提供技术支持。当他们是每月5美元的员工特惠时,拿回一台机器是很自然的事情,之后很容易把它留在身边。

在那段时间里,我已经使用过几台专用服务器。他们只是坐在那里,有点像是在做他们自己的事情。他们很无聊,这正是我想要的。这些年来,我拥有的这些盒子中的任何一个都可以充分体现几个商业概念,以确定是否值得在上面投入更多资金。他们的月费通常在100美元到200美元之间。

对我来说,人们在Prem&34;上说的话现在意味着他们办公室里的某个壁橱。如今的办公室经常有非常好的连接,比如千兆或更好的连接,可以体面地前往任何重要的地方。我是在有一条专用于互联网的T1线路(~1.5 Mbps)进入您的企业是件大事的时候想到这一点的。我在这些连接上托管了一些东西。它们也工作得很好。

我会再做一次吗?也许吧。这取决于我需要以多快的速度让事情发生,以及我是否能将某些东西粘在现有服务器的一侧。

任何事情都有风险。你的办公室连接将会有糟糕的一天。你的服务器会死的。一只松鼠会在你的变压器上烧烤,而你一天都会断电。一个专心致志的提供者也会时不时地发生一些愚蠢的事情。那些机器也会时不时地死掉。

不同的问题需要不同的解决方案。时间是一个因素,金钱是一个因素,你已经拥有的资源是一个因素,所需的灵活性是一个因素。

壁橱里的那个备用盒也许正好够插上你的旗帜。只是别忘了稍后重新评估情况。

我认为这意味着丢弃EPOLL内容,只需坐在read()或类似的地方。除了这是我在设计中刻意避免的问题外,还有其他问题。

我的serviceworker线程需要时不时地做一些内务工作。他们可能需要做一次空闲的检查,才能将一位已经有一段时间没有说话的客户平底船。可能还有其他事情要做。此外,我还希望能够清理和关闭它们,而不必做可怕的事情来使它们解脱。

会发出信号让它松开吗?呃.。正在取消线程吗?呃,不。与我最终所做的相比,这些都是令人讨厌的。

我喜欢这样一个事实,即调度我的工人的唯一事情就是内核本身。你不能把它卡住了。如果你呼喊着阻止工人的东西,你就不会得到一大堆其他的东西,这些东西也马上就会受到影响。(这句话的意思是:“如果你大声呼喊,阻止了工人,你就不会得到一大堆其他东西,这些东西也会马上受苦。)”

把整台机器弄坏才能让一切都停下来。在你到达那里之前,一切都只是跳来跳去,安排其他地方。这也是一个很好的缓慢下降,而不是简单地开下悬崖。

同样的道理也适用于我,并且拥有我自己的线程池实现。也会有同样的担忧,另外,如果我不得不自己滚的话,还会增加正确操作的担忧。

这个真的很让人迷惑。这就像是,是的,2013年我确实停止了每天写作,因为我被拖进了门洛帕克的蓝色大沼泽。

但即便如此,我还是时不时地在有些东西需要脱口而出的时候重新露面:不要扼杀苹果公司(Apple)推出的糟糕透顶的Git版本,你甚至都不能关掉这类东西。

不过,老实说,随着工作的增多,原本会用来在这里写作的精力会越来越多地从泳池中消失。这就是事情的发展方式。我签约了,我把我所有的一切都给了它。说它不健康,但这是我唯一可以操作的方法。不做半途而废的事。

我可能永远不会知道,这个人是如何成功地阅读了2013年的一篇帖子,但在那之后很长一段时间都没有看到其他的帖子。

有些人..。都在使用Python..。很糟糕。比如,训练有素的猴子坐在一堆连接到Unix shell账户的愚蠢终端前,循环运行NC-l(Port)&34;可以更好地运行服务器……。那是很糟糕的。

大多数人?你不会听说他们的。对他们来说已经足够好了,他们用得不是很好。

有些人还在使用PHP、C、C++、Perl、Ruby、Rust、Haskell、OCaml、Java、Clojure、Basic、shell脚本、D、Nim、Kotlin、Julia、JavaScript、Scala和Crystal。

不同公司的相对高层已经告诉过我好几次了。这真是太可怕了!你真的以为你和什么都学不到的笨蛋一起工作吗?如果那是真的,你为什么要把它们留在身边呢?

我还断定:这不是真的。事实上,他们是人,这意味着他们是聪明的、会挥舞工具的灵长类动物。人们,当你对他们有信心的时候,通常会想出有趣的解决方案来解决你摆在他们面前的问题。看看在过去的几个月里,这场“暮光之城”的封锁狂潮发生了什么。

餐馆有大量的清洁用品,没有坐下来的交通工具可以使用。被困在家里的人需要清洁用品。餐馆把两件事放在一起,开始直接向公众销售。非常出色!。

我假设大多数人的能力比这些诋毁者想的要多。

你知道我喜欢和谁一起工作吗?在这方面是新手的人还没有见过太多东西,但对任何事情都持开放态度。想象一下一个典型的实习生。他们还在上学。他们在课堂上做了一些事情,也许在另外一两个实习中也做过。他们知道他们还有很长的路要走。

我向他们提出了一个问题。他们走了,我不知道。我说,嗯,你知道吗,我也不知道。然后我们坐下来一起想办法。我爱死它了!这些都是我能想到的最有成就感的故事。我去年夏天做了这件事,感觉很棒。

你知道我不喜欢和谁一起工作吗?那些不愿意为了更好的结果而尝试的人。甚至是任何结果。他们会固执己见,不会尝试我提出的东西,但他们也不会实现他们所谓的解决方案。你两败俱伤。

对任何事情说不都很容易。这需要付出实际的努力才能给出一个替代方案。不要总是默认走最懒惰、最便宜、最糟糕、阻力最小的道路。

相信你的员工,相信他们有能力成为有思想、以成长为导向、愿意成长和开拓眼界的人。如果你不这么做,别人也会这么做。

哦,别告诉我,我不知道。这条线的问题是,它可以用得好,也可以用得不好,我看到它经常被用得不好。

但你知道吗,我已经看到了那些大地方和一些小地方的内部情况--有些是直接看到的,有些是通过可信的内幕报道看到的。你猜怎么着?小得多的地方因为认为自己可以继续逍遥法外而苦不堪言。毕竟,他们是F、A、其他A、N或G。

记住,科技的肮脏秘诀是,你必须把任何粘在墙上的屎都运出去,然后尽快发挥作用,否则别人会先发制人,抢先一步。然后,如果你在企业里呆的时间足够长,能够挺过那些可怕的事情-无论是哪几年,你就会赢得清理东西的机会。

问题在于,这些地方从来没有完全意识到,是时候改变策略,停止像那家扔屎的小公司那样行事了。他们认为以前管用的东西现在会继续管用,我很抱歉,情况往往并非如此。

要点:在一个进程中拥有所有这些连接是很糟糕的,因为如果它死了怎么办?

你说得对,如果它死了,那我们就有麻烦了。所以,让我们确保它不会死得越多越好。我们将检查所有返回代码,并且不假定一切正常。我们将处理我们的语言提供的任何异常类型的东西。我们将构建一个系统,该系统将中止单个请求或连接,并且不会使整个过程崩溃。

不过,当然,好的,如果你想的话可以查几个。如果你对此如此偏执,你甚至可以在同一个箱子上运行它们。我不想,但是,嘿,你是老板。

要点:如果它重新启动怎么办?天哪,TIME_WAIT,无法再次绑定到端口!

我现在不打算在这里演示它(这篇文章更像是一个选集设备,我们会一直呆在火车上),但相信我,我可以在一个正确的;做事情;完成;循环,^C循环中运行服务器的时候,它会立即恢复--即使有客户在积极地使用它。它也不一定要干净利落地关门。不管你想要什么,你都可以签上它,它仍然会工作得很好。

为什么?因为我做了功课,摆弄了所有的旋钮。它不一定是如此重用*.。还有更多。真的。去看看吧。

为什么?因为在我开发它的时候,我只是使用Netcat作为我的客户端,只是为了生成TCP连接活动,而且在杀死服务器之后必须等待一两分钟才能清理干净,这真是太糟糕了!

如果你真的边走边测试,你很快就会发现这类东西,不要只满足于喝咖啡,我猜我会去喝杯咖啡,然后决定好好地挖掘和清理你的烂摊子。

此外,如果您有一个合理的系统来发现您的服务的实例,您不应该需要出现在同一端口。不管你在哪里,只要有足够的人在任何地方都能满足你的延迟要求,就不应该有问题。

你会对黑客新闻上的其他一切说同样的话吗?因为,老实说,天底下几乎没有什么新东西。您读到的大部分内容与五年前的内容相同,但上面加了另一个名称(也许还增加了另一层间接/抽象层)。

我看了最新的帖子,寻找了一些统计上不太可能的术语,只是想看看它可能有多糟糕。让我们拭目以待吧。

我想我可以发布关于烘焙巧克力曲奇的帖子,然后从某些人那里得到同样的抱怨。小苏打!无盐黄油!杯子尺寸!金棕色!开球了!

基本上,我没有办法把它做好,因为它是我做的。话题无关紧要,陈述无关紧要,措辞也无关紧要。我应该坐下来,闭嘴,给他们提供技术输出,就像一个好的小勺子。

要点:(类似的关于可怕系统沸腾的悲剧故事,当你看起来很滑稽的时候)。

如果不是因为这件检疫的事,我很可能会请你喝一杯,因为你是“让垃圾随意运转”俱乐部的一员。坚持住,记住,有些地方不是一直都是这样的。等待时机,保留你的选择余地。

从我的角度来看,我没有做过任何事情。代码中(目前)没有任何内容说,哦,我正受到攻击,所以也许我应该为此做点什么。例如,我可以在某些操作达到一定的延迟后关闭连接,或者限制每个源地址、每个用户或任何其他可能有用的维度的连接。

现在有一个限制:一旦我达到32000个serviceworker线程,我就会主动拒绝新的连接。事实证明,超越这一点开始让生活变得非常有趣,因为你的VSZ,嗯,是巨大的。

为什么我要做线程限制器?嗯,早些时候,我一直在用连接来敲打这个东西,并注意到当它达到这个大小时,它就不能像通常那样启动一个新的线程了。现在,需要明确的是,这个计划并没有死亡。当线程创建由于缺乏资源而失败时,它只会出现一个有趣的错误,比如幕后的mmap调用无法分配更多的内存。

正如你所预期的那样,计划的其余部分继续进行。毕竟,内存分配问题不是导致整个系统崩溃的理由。

就网络问题而言,这主要是客户关心的问题。无可否认,这位客户现在确实很愚蠢。你给它一台主机和一个端口,它就会建立一个连接,然后它就可以开始比赛了。它不做服务发现、通道、负载平衡或任何其他类似的事情。为什么?因为我想先解决服务器端的问题。

客户完全可以达到这样的地步:去给我找个LavaLamp;,带上一份(有限的)名单,找出谁在附近,谁不在,然后开始尝试联系,并进行健康检查,看看谁实际上是有空的。这句话的意思是:“你可以去找一只LavaLamp;给我找一只LavaLamp;,拿出一份(有限的)名单,找出谁在附近,谁不在。”然后,它将只平衡从用户到这些实例的那些通道上的请求。如果一个人死了,没什么大不了的,它会另找地方去的。用户甚至不应该注意到这一点。

这是你在谷歌和Stubby一起工作,或者在Facebook和Service Router一起工作时免费得到的。当你在一个还没有解决这个问题的地方工作时,这也是你得不到的。

旁白:所以,是的,如果我想要超过32K的并发连接,我将不得不在每个线程上处理多个客户端,或者产生另一个进程,或者诸如此类的事情。每个8MB+4096字节的32000个线程相当于大量的地址空间,因此我达到如此高的限制并不令人惊讶。

我想使用超过1024个FDS,而不需要太长时间。我还想学习如何正确使用EPOLL,这样下一次我看到什么东西用得不好时,它就会变得相当明显。

我知道这会自动隔离非Linux解决方案。就目前而言,我对此没有意见。如果它在某个时刻开始变得重要,那么我会拉出一个libeventent,并以多种方式实现它。

但是后来我开始把实际的用例挂在上面,嘿,这真是一段美好的时光。我们还没有谈到这些,但是哦,是的,我拿了这个代码,把一些旧的东西移到上面。这些东西实际上做的是真正的工作,比如来自磁盘的I/O-喘气!-以及创建互斥锁后面的数据结构。天哪,由于并发访问而导致的实际锁争用!

要点:这相当于开着更大的卡车过桥,直到它们断裂。

嗯,是的,这就是问题的关键。我想展示一下,你最终是如何无法获得更多的吞吐量,而它只是开始减速。您想要在图表中找到那个膝盖,然后保持在它的下方。

另外,我已经用卡尔文和霍布斯的漫画告诉负载测试人员停止杀死我的系统已经很长一段时间了。其中一个团体把它作为他们团体的非官方旗帜。