Recently in *nix and Win32 Kernel Category

clang优化器的一个问题

| 1 Comment | No TrackBacks

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

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

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 上的实现,则是这样的:

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;
}

关于闰秒

| 2 Comments | No TrackBacks

phk 老大如此 吐槽

One week until the leap-second. If you haven't tested your IT-system already, it is too late now. Good luck if you're in California or Japan.

背景

关于时间,A core 几年前写过一个 时间是什么? 的系列: 序言 续一 续二 续三

为了兼顾天文观测获得的时间 UT1 (更符合普通人的需要)和由铯-133原子震荡获得的时间 TAI (更稳定),将两者综合一下就获得了协调世界时 UTC。UTC 和 UT1 之间的差距永远保持在 1 秒以内。UTC 中的一秒和 TAI 相同,但 UTC 和 UT1 保持最多一秒的差距,这是通过 IERS 在 UTC 事件中人为插入或减少闰秒这样的人为调整来实现的。从1972年这套系统投入运营到今天为止,总共插入了35个闰秒(2015年6月30日还将再插入一个闰秒)。

闰秒只在每年的6月30日和12月31日的UTC时间 23:59:59 之后插入,表示为当天的 23:59:60。

今天 John-Mark Gurney 修正了一个影响过去4个月左右的 FreeBSD -CURRENT 的随机数发生器问题,具体受影响的版本是 r273872(引入问题)到 r278907 (修正)。

由于问题只影响 -CURRENT,因此我们不会就此发表安全公告。

问题的影响:在对随机数发生器 (/dev/random)进行重构的过程中,原先为内核 arc4random(9) API 进行初始化(seeding)的部分没有正确地在新的随机数处理器上线(randomdev_init_reader)时进行配置,导致内核一直使用 dummy RNG 来生成 arc4random(9) 的种子。由于 dummy RNG 的输出范围有限(大约 2^30),导致 arc4random(9) 的输出容易预测。

由于 arc4random(9) 同时也用来在用户态代码中产生随机数种子,因此这个问题也连带影响了用户态的随机数生成(由于 arc4random(9) 在内核中被广泛使用,因此或多或少地减弱了这个问题的实际影响,但我们建议用户不要因此而产生侥幸心理)。

我们建议使用这些版本的 FreeBSD -CURRENT 的用户 立即 升级到最新的 -CURRENT,同时销毁并重新生成在这段时间内生成的全部私钥。

FreeBSD 10.0-RELEASE

| 5 Comments | No TrackBacks

这是我加入 FreeBSD Release Engineering Team (re@) 之后,我们发布的第一个主要(X.0)版本。

这个版本对整个系统进行了大量的改进。其中的重要变化包括在基本系统中用 clang 取代了 gcc(所有 Tier-1平台)、新增了 unbound(用于取代BIND的部分功能,后者十分复杂,且支持计划经常与 FreeBSD 的发生冲突)、基本系统中提供了转码API iconv(3) (我在2010年指导的 Summer of Code项目)、使用了 PkgNG 包管理工具、BHyVe虚拟机、对于虚拟化支持的大幅改进(virtio(4)以及 Hyper-V支持)、ZFS新增了TRIM支持、ZFS的LZ4完整支持(我在去年新增的功能),等等。

这个版本的发布工程过程将发布日期推迟了总共三次(从2013年11月18日推迟到了2014年1月15日,大约两个月的时间)。我认为有很多需要改进和汲取经验教训的地方。总结如下:

  • 对 KBI 冻结的时间沟通不足:X.0版本涉及 KBI/KPI 冻结,而初期 re@ 对此宣导不够。由此导致后期必须进行某些修改,而 KPI/KBI 冻结的事项实际并未严格实施。
  • 对于测试重点等事项的跟踪需要进行改进:初期测试主要是依赖 re@ 的测试,许多影响比较大的方面未能覆盖到。

