std::string COW 机制下的线程安全问题

众所周知 C++ STL 容器是不保证线程安全的,不过对于 vector, list 这类容器来说,由于其底层实现很简单直接,我们可以较为容易地分析出什么时候多线程并发操作时可以不用加锁,什么时候需要加锁 —— 一般来说纯粹的并发读操作是可以不用加锁的。

然而 string 是个很奇特的异类,在 5.x 之前的老版本 GCC 上,由于 string 的实现使用了 COW 优化,这使得 string 的线程安全问题变得极为玄学。这也是 GCC 5.x 后引入了新的 string 实现放弃了 COW 的重要原因之一。

本文就来讨论下 string 在 COW 机制下线程安全方面的一些坑。

PVE 自动获取证书

PVE 强制使用 https 登陆,无法切换到 http 模式。其内置证书是自签发证书,每次登录的时候浏览器都会提示警告信息。要把这个警告消掉的两个必要条件是:通过域名访问且配置了这个域名对应的 SSL 证书。通过域名访问简单,买个域名配置下 DNS 即可。SSL 证书本身也很简单,就是免费证书有效期都不长,经常要去做重复的操作很麻烦。可喜的是,PVE 内置了一个叫做 ACME 的模块,通过它我们可以一键申请并部署新的 SSL 证书。

家庭网络及 NAS 存储搭建指南

作为一个爱折腾的程序员,这几年来也陆陆续续折腾过不少东西,本文就来记录分享一下家庭网络及 NAS 存储搭建方面的过程吧。

最简单的家庭网络结构就是直接使用电信联通等运营商提供的光猫即可,现在的光猫都自带了无线 WiFi 功能,这就可以满足最基础的需求了。然而这显然无法满足爱折腾的我们诸多高级需求,因此我们需要充分发挥折腾精神,打造一套强大的网络出来。

Gossip 协议总结

Gossip 协议是一种弱最终一致性算法,主要用于解决大规模去中心化 P2P 网络中的数据一致性问题,其显著特点在于简单易于理解,并且不要求节点间均可以相互通信,只要一个节点能与部分节点通信,那它就可以把数据变更消息广播至整个联通网络中。

Gossip 协议最有名的应用包括 Redis-Cluster,Bitcoin,Cassandra 等。

【读读论文】大规模真实线上环境下 SSD 寿命,写放大等特性研究

Operational Characteristics of SSDs in Enterprise Storage Systems: A Large-Scale Field Study

此论文为多伦多大学与 NetApp 合作发表在 FAST’22 上的论文,统计分析了 NetApp 线上两百多万块 SSD 在过去 4 年内的运行数据,以此总结了 SSD 寿命,写放大这两个核心运维特性在大规模线上环境下的真实情况及其影响因素。

看完最大的感想是,SSD 间差异是巨大的,垃圾厂家的 SSD 真是不能用……

【读读论文】RocksDB 发展回顾及展望

Evolution of Development Priorities in Key-value Stores Serving Large-scale Applications: The RocksDB Experience

此论文为 Facebook 发表在 FAST’21 上的论文,回顾了 RocksDB 在过去 8 年的演进中设计上核心关注点的变化及相应的优化措施,以及在性能,功能,易用性上所做的探索工作;此外还总结了将 RocksDB 应用于大规模分布式系统及系统错误处理上需要考虑的一些问题及经验教训。论文中没有论述具体的技术细节,更多的是从宏观的面上讨论了核心设计思想及工程实现上的各种权衡。

下面就来看下此论文具体讲了些什么,引用部分为我自己的笔记。

TLA+ 形式化验证入门指南

形式化验证(Formal Verification)指一类使用数理逻辑方法来证明软件设计是正确的技术,据称是由 Edsger Dijkstra 于 1972 年最早提出,此方法一直是一种比较小众冷门的技术。形式化验证技术想要解决的核心问题是:软件总是可能存在 Bug 的,而测试始终无法涵盖所有可能性,特别是对于并发系统及分布式系统来说,就算单元测试达到了 100% 分支覆盖率,也不能肯定的说这个系统在线程安全,一致性等方面不会出问题。那如何更好的来验证我们的程序是否符合预期呢?形式化验证就旨在使用严谨的数学证明方法来证明某一算法是正确的。这样我们就可以拍着胸脯说,我的算法肯定是正确的,都证明过了:)

如何学习一个新东西

我们从小到大都在学习各种新东西,学的东西多了自然会对“如何学新东西”这一问题本身有一些方法论层面的思考,本文就来分享总结下自己的一些经验。

对于学习各种人为创造的东西基本都可以按相同的方法进行,不过对于学习自然科学的概念方法会有所不同,本文就不去讨论了。

学习一个新东西基本可以分为三个阶段:初步理解,即会用;深入理解,即懂原理;融会贯通。

Chia 技术架构简述

Chia(起亚) 是最近极为火热的数字货币项目,对应的货币叫做 Chia Coin,简称 XCH。其核心算法为 PoST(Proof of Space and Time),以替代比特币中的 PoW(Proof of Work)。

使用 PoSpace 空间证明而非 PoW 工作量证明是 Chia 项目宣称的最大优点。据他们的开发者宣称,PoW 耗费太多能源了,不环保,我们来搞点更环保的东西吧,不用 PoW 了,改用 PoSpace,即谁有的硬盘空间多谁的投票权就更大。因此他们还把通常称为白皮书(White Paper)的文档改名叫做绿皮书(Green Paper)。

然而仔细想想这哪里环保了,把一堆硬盘搞来塞满毫无意义的数据比比特币矿机还要更邪恶吧……Chia 的官网上还可笑的宣称硬盘更不容易被垄断,因此个人还有小玩家可以更好的入场,简直是更荒谬的说法,哪个个人会去囤积一堆存不了有用数据的硬盘?

IPFS 好歹还可以存一些实际有用的数据,看起来还真能促进下社会发展,至于 Chia 简直是除了圈钱和泡沫看不到任何其他意义。不过抛开实际意义,由于最近也研究了下 Chia 的文档和代码,就单纯的来和大家分享下 Chia 的技术实现吧。