狗池历险记(九)

九、内存币——残酷的现实

  内存币矿池从想做,做出来,上线,一直到关门,总共不到 10 天时间,但回想起来比狗池其它所有的经历加起来更复杂。那十天无论是技术的踩坑、市场的折磨、还是团队内部的争执,都让人感到心累。我试着尽量说清楚那几天的事。

惊现大户

  故事的开头是充满惊奇的。12月24日下午5点,X 神突然给我们带来了内幕消息“大户问我们能不能做 MMC 的池”,因为这个币马上要上交易所了。“大户”?所有人同时冒出了黑人问号。虽说当时大家都忙着修矿池爆内存的问题,但是这条劲爆的消息还是吸引了所有人的注意力:

  • 大户是谁,在我们矿池挖吗?
  • X 神是怎么接触到大户的?
  • 大户是怎么知道 X 神在做矿池的?
  • 低调了两周最终还是没能隐藏身份么……

  一团团疑云笼罩在我们头上。

  在众神的催促下,X 神贴出了他与大户之间的聊天记录。原来 X 神在多天之前买币的时候第一次接触了大户。她凭借社交名媛的气质,吸引了大户的注意,而后又“不小心”透露了狗池是“学长”带着她一起做的,当然她自己完全就是打杂,什么都不懂……在获得了大户的信任之后,X 神晋升为金牌客服 X,我们也因此获得了和大户沟通的直接渠道。

  说起这个大户(大户 Q),在矿池的收入排名是第一名,外加第二名、第三名和第四名,一人承包了矿池几乎一半的收入。而他分四个账户来我们这里挖矿,并不是为了低调,而只是为了方便他的管理。因为他的算力来自于不同地区的网吧。

  大户 Q 和网吧老板合作,如果他在闲时挖矿,就给老板固定的分成。对于网吧老板而言,多花一些电费,就可以得到比电费高很多的合作费用。与此同时网吧的顾客几乎对此没有感知,因为用的是闲时CPU。

  我们看来,大户 Q 凭借那几万台弱机器,可以完虐那些管几十台E5 n核服务器的机房管理员。我们之前遇到的那次“DDoS”也是他的杰作。当然,后来这些弱机器也狠狠地坑了我们一把,暂且按下不表。