由于这些问题,导致在 BETA2 之后增加了两个新的 BETA。RC1之后,开发节奏基本是按照计划进行的,但由于意外情况必须增加RC4(一个非常严重的 VM bug)。而此后又发现了一个 10.x 新引入的安全问题,因此不得不发布 RC5 以便对修正进行更充分的测试。这些延期导致的一项(我认为是好的)副作用是,原定 10.0-RELEASE 之后两周左右发布的一批安全公告的修正内容也在 10.0-RELEASE 之前得到修正和公布。

注意(此处大坑):由于之前 freebsd-update 的 bug (EN-13:04EN-13:05),在更新之前的版本可能无法直接通过二进制方式升级到 FreeBSD 10.0-RELEASE。这些版本的 FreeBSD 应首先用 freebsd-update 升级到 9.2-RELEASE-p2、 9.1-RELEASE-p9、 8.4-RELEASE-p6、 8.3-RELEASE-p13 或更高版本之后再使用 freebsd-update 进行升级。

OpenZFS Developer Summit

| No Comments | No TrackBacks

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

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

分层的 ZFS 存储:希望将 ZFS 改造为能够适应冷热存储的结构,这样可以将冷数据部分固定下来之后脱机(例如置于待机状态),从而节省能源开销。(Nexenta)

对于 spacemap/metaslab 的改良:Delphix 通过 DTrace 观察发现了一系列性能瓶颈并进行优化的实例。这个已经在 Illumos 里了,今天主要是趁热讲解一下所做的改进。比如写带宽限制从原始的限时、限量、加延迟变成了按系统中未回写数据比例作为限制条件、当 I/O 持续到来时自动切换到吞吐量优先(多排任务)的模式、写入速度减慢时减缓接受写请求等的新一代写带宽控制,使得 ZFS 的写入延迟得到了极大的改善。Adam Leventhal (这位老大也是 RAID-Z2/Z3 以及 ZFS gzip 压缩支持的作者)分享了采用的方法、评估手段等等。

明天的活动是 Hackthon,又要起个大早。

dd的一种用法

| No Comments | No TrackBacks

这个方法我最早是在 佐藤 広生第13回 FreeBSD勉強会 上做的 《ZFSの活用とチューニング》 演示幻灯片上看到的,当时没想太明白,而后来想明白了也没记下来。今天想起来了就先记上一笔,备忘。

一般来说,如果有很多不同的资源,那么尽量让不相关的资源同时去完成不同的任务有助于改善系统的利用率并提高吞吐量。而 Unix 上的大部分工具在设计时都是设计成阻塞的,或者说它们很大程度上能够高效地利用一种资源,而在完成一系列相互关联的任务时往往就不那么有效了。

举例来说,发送 ZFS 快照到另外一个网络的服务器上,假定发送 ZFS 快照本身在本地可以以较快的速度持续进行,但带宽比较受限,那么很显然的一个想法便是引入压缩。另一方面,在接收一侧,解压缩之后的数据写盘的速度可能没那么快,而且让压缩程序直接挤牙膏似的吐出数据给 ssh 或者 nc 往往也不能十分有效地利用带宽。在这个场景中,在发送端我们可以看到以下几个任务:

  • 发送 ZFS 快照(很快、产生很多数据)
  • 压缩(较慢、产生较少数据;由于吃满了CPU,因此防止上一环节阻塞的意义不大)
  • 将压缩数据传到对端的机器上(较慢,很可能引起阻塞)

对应的,在接收端我们也可以看到与之对应的任务:

  • 从远端接收数据(较慢,GIGO)
  • 解压缩(较快、产生许多数据)
  • 将 ZFS 快照写盘(略慢,很可能引起阻塞)

