Notes on Software Engineering at Google (1)

前言:这本书看的断断续续的,如果不留点笔记可能很快就忘了,所以还是要记录一下。本书作者免费发布 pdf 版本,可以在 Software Engineering at Google (一下可能简称为 SWE)免费下载。因为是个笔记,所以行文可能逻辑比较断裂。 什么是软件工程 Nothing is built on stone; all is built on sand, but we must build as if the sand were stone. —Jorge Luis Borges 第一部分主要是在讲软件工程的定义,Software Enginner (以下可能简称为 SE)与 Programming 的区别。 最核心的一个想法是,你的代码的生命周期是多久?Google 的新项目往往默认项目会存在十年——这样一来,基础组件升级、依赖变化、团队组成都可能会变化,从而最终影响决策、影响设计。 这一点上国内很多项目肉眼可见的做的不好,最典型的莫过于百度的博客。当然这不意味着个 Google 的产品做得多好,但是这个思维方式确实很有用。当你设计的时候想的是要用十年,很多设计和决策就就和短期项目完全不同了。 我猜可能有很多人会有不同意见,比如像下面这个图里的例子 我觉得也并非不可调和,业务驱动的产品,很多时候就是需要快速试错,上线一个 demo 能用就行——这种情况就是定位为 demo,定位为 programming 就好了。另一方面,这也和从业人员对 SE 了解太少,公司无法做到将 SE 融入到日常有关,如果 […]

Network Tracing Hands on

eBPF 提问:以下哪个内核可以运行 ebpf? ZStack C74 ZStack C76 CentOS 7.7 ZStack experimental repo 中的内核 (分别对应了 3.10.0-693 3.10.0-957 3.10.0-1062 4.18.0-240) 答案:有三个内核可以支持 C74 是不支持的,C76 有有限的支持,C77 支持程度更好一点,experimental kernel 里是 4.18.0,对 ebpf 支持已经很完善(当然了,ebpf 还处于快速发展阶段,因此还是版本越高越完善) https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/7.6_release_notes/index#technology_previews_kernel https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/7.7_release_notes/new_features#enhancement_kernel 检查自己安装的内核: grubby –info=ALL 在 ZStack 管理的计算节点上安装来自 experimental 的 4.18 内核: yum –disablerepo=\* –enablerepo=zstack-experimental-mn install kernel-4.18.0 在 ZStack 管理节点上安装来自 experimental 的 4.18 内核: yum –disablerepo=\* –enablerepo=zstack-experimental-mn install […]

SOSP 19′ 文件系统是否适合做分布式文件系统的后端——Ceph 的十年经验总结

过去十年里,Ceph 一直是在本地文件系统的基础上实现。这个是目前大部分分布式文件系统的选择,因为这样可以利用这些实际环境验证过的代码。然而,Ceph 的经验告诉我们这么做也是有代价的——首先,实现一个零开销的事务机制会很困难;其次,本地的元数据性能会极大影响分布式系统;第三支持新的存储硬件会变得很慢。 Ceph 通过一个新存储后端 BlueStore 来解决这些问题,BlueStore 设计为直接在块设备上运行。在其面世的短短两年里,BlueStore 已经被 70% 的生产客户所采用。通过运行在用户态和对 IO 栈的完全控制,BlueStore 实现了高效的元数据空间和数据校验、EC 数据快速覆写、在线压缩、减少了性能的波动而且避免了一系列本地文件系统的隐患(pitfalls)。最后,通过 BlueStore 还让支持一些原本不支持的存储硬件成为可能。 介绍 后端存储采用文件系统的好处: 无需自行解决数据持久和块分配的问题 提供熟悉的 POSIX 接口和抽象(文件、目录) 可以使用ls、find这些常用工具来管理 Ceph 开发 BlueStore 几个主要原因: 难以在现有文件系统上实现高效的事务操作。 现有的实现要么有很高的性能损失、要么功能有限、要么接口或实现过于复杂,总之都没有直接集成到文件系统里。 Ceph 使用用户态的 WAL 来实现,或者一个支持事务的 KV 存储,但性能都不能满意 本地文件系统的元数据性能极大影响分布式层。具体来说,Ceph 需要快速枚举(enumerate)有几百万条目的目录,但 Btrfs 和 XFS 都支持的不够好;如果拆分目录(directory splitting )来减小一个目录内的文件数量,这个操作在文件系统上有成本极大,会拖垮整个系统的性能 因为文件系统本身的过于成熟,会导致它对新存储硬件的支持非常慢。例如用来解决 HDD 容量问题的 SMR,用来解决 SSD 的 FTL 层性能损失的 ZSS SSD 都难以支持 […]

Copy hostname from chrome address bar rather than whole url