内存币

  回到正题上。虽说这还是我们第一次听说“MMC”这个币,但是上交易所这样的内幕消息,对我们来说确是求之不得。更重要的是,哪怕单凭大户 Q 的算力,也足够养活我们了。可惜的是,我们仅仅是意识到这是一个机会,却没有重视起来。技术宅们还沉迷于优化矿池的内存消耗问题。

  D 神用了一些碎片时间初步探索了一下 MMC,这个币全称是 Memory Coin,中文叫内存币,也是一个 CPU 币。内存币之所以只能用 CPU 挖,是因为它需要 1G 内存。计算前,它会先根据当前状态,创建一个 1G 内存的缓存,并且根据缓存里的数值,反复跳转几十次,最终挖到矿。如果用 GPU,给每个计算核心分配 1G 的显存几乎是不可想象的。当时主流的挖矿显卡,只有部分 A 卡的显存是上 G 的,但也只能调动起其中的一两个核心来挖矿,显卡的优势荡然无存。

  截至内幕消息那天,MMC 才发布 7 天,市面上还没出现矿池,留给我们巨大的想象空间。

  痛苦也就此开始。

  先吐槽一下 MMC,它就是一朵奇葩。比如它每出 20 个块,就会有一笔钱直接打给币的作者。于是我们必须要去适配这种特殊的策略,要不然挖到的块就没法被网络承认。当然这只是其中一个点,还有数不清的特殊实现等着我们一个个去适配……

  而我们遇到最大的技术障碍,是矿机的问题。我们刚开始尝试的第 1 天,由于市面上还没 MMC 矿池,所以也没有 MMC 的矿机,我们需要根据钱包代码自制一个矿机。结果到了第 2 天,当我们刚折腾出一些眉目的时候,第一个 MMC 矿池出现了,矿机也有了。我们又转去适配这个矿机……这个矿机各种不靠谱,稍微跑一会就会 core,还得配一个自动重启的脚本。吐槽归吐槽,最麻烦的是这个矿机的协议和之前质数币的完全不一样,甚至不是用长连接的,而是不停地发 HTTP 请求去轮询……经过半天的折腾之后我们放弃了适配,回来自己写矿机。

  多说一句这个第一个 MMC 矿池,一定是快糙猛的杰作,因为矿池上线几小时之后就关掉了。主页上写的是:用户数超过了 1000 人,遇到了我们“早就预料到的”性能问题,所以只能关了……看到后我们心中窃喜,看来我们双核机器支撑十万连接,还是挺有技术门槛的。

  到了第 3 天的上午,第二个 MMC 矿池:mmcpool 出现了(这个矿池的名字就叫 mmcpool)。短短 5 小时,这个矿池占领了 90% 的全网算力,速度惊人。我们估算了一下他的现金流速度,心态崩了。终于把所有精力都集中到赶制 MMC 矿池中来,誓要今晚发布。可惜的是,这个矿池的矿机我们也没法很快适配,再加上这个矿机也有很多设计不合理的地方,比如在切换块的时候会浪费很多算力(大约10秒)。最后我们还是继续开发自己的矿机。

  第 4 天,D 神全力开发矿机。mmcpool 已经占了99%的市场。在这样的环境下,我们的战略不得不定位成:必须要一次成功。

  第 5 天傍晚,我们的矿机经过一天的测试,可以发布了。凭借狗池在市场里口碑,发布之后很快获得了一些算力,不过也就只有这一些了。估算了一下,理论上需要 4 小时可以出块。然而……4小时过去了,什么都没发生。80% 的矿工失去了信心,去了别的矿池,这下出块更难了。

  团队内部也开始起了争执,分为了“一定有bug派”和“一定是人品不好派”。在数小时中,有bug派持续输出,一边审查代码,一边对人品不好派提供的各种证据提出尖锐的质疑。大家看了代码,推了公式,写了模拟代码,争论了两小时,最终达成了一致,真的就是人品不好。

  终于在快到 24 小时的时候,出块了!其实这时,按照期望应该出了两个块,如果用泊松分布估算,我们的运气属于全宇宙最差的15%……看着钱包里这份微薄的收入,大家泪流满面,五味杂陈,只能感叹一下代码没有bug。

  心累。