在这样一个链条中,如果全部使用标准的 Unix 命令行工具的话,任何一个环节的阻塞都可能会直接向前反馈,从而影响整个系统的吞吐量。很明显,在对方由于任何原因暂时来不及接收数据的时候,压缩操作可以继续进行,这事通过编程不难实现,但实际上我们需要的只是引入两个 dd 进程,即将发送端变成:

  • 发送 ZFS 快照(很快、产生很多数据)
  • 压缩(较慢、产生较少数据;由于吃满了CPU,因此防止上一环节阻塞的意义不大)
  • dd obs=16m
  • dd obs=16m
  • 将压缩数据传到对端的机器上(较慢,很可能引起阻塞)

在新的场景中,接收端的阻塞将导致第二个 dd 的输出阻塞,而此时第一个 dd 仍然可以再吃下 16MB 的数据流(这个 16MB 需要根据具体的应用来调整,原则上它应该大于远端一次阻塞到完全恢复这段时间上游能够产生的数据量)。通过 dd 所做的 reblock,也使发出数据采用较大的块尺寸,从而进一步节省带宽。

警告 刷写硬盘固件时的不当操作可能会导致硬盘无法使用。本人不承担由于使用本文中介绍的内容所导致的任何后果的责任。

上回 说到 谷奥 的一块硬盘坏了,但是忘记说实际上两块硬盘的固件都有已知问题(ST1000DM003-9YN162 固件版本 CC4D,目前的最新版本是 CC4H)。虽然在 ticket 里提到了这件事,但是 remote hand 没做升级,想想之后决定还是自己把它远程刷掉好了。

由于刷写不当会导致硬盘无法使用(实际上还是有办法恢复的,但是比较麻烦而且没法在远程做),因此为了以防万一,在执行任何操作之前应备份硬盘上全部数据。由于使用的是 graid 的镜像模式,因此事实上我们有一份完整备份,故跳过这一步。

接下来要从 Seagate 网站下载固件。考虑到刷新固件操作的危险性,不知道怎么找这个固件的人可以看到这为止了。

从 gmirror 迁移到 graid

| 3 Comments | 1 TrackBack

谷奥 的服务器硬盘坏了,而且托管商很奇怪地用了 gmirror 而不是 BIOS 直接支持的 graid(我厂 Alexander Motin 实现的与 BIOS 兼容的软件 RAID,支持 Intel、Adaptec、JMicron、nVidia、Promise和SiL等多家厂商的软RAID格式),所以趁这个机会给它换掉。记一下迁移的过程。

启动的时候, gmirror 已经 degraded 了(有一个硬盘已经换掉):

% gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada0 (ACTIVE)

检查分区(gpart show),确认磁盘的最后部分没被占用:

% gpart show
=>        63  1953525104  mirror/gm0  MBR  (931G)
          63  1953520002           1  freebsd  [active]  (931G)
  1953520065        5102              - free -  (2.5M)

=>         0  1953520002  mirror/gm0s1  BSD  (931G)
           0    20971520             1  freebsd-ufs  (10G)
    20971520     1048576             2  freebsd-swap  (512M)
    22020096  1931499906             4  freebsd-ufs  (921G)

Intel的元数据格式需要占用磁盘的最后4K。(如果是GPT格式的,处理起来就复杂得多了,但MBR在磁盘最后并不放任何内容,因此可以直接来用)。

修改 fstab 将所有内容指向第一块磁盘: sed -e s,mirror/gm0s1,ada0s1,g /etc/fstab,没问题的话就 sed -i '' 来将修改写回。去掉 loader.conf 中关于 gmirror 的部分,重启系统。

用 gmirror clear 清除掉 ada0 上的元数据信息。由于 / 在 ada0 上面,因此需要先用 sysctl kern.geom.debugflags=16 去掉防护。

# gmirror clear ada0
Can't clear metadata on ada0: Operation not permitted.
gmirror: Not fully done.
# sysctl kern.geom.debugflags=16
kern.geom.debugflags: 0 -> 16
# gmirror clear ada0
#

下面是在 ada0 上建立 mirror。

# graid label Intel gm0 RAID1 ada0 NONE
Intel-9b7e50e1 created