I often copy hostname from chrome address bar to shell, but it always with some prefix like “http://” . Search “chrome copy without http” in Google and you will 208,000,000 results, there is a bug reported in tracker but status is “Won’t fix”. Luckily some body developed this extension: https://chrome.google.com/webstore/detail/hostcopy/ebnjnkfienhcidbgmifkjkkidheihcpj there are some others has […]

colored tail -f with /var/log/messages

Vim has beautiful color profile for messages: But I usually use tail -f to monitor my logs, while it can not use vim color profile, so I installed grc. Clone and run ./install.sh, try grc tail -f /var/log/messages and you will see: Oh, that’s not what I want. Luckily grc can easyly customize profile, so […]

libvirt virEventRegisterDefaultImpl fd leak

show code: import os import libvirt libvirt.virEventRegisterDefaultImpl() def openclose(): c = libvirt.open(‘qemu:///system’) c.close() os.system(‘lsof -p %d | wc -l’ % os.getpid()) for i in xrange(100): openclose() os.system(‘lsof -p %d | wc -l’ % os.getpid()) explain: https://www.redhat.com/archives/libvir-list/2013-September/msg00118.html

pyroute2 is not so fast

接上篇。 由于发现了 subprocess.popen() 的线程泄露问题,我们对这个调用加了线程锁,最简单的绕过这个问题,与此同时我将一些频繁调用的地方从 bash 调用改成 linux 系统调用(比如直接使用 read,而避免 bash 调用 cat),在很多场景有了不错的性能提升。 于是我怀疑 kvmagent 的一些性能问题和我们的 bash 的有些滥用有关系,我们知道 pyroute2 是直接调用 netlink 的,因此我做了这个测试: 可以看到 read 最快,bash+cat 次之,pyroute 居然最慢。 考虑到 pyroute 可能初始化的 workload 更大,我们可以试试先初始化好 import 和必要的初始化工作: so, pyroute2 is not so fast.

subprocess.popen() is not thread safe

这几天陆续一直在调查生产环境一个调用会随着时间的推移变得越来越慢的问题。 从好几个角度尝试解决,怀疑点众多,目前认为是 python 2.7 subprocess 的 bug,参考这里: https://stackoverflow.com/questions/21194380/is-subprocess-popen-not-thread-safe 和这里: https://github.com/google/python-subprocess32

devconf 19′: virtio 硬件加速

前言 devconf 也是我比较关注的一个 summit,devconf 的内容当然比较偏实践,但有一些东西还是比较前沿的。 很多人会认为 virtio 是一套实现(virtio-net, virtio-blk 等等),但实际上 virtio 是一套标准(或者说抽象层),因为 virtio 通过半虚拟化的方式来加速虚拟化的性能,那么就需要 hypervisor 和 guest 的协作来达到目的,其中 hypervisor 端我们称为 backend driver,guest 端称为 frontend driver。 virtio 的具体介绍在 developer works 有一篇很好的文章,如果对 virtio 不了解的话可以参考这篇: https://www.ibm.com/developerworks/cn/linux/l-virtio/index.html,进一步的,还可以阅读 Rusty 写的原论文:https://www.ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf 这里简单介绍一下 virtio 的基本架构,就是下面这张图: 可以看到 IO 的核心就是 virtqueue,virtqueue 定义了 add_buf、get_buf、kick 等几个关键 IO 接口。 virtio 刚提出时其实是很先进的,因为通过共享内存替代了完整的 trap/模拟过程,大大提升了性能,但是随着底层 IO 设备性能的越来越强,大家对 virtio 也逐渐提出了更高的要求,例如通过 vhost […]

Eurosys 19′ Notes:Ursa: Hybrid Block Storage for Cloud-Scale Virtual Disks

Ursa 是美团云 16 就发布过的面向 IaaS 云主机的块存储系统,目前 Ursa 主要有几篇公开文章讨论其架构: 最早:https://tech.meituan.com/2016/03/11/block-store.html 介绍了 motivation、和其他块存储的比较 17 年在知乎专栏发表了基于混合存储的效率优化,和这次 Eurosys 19′ 内容相关:https://zhuanlan.zhihu.com/p/27695512 17 年还有一篇 USENIX 17′ 的文章:https://tech.meituan.com/2017/05/19/speculative-partial-writes-erasure-coded-systems.html 介绍了对 EC 的优化 下面介绍这篇文章,原文地址:https://www.cs.jhu.edu/~huang/paper/ursa-eurosys19.pdf or https://dl.acm.org/citation.cfm?id=3303967 简介 通过追踪块存储的 IO pattern 可以发现其 IO 的 locality 很差,因此相对于使用 SSD 作为 cache layer,Ursa 选择了底层直接使用 SSD-HDD 混布方案,将主副本放在 SSD 上,备副本放在 HDD 上,通过 Journal 来弥补 SSD 和 HDD 之间的性能差距。实验显示之中模式在大部分情况下可以达到与全 SSD 相同的性能,与全 […]