大户加入

  说回大户,当初我们开 MMC 矿池,就是因为是大户 Q 的建议。然而为什么我们发布了一天多,还不见大户来捧场呢?

  其实在做内存币之前,我们就意识到了,大户 Q 的主要机器都是低端机器,而且是网吧的空闲计算资源,留给挖矿的内存就不多了。但我们没想到的是,他那几万台机器绝大多数只能保证有 256M 内存,如果需要1G内存,可能就只能拿得出几十台……

  内存不够怎么办?群神都是做算法出身的,大家不约而同地想到了用时间换空间的方法,经过 D 神一天的实现和优化,最后在 256M 内存挖矿,大约也可以达到 1G 内存的 ⅓ 性能。

  定制没有白费。第 7 天的傍晚,金牌客服 X 带来了大户的消息:“大户先开几十台 1G 内存的 E3,然后几千台 512M 一线程,最后几万台都连上,把其他池都干掉。。。”这些豪言壮语听着开心,但是我们心里都在打鼓,扣除了 ⅔ 的性能之后,对大户来说挖 MMC 还划算么,性价比不高的话,或许最后只能“帮个忙”。

  大户的几千台机器进来,立竿见影,没几分钟,矿池就出了一个块。恰好在此时,mmcpool 挂了,借着“双喜临门”的势头,狗池一下子吸引到了大量的矿工,我们的双核机器也赶紧升级到了8核,确保服务质量。可惜的是,mmcpool 一恢复,好多矿工又跑了回去。

  说实话,mmcpool 的技术肯定是比我们差很多的,比如前面提到的,他们的矿机会浪费10几秒的算力,而且 reject 率很高,也就是矿工的无效计算非常多。所以比起来,在我们这挖矿,要比他们的收益高30%以上。照理说,矿工是非常趋利的,实际上呢,mmcpool 的头部效应太明显了,矿工们普遍会倾向于去出块多的矿池挖矿,毕竟跟着大多数人走,比较保险。R 神叹息道:“印证了互联网产品重要的不是技术”。

  大户最后确实没有拿他的主力机器来挖 MMC,不过在他象征性的帮助之下,狗池的算力稳定在了全网算力的 20%到30%之间,保持了两天。这两天我们也没闲着,比如把矿池做成了动态 share 难度的,这点对于矿池的稳定性非常重要。因为 mmcpool 经常会挂掉,我们时不时会因此得到大量的短时算力,可能在半小时内,我们的算力就会翻倍,这也意味着矿池的 CPU 消耗也要翻倍。这套策略,会在算力增大的时候,以合适的速度提高 share 难度,反之亦然。我们设计的这套策略在当时似乎非常先进,几乎没有其它竞品在用,当然现在的矿池基已经标配这个了。不过这种锦上添花的东西矿工不太有感知,更多的只是降低我们的运维成本。

  除了矿池的优化,我们还对矿机做了很多优化,技术上,适配了各种古老的操作系统,做了各种编译优化。用户体验上,我们把运行脚本一起打包进了压缩包里。因为我们发现很多人会改 bat 脚本,却不会自己创建一个新的 bat 脚本,所以光写在文档里还不够……

  其实大户加入后的第二天,还发生了一件事,有个新的 MMC 矿池出现了,号称支持用 GPU 挖矿。我不想把它的名字写出来,就叫他“GPU 池”吧。GPU 池也有大户加持,刚上线就占了半壁江山。GPU 池似乎有点黑,我们实测下来收益不到狗池的一半,仔细分析来看,不像是他技术不行,而更像是算力被他黑走了。

DDoS

  经过一周的折腾,MMC 矿池总算走上了正轨,正当我们想歇一口气的时候,又一个杯具发生了。早上 7 点,金牌客服 X 突然在群里着急地说,矿池连不上了!

矿池在线算力为0

  口碑不能砸,D 神赶紧到电脑前排查,一看,DigitalOcean 发了一封站内信,说我们的 IP 被人 DDoS 了,所以他们就把那个 IP 封了。申请解封之后不到 10 秒,系统又自动把这个 IP 封了。我们装了抓包软件,看看到底是什么样的攻击,又申请了一次解封,在那上线的几秒钟,我们看到了 1Gbits/s 的巨大流量(也不知道是不是网卡被打满了)。之后分析发现,是一种叫做 UDP DNS Query Flood 的攻击。虽然我们的服务器配置完全可以抵挡这样的攻击,但对于机房来说,这么大的流量会影响他的正常服务,就选择把我们关掉了。我们后来怎么申请,DigitalOcean 都不肯给我们解封了,只祝福我们“I hope you have better luck in the future”。

DDoS 当时用 nload 命令看到的效果

  这个攻击者一看就是圈内人士,他只攻击了我们用来挖矿的 IP,而完全没去动我们 web 服务的 IP,一点资源都没有浪费。与此同时,mmcpool 也正在被攻击,只有那个 GPU 池还活着。把一个币交给一个黑池真是让人心痛啊。

  我们调研了几小时,发现要防 DDoS 对我们这种做小本生意的人来说是无解的。如果套一层 CDN,矿机的长连接就很难保持。如果选那些防 DDoS 的机房,成本又远超我们的收益。当时我们能找到的防 DDoS 产品,每月要付大几千,而我们那两天从 MMC 中得到的收入只有每天 300 元,况且这个币还不知道能活多久……

  最后我们把矿池公告改成了“矿池正在被 DDoS 攻击,欢迎选择竞争对手的产品”,直接放弃了这个市场。虽然心有不甘,但更多的是如释重负。至少我们还有 DTC 矿池,给我们带来稳定的收入。大家也开始自嘲,被竞争对手认可了,好开心;狗池让我见识到了 DDoS,这辈子值了。

  金牌客服 X 的一句话打断了群里的自嘲:不如先弄个私池,让大户 solo。

6 评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注