修改 fstab: sed -i '' -e s,ada0s1,raid/r0s1,g /etc/fstab,重启(这里 r0 是因为是第一个设备)。这步做完之后,gpart 输出变为:

% graid status
   Name    Status  Components
raid/r0  DEGRADED  ada0 (ACTIVE (ACTIVE))
                   ada1 (ACTIVE (REBUILD 56%))
delphij@messenger:/home/delphij % gpart show
=>        63  1953525097  raid/r0  MBR  (931G)
          63  1953520002        1  freebsd  [active]  (931G)
  1953520065        5095           - free -  (2.5M)

=>         0  1953520002  raid/r0s1  BSD  (931G)
           0    20971520          1  freebsd-ufs  (10G)
    20971520     1048576          2  freebsd-swap  (512M)
    22020096  1931499906          4  freebsd-ufs  (921G)

将换上的新硬盘加入到 mirror 阵列中:

# graid insert raid/r0 ada1
(9.1-RELEASE 不能这样用;9.2 经过改进已经可以了。9.1上用: graid insert Intel-9b7e50e1 ada1)

剩下的事情就是等 graid 重建 mirror。如果机器不太忙的话这个过程不会需要太久(因为是顺序读写)。如果这个过程被打断,下次启动会从断点恢复。

FreeBSD基金会2012年终募捐

| 2 Comments | No TrackBacks

截止到目前为止, FreeBSD 基金会共募得本年度捐款 $461,119,距本年度的预定目标 $500,000 还差 $38,881 美元。今年 FreeBSD 基金会资助了相当多的项目,包括 Pawel Jakub Dawidek (pjd@) 的 Capsicum 框架、分布式审计服务 auditstd、与我厂一起资助了 Bjoern Zeeb (bz@) 对 FreeBSD IPv6 协议栈的性能剖析、Edward Tomasz Napierala (trasz@) 的在线 UFS 扩容,作为中介机构接受了 Semihalf 的 NAND 闪存文件系统和存储棧,并资助了与此相关的移植工作。此外,FreeBSD 基金会也资助了全球范围内与 FreeBSD 开发有关的一系列会议,包括欧洲的 EuroBSDCon、亚洲的 AsiaBSDCon、加州 MeetBSD、加拿大 BSDCan、澳大利亚的 BSDDay 等,并在硅谷和剑桥大学分别举行了 Vendor Summit 和 Developer Summit。

FreeBSD 基金会每年会增加 10% 到 25% 的资金投入,这些投资的成长离不开广大 FreeBSD 用户和开发人员对于基金会的直接资助支持。作为符合美国税法 501(c)3 条款的公益非盈利慈善法人,在美国境内的捐款人通常都可获得全额联邦应税收入抵免。

捐款网址: http://www.freebsdfoundation.org/donate/

其他信息请参见 捐款将用来做什么基金会2012年12月公告如何申请资助基金会财报

MeetBSD CA 2012流水账

| 1 Comment | No TrackBacks

昨天是会前的开发人员峰会,参加的人基本都是 src/ committer。我参加的讨论是 安装、虚拟化和存储。关于安装程序,目前基本的共识是 bsdinstall 需要重做(基本上 bsdinstall 是个 drive-by commit,作者现在态度是管杀不管埋,bug很多),而先前 Devin Teske 所做的 bsdconfig (目前未接入 world 联编,试了一下太 XX 复杂和强大了)和 DruidBSD 有很多东西可以添到安装程序中,而一票 committer 也已经为他撑腰,所以应该问题不会太大。

虚拟化方面,主要讨论了目前的现状。 Yahoo 在这方面做了一些工作,并将继续跟进。Sean Bruno 大致介绍了目前可用的驱动,NetApp 的开发人员着重介绍了他们的 BHyVe 的成果(普遍的意见是这些成果应尽快合并进 -CURRENT 主线)。此外, NetApp 和我们还讨论了关于微软 HyperV 支持的合并问题,目前微软的 HyperV 代码已经较为成熟,但合并还有一些非技术问题需要解决。

