Performance

共 105 篇文章。

改善大量重复内容文件的 tarball 压缩效率

• Cheatsheets

有时,我们会希望分发包含大量重复文件的 tarball。绝大多数情况下,tarball 都会进行压缩,进行适当的预处理有助于显著地提高压缩效率。

数据压缩的基本原理是利用数据中的冗余,通过更短的编码或规则表示重复或可预测的内容,从而减少存储或传输所需的空间。简单的例子中,比如连续重复的字符「AAAAAA」可以表达为「6A」,然而,当重复数据分布在较长范围内时,压缩算法很难直接发现和利用这些远距离的关联,因为需要额外记录位置或匹配信息,这种匹配开销很大,做的话会严重影响压缩速度并且可能收益不高。对于文本文件来说,其中的许多内容会高频率地出现,而如果一个 tarball中包括数个内容一样的大型二进制文件,压缩算法很难有效地检测并对他们进行正确的处理。

阅读全文… ( 本文约 664 字,阅读大致需要 2 分钟 )

FreeBSD 上的 nginx kTLS 支持

• Security

昨天,FreeBSD 13.2 正式发布了。kTLS 是在 FreeBSD 13.0 中由 Netflix 赞助的新功能,过去,TLS/SSL 应用程序对于通讯内容的加解密通常是在用户态进行的,这样一来,系统在读取出数据和发出数据之前需要进行额外的上下文切换,并在内核和用户地址空间之间来回复制缓冲区来满足加解密的需要。有了 kTLS 之后,内核可以在 sendfile(2) 时直接在内核上下文中完成加密和填充到网络协议栈的操作,从而减少了上下文切换和不必要的复制操作。

阅读全文… ( 本文约 836 字,阅读大致需要 2 分钟 )

记录一下之前对 fsck_msdosfs(8) 的改进

• Development

疫情之前,娃在周末会去某个才艺班,上课的时间我觉得实在是比较无聊,于是就带上笔记本坐在星巴克做一些较小规模的代码清理工作。最终,我利用这些碎块化的时间完成了对 FreeBSD 的 fsck_msdosfs(8) 的核心代码的算法进行了改进,使其需要的内存用量变成了原先的 11281 \over 128,这里稍微记一下当时的一些思路。

阅读全文… ( 本文约 3396 字,阅读大致需要 7 分钟 )

clang优化器的一个问题

• Development

📜 历史文件已不具备现实意义

今天的一个偶然的发现。FreeBSD clang version 3.6.1 (tags/RELEASE_361/final 237755) 20150525。clang 3.8 2015/07/20 的版本同样有此问题。

之前, FreeBSD 上 strndup(3) 的实现是这样的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
char *
strndup(const char *str, size_t n)
{
	size_t len;
	char *copy;

	len = strnlen(str, n);
	if ((copy = malloc(len + 1)) == NULL)
		return (NULL);
	memcpy(copy, str, len);
	copy[len] = '\0';
	return (copy);
}

而 OpenBSD 上的实现,则是这样的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
char *
strndup(const char *str, size_t maxlen)
{
	char *copy;
	size_t len;

	len = strnlen(str, maxlen);
	copy = malloc(len + 1);
	if (copy != NULL) {
		(void)memcpy(copy, str, len);
		copy[len] = '\0';
	}

	return copy;
}
阅读全文… ( 本文约 304 字,阅读大致需要 1 分钟 )

OpenZFS Developer Summit

• Kernel

今天去 San Francisco 的 Delphix 参加了 OpenZFS Developer Summit,今天这会太充实了,先记一笔。

ZFS Channel Program:目前的 ZFS 应用程序需要以多次系统调用来完成一项功能。为了实现原子性,用户态部分实现起来比较复杂,而且最终内核中的 sync task 可能会导致长时间的延迟。提出的解决方案是在 ZFS 内核部分引入一个 Lua 字节码解释器,用户态一次灌一个脚本进去,通过脚本逻辑实现原子性,从而减少上下文切换开销并极大地简化用户态部分。

阅读全文… ( 本文约 496 字,阅读大致需要 1 分钟 )

svn checkout的打包测试

• Development

📜 历史文件已不具备现实意义

FreeBSD 已经不再用 subversion 了。

今天有一位用户发信给 Release Engineering Team,要求在发行版中提供源代码的 svn checkout 工作副本,以便直接使用。我觉得这是个好主意,因为这样可以用更便宜的 FTP 流量来代替 svn 流量;不过,由于 re@ 内部有人担心这样会让光盘映像继续膨胀,因此我做了些测试来评估这样做的影响。

总共做了 7 个试验。

阅读全文… ( 本文约 705 字,阅读大致需要 2 分钟 )

启用 SPDY

• Networking

之前 Frank 同学提到了这个问题,所以今天花了些时间来配置。 nginx 对 SPDY 的支持是一项比较新的特性,只有在 1.3.x 版本以上才支持。FreeBSD 的 nginx-devel 默认并不启用 SPDY,需要在 make config 的阶段启用。

阅读全文… ( 本文约 131 字,阅读大致需要 1 分钟 )

nginx的https压缩

• Security

官方版本的 nginx 在 https 的时候是不对流量做压缩的,具体原因在这里 和 这里 有解释,它会增加半兆的连接内存开销。

启用 https 压缩除了需要 nginx 本身做少量修改(例如去掉 if[n]def SSL_OP_NO_COMPRESSION 部分的语句块)之外,还需要 OpenSSL 本身编译了加密支持。FreeBSD ports 的 security/openssl 预设启用了 ZLIB 扩展,但基本系统目前没有(由于 zlib 是很大的一片代码,也许需要做了 Capsicum 处理之后才可以放进来用)。

阅读全文… ( 本文约 286 字,阅读大致需要 1 分钟 )

FreeBSD 的 strlen(3)

• Kernel

之前只有一篇关于较早版本的 strlen(3) 实现的笔记,这里补上我在 2010 年做的新增改进。

与 Pascal 等语言不同,C 的字符串并不保存串的长度,而是在字符串末尾以 nul 字符(’\0’)来表示字符串结束。这个设计决策是上世纪 60 年代作出的,有都市传说是为了省几个字节的空间,不过我个人认为也可能是因为汇编里面到处都是判断是否碰到了 0 的操作。不管怎么说,这个设计令 strlen 变成了一个 O(n) 的操作。

阅读全文… ( 本文约 1364 字,阅读大致需要 3 分钟 )