「十日谈」- 22 年 07 期 - 总第 0007 期

这里是 PsiACE,为你带来关于最近十天关于我的一切(并不)。

伴随着防疫政策趋严和市场行情波动,本轮迭代的可公开状态也受到强烈影响 :<

开源 & 研习

  • 做了 openraft 的 serde 可选特性,还需要改一些内容,这个鸽了一段时间了,得往起来捡。这里涉及到一个如何测试指定特性的问题,考虑到 serde 应该不会影响主要功能,所以暂时的想法是,单独添加仅针对 serde 序列化和反序列化的测试(#[cfg(feature = "serde")])。
  • 把 Databend 用来兼容 clickhouse 和 mysql 的服务模拟库整合到了 datafuselabs/opensrv 。也许会考虑发 0.1 ?目前的考虑是,尽量不要搞很多特性,专注异步实现和支持。
  • 动手扬掉了 Bendctl,有考虑到减轻用户学习成本和维护的因素。有在调研一些版本管理工具和部署工具,也许后面会做一个简单的 dvm 关注部署的一些事项。
  • 因为 light4 做了一些关于构建选项和编译优化的工作,又回顾了一遍关于构建和编译调优的内容,感觉 Databend 基本用了一多半所谓有效的办法,希望拆碎以后能够获得一个提升。
  • 定下来 benchmark 的方案,试用了 sundy 哥哥提到的 hyperfine 和 之晗 哥哥主理的基准测试程式,都很好用,大概下周会把这块完善掉。简单写了一点文档,但是估计要周末交了。
  • 有关注 casbin gsoc 那边正在卷 rust 的同学,盲猜一手印度小哥?改 examples 应该够他头疼一段时间。因为 gha 沟通了好几次,不过感觉他也不是很熟悉这个东西。

领了大小任务若干,本迭代推进有限,接下来应该会有一个小小的爆发期。

娱乐 & 生活

  • 喜大普奔:只做了两次核酸就变绿了,耗时 6 天,这个东西是真的影响心情。
  • 潜伏在瘦人的群里,发现他有做香囊,入手之,还挺助眠。
  • 因市场波动巨大,影响给编译器磕头的伟大事业,遂卸载所有银行基金股票的 app ,现在感觉良好。
  • 同样受市场先生影响,购入《置身事内》一书,不过没看多少。
  • 夜间尽量告别电子产品后,作息整理有所小成,这一迭代平均入睡时间应该没有晚于夜间十二点,但周末估计还是得补十五六小时的觉。

如果静不下心来,就整理整理东西好了。

迭代 & 立 flag

  • 马上又要到节气了,上次的视频还没发,猜猜我会不会连着发两个。
  • 最近有试着增加一些用于学习无用的知识的时间,感觉还可以,应该继续保持一下。
  • 我什么时候才能看完我买过的大部分书!

冲!冲!冲!


那么,新的迭代,请多多指教了。

「十日谈」- 22 年 06 期 - 总第 0006 期

这里是 PsiACE,为你带来关于最近十天关于我的一切(并不)。这次是大概 12 天。

开源 & 研习

  • 最近主要的贡献可能就是砍掉了 Databend 中的一些依赖 :(
  • 对数据库的一些知识还不是很了解,好在同事都很 nice ,虎哥还特别给我指出了 table functions 和 aggergate/scalar functions 的区别
  • 给之前 10 月份发现的 release 版本无法正确显示贡献者/依赖的问题想到了解决方案,不知道有没有人感兴趣做
  • 罗杨博士今年计划选我做 Casbin Rust 那边的 Mentor,说来惭愧,感觉自己过去没有做很多贡献在里面,还需要努力

二月份依然保持了 github 全绿的局面,并首次突破单月 100 commits 大关,这个迭代还有一篇关于减缓构建时 OOM 的文章,应该也没有很摸鱼

娱乐 & 生活

  • 最近没啥娱乐活动,已经要锈掉了
  • 又入手了《普林斯顿数学指南》和全套《新概念英语》,买书能够有效缓解我的焦虑,当然,我确实有计划重新做人
  • 读了一下《学习之道》这本书,理念很普通,可能要坚持去做才能有效
  • 受未知影响被误赋黄码,社区工作人员都很和善,但解决不了问题,7 天 3 次核酸倒是无所谓,就是小弟暂时不能去学校读书
  • 惊蛰嘛,本来要发一期视频的,可能要缓一两天

还是不要喝地西泮了吧,只要晚上早点放下手机和电脑,我自己是可以睡着的

迭代 & 立 flag

  • 这个迭代明明过得很忙,但又想不出自己做了些什么,好像失忆了一样
  • 本来说要换个更充实的风格去讲,又变流水帐了,或许加一些知识性的部分会好一些
  • 上面提到的重新做人,应该会在新的迭代开动,预计后面会公开出来,敬请期待

第一个有效的做法应该是正视自己存在的问题,然后逐个打败它们


那么,新的迭代,请多多指教了。

逃离编译时的内存溢出

今天写周报的时候提到了这个话题,顺便就记录一下如何逃离 Rust 编译时的内存溢出。

内存溢出,也就是 Out of Memory(OOM),从字面就能看出来,是要用到的内存大于系统能提供的最大内存而引起的故障。

Databend 中的 common/functions 模块为用户提供常用 SQL 函数支持,体量本身就很大,并且在新一轮的改造中引入了很多需要 codegen 的环节。于是,我们又遇到了老朋友(CI 又挂了):

(signal: 9, SIGKILL: kill) warning: build failed, waiting for other jobs to finish... error: build failed.

使用 -Z time-passes 这个 RUSTFLAGS 可以帮助观测一些指标,就很容易判断出来是 OOM 。而且之前的一些反馈和报错也能够佐证是发生在链接阶段。

那么,该怎么办呢?最简单的办法是「大就是好,多就是美」,加钱上更多内存,或者分配更大的 Swap 空间(没错,就像我之前有一个 暴力的 32GiB Swapfile)。这当然可以一劳永逸,但:前者无疑会消耗钱包,目前内存条还是一个很大的负担,而且对于笔记本之类,更换的余地也有限;后者虽然守住了钱包,但是白白占去那么大一块空间,而且说不得会影响一些性能。

让我们一起看一下,有没有什么过渡的选项可以缓解这一尴尬的局面,进行一些有限的平衡。

「更快、更高、更强」的 mold

是的,既然是链接器的问题,那么最简单的办法就是换一个。Rust 默认的 linker 选项设定的是 cc,这意味着会利用到 gnu 工具链中的 ld,尽管 gnu 在自由软件领域有着卓越的贡献,但以目前的经验而言,这并不是一个好的现代选择。它的一个有力的竞争者是 llvm 工具链中的 lld 。

而到了今天,我们还有另外一个更加优越的候选人 —— 「mold」,在实际使用中,表现出与 lld 相当、甚至超过的性能,并且使用更少的内存。

该如何与 Rust 工具链结合使用呢,有这么两种方法:

mold -run

采用这种模式,可以帮助我们快速体验 mold ,这得益于内置的拦截机制,可以将指向 ld ,ld.lld ,ld.gold 的命令转向 mold 自身。

# 结合 Make
mold -run make <make-options-if-any>
# 或者针对于 Cargo
mold -run cargo <cargo-options-if-any>

编辑 .cargo/config.toml

添加下面的内容即可,如果是按 sudo make install 安装的,path/to/mold 大概率会指向 /usr/local/bin/mold

[target.x86_64-unknown-linux-gnu]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=/path/to/mold"]

船新的符号修饰方案

符号修饰,或者说 symbol mangling ,是现代计算机程序设计语言的编译器用于解决由于程序实体的名字必须唯一而导致的问题的一种技术。

Rust 目前有一个自己设计符号修饰方案,rust-lang/rfcs#2603,通过启用这一方案,在有重复组件的情况下,会生成更小的符号。

要想启用这一特性,同样有两种方法:

RUSTFLAGS

在目前最新的 Rust nightly 中,可以使用 -C symbol-manging-version=v0 这个 RUSTFLAG ,相对旧一点的版本可能需要使用 -Z symbol-manging-version=v0

RUSTFLAGS="-C symbol-manging-version=v0" cargo

编辑 .cargo/config.toml

添加下面的内容即可,如果报错,请试试 -Z

[target.nightly-x86_64-unknown-linux-gnu]
rustflags = ["-C", "symbol-mangling-version=v0"]

还能做什么?

拆分成更小的单元,让编译每个部分的时候不会太吃力;或者去掉一些笨重的依赖,让它不那么费劲;或者对编译选项进行更多调整,进行针对性优化。

好吧,今天就到这里咯,祝大家都能逃离 OOM ,换上更强悍的机器。


笑死,清理了半天依赖,还剩下不到 900 个。

「十日谈」- 22 年 05 期 - 总第 0005 期

这里是 PsiACE,为你带来关于最近十天关于我的一切(并不)。

开源 & 研习

  • 有做 Databend 中 math 函数的迁移和 parsers 单元测试的重构。
  • 顺便宣布一下 Databend 已经完全用上船新版本的 datavalues 啦。
  • 开源了一个 simd bitvec 的实现 bitsvec,某种程度上能观测到一些优势,但是感觉并没有很好。
  • 仔细看了一下关于构建的问题,感觉目前没有很好的办法去调优。
  • 试着仔细读了一篇关于重配置的论文,满篇推理和证明,把思路搞明白了,细节暂时放过吧。

论文十问的缺陷也很明显,关于实验的两个问题在某些时候或许可以改成关键算法的设计和推理。

娱乐 & 生活

  • 汉堡王为什么每家店的出品差距那么明显啊!!!
  • 佛跳墙真好吃,以后有机会一定要去吃正宗的。
  • 这个迭代离家上班,体验每天两点一线的生活,感觉也挺好的。
  • 失眠,失眠,失眠。零星补一些觉,倒是状态还凑合。
  • 目前还在整理稿子/视频,大概率要下个迭代完成了。

要试着享受工作,热爱生活。

迭代 & 立 flag

  • 争取把 LigaAI 利用起来好好管理日常工作/生活。
  • 重新规划一下理财,以前的思路太分散和臃肿了。
  • 可能需要一个系统的学习路径去改善一下当前的学习模式。

QAQ,咱就是说,一整个完蛋。


那么,新的迭代,请多多指教了。

论文十问

最近有试着在读论文,由于自身积累问题,往往试图跳过其中艰深的部分,不能很好汲取其中的精华。

最近看到沈向洋老师的 “论文十问”,觉得很有帮助,现摘抄如下:

论文十问

  • Q1 论文试图解决什么问题?
  • Q2 这是否是一个新的问题?
  • Q3 这篇文章要验证一个什么科学假设?
  • Q4 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?
  • Q5 论文中提到的解决方案之关键是什么?
  • Q6 论文中的实验是如何设计的?
  • Q7 用于定量评估的数据集是什么?代码有没有开源?
  • Q8 论文中的实验及结果有没有很好地支持需要验证的科学假设?
  • Q9 这篇论文到底有什么贡献?
  • Q10 下一步呢?有什么工作可以继续深入?

一点额外说明

  • 需要正确区分问题之间的边界,既要讲出关键,又不能车轱辘话来回滚。

  • 尽量使用原文中的表达,并帮助没有前置知识的读者理解主题。

  • 十答应当能够表达清楚论文的主要工作和贡献。


QAQ,所以说,雨水的这篇论文应该会迟到一两天,并且立春的 learned-cache 大概率要铲掉重做了。