存储方面,讨论了目前遇到的一些问题。我同时处理了一个 mfi(4) 在操作超过 2TB 容量硬盘时的数据损坏问题,不过,这个修正已经来不及合并到 9.1-RELEASE 了,目前的想法是通过 Errata 方式先列出,等过一段时间以二进制更新的形式同代码一起发布。

今天是 MeetBSD CA 2012 的第一天。早上第一段是 NetBSD 的 David Maxwell 主持的讨论,实际的技术讨论不多。之后 Adrian Chadd 介绍了近期 FreeBSD 嵌入式方面的发展,目前 ARM 已经有了类似 x86 的通用内核(主要是 Warner Losh 的成果),并推荐大家尝试 Raspberry Pi。MIPS 方面,新加入的一批 committer 也有了相当多的成果,其中, zRouter 是 D-Link 的 Aleksandr Rybalko 主持的项目,目前已经支持多种无线路由器,等等。目前的问题是基本系统中仍有很多可以优化的空间,而高通 Atheros 也会继续支持相关的开发活动,包括 FreeBSD 的 wifi 支持。

Kris Moore 介绍了昨天讨论过的安装程序等的相关话题。下午, Sean Bruno 演示了使用 qemu 来进行内核开发的方法,除了 x86 之外, qemu 也可以模拟 ARM、MIPS 等硬件,除了硬件驱动之外,用 qemu 可以节省很多时间,此外,qemu 的许多设施也可以用来调试虚拟化所需的加速驱动。

Scott Long 这次又拿来了 Netflix 的 CDN 服务器。这是基于 BackBlaze 的机箱设计改良的 4U 服务器,64GB内存,36块硬盘(SATA),2-6块SSD,并配有2-4个万兆网口。采用的软件是 FreeBSD 9-STABLE、nginx、BIRD BGP服务等。Netflix 在运营过程中遇到和解决了 FreeBSD 中的一些可伸缩性的问题,目前已经可以做到单台服务器、2个万兆网口支持 12000 到 20000 个并发连接,跑到 18Gbps 的流量。

我厂的 Josh Paetzel 介绍了 FreeNAS 和 TrueNAS 产品;Michael Dexter 演示了 BHyVe,最后 Mark Linimon 介绍了最近一年 Ports Collection 的进展。

FreeBSD 9.1-RC3

| No Comments | No TrackBacks

总算是 命名了......现在 re@ 已经开始拒绝所有的变动请求,包括前几天的 High Point Technologies 驱动更新。不出意外的话,两周之内应该会正式 release 了。

LSI SAS HBA固件

| 5 Comments | No TrackBacks

最近我厂对 LSI 6Gb/s SAS HBA 的驱动 (mps(4)) 进行了改进,令其可以在 FreeBSD 环境中进行固件刷写操作。目前最新的固件版本是 14,这个版本修正了目前已知的全部问题。

以前一直没有太注意,这类 HBA 卡上可以用两种固件。一种是 IT (initiator target) 固件,这类固件只提供HBA功能;另一种是 IR (integrated RAID) 固件,这类固件提供集成 RAID 功能。对于我们的应用来说,显然希望用 IT 固件,因为它的代码量要少得多,而由于减少了包含校验的冗余,卡本身的 RAID 功能在 ZFS 环境多数情况下都是有害的。

LSI 的 HBA 设计与 nanoBSD 类似,其运行环境和卡上的版本是分离的,也就是说可以进行热替,并以稍后重启的方式让固件生效,而不需要进入单用户模式或停止磁盘访问等等。

注意:在线将 IT 改换成 IR 固件,或将 IR 固件改换为 IT 固件的方法未经测试,最好是在 DOS 中进行。(其中 sas2flash -o -e 6 这部操作会对总线做一次复位,因此有相当的风险)。多数主板集成的 LSI 控制器是 IR 模式的固件,在升级时应特别注意。

Monthly Archives

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.2.11