FreeBSD

嚷一嗓子

| Life | #FreeBSD | #forum | #moderator | #community

intron 因任满卸任,现水木社区的 FreeBSD 版需要一名版主。哪位去申请一下?

参与评论

针对桌面系统的一个ULE调度器tunable

在 /etc/sysctl.conf 中加入:

kern.sched.preempt_thresh=224

然后用 /etc/rc.d/sysctl start 或重启系统令其生效。

系统默认的值是 80,表示只有新优先级 < 80 时才允许抢占;224 表示非空闲线程均可以进行抢占。这样做的结果是系统会产生更多的切换,从而改善响应时间(牺牲吞吐量)。对桌面系统来说,这种设置是很有用的。

参与评论

ZFS dedup初步测试

最近做一个存储的项目,顺手在家测试了一下实际数据的dedup。操作系统是 FreeBSD 8.2 配合一组总共大约3MB的patch来跑ZFS v28,硬件是 Atom D510 配合 4G 内存。

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

折腾了一下 neptune 上的 ZFS

我一直是非常反对重装系统的。从技术上说,今天的折腾并不算是重装系统,不过因为把机器上所有的数据(是的,文件系统全部都拆掉重建了)都重写了一遍,所以还是算做了一次吧。

缘起

在采购 家里的路由器 的时候,选择了 WDAV-25【1】 系列硬盘。我选的那款硬盘使用的是新式的 AF (4kiB扇区)格式。

FreeBSD 使用的主流文件系统 UFS 和 ZFS,以及 ahci(4) 驱动都 直接支持 4kiB 扇区。但是,目前市面上的AF硬盘,为了与先前的 BIOS 和操作系统(主要是 Windows XP)兼容,对于 ATA IDENTIFY 的回应,原先返回扇区尺寸的位置变成了逻辑扇区尺寸,这种做法俗称512e,即硬盘通过固件或其他方式模拟山区尺寸为512字节,并处理相关的回写操作。

以512字节为单位进行读写时,在AF格式的硬盘上是低效的。FreeBSD的 ahci(4) 驱动和对应的 ada(4) 驱动会设置 stripesize 以反映驱动器采用的实际物理扇区尺寸,但文件系统并不直接识别这个尺寸。

对于 ZFS 而言,其扇区尺寸是在创建时以 ashift 值写死的,目前在命令行没有办法指定这个值,也不能在创建 ZFS 之后修改。如果修改内核令其使用 GEOM 的 stripesize 来产生 ashift,对 AF 硬盘则会出现内核得到的 ashift 比先前已经存在的 ashift 大,从而导致 ZFS 无法识别的问题(如果创建 ZFS 时已经使用了更大的 ashift 则没有关系)。因此,必须想办法让 ZFS 在创建时就知道扇区尺寸是 4KiB。

FreeBSD 5.3-RELEASE 时新增了一个调试用的 GEOM class —- gnop。可以用它来封装其他 GEOM 对象,并改变扇区尺寸,方法是 gnop create -S 4096 /dev/gpt/store (此处 /dev/gpt/store 是一个按 4k 对齐的 GPT 分区的 label)。gnop会产生一个新的设备节点,/dev/gpt/store.nop,其向系统汇报的扇区尺寸是我们指定的 4096 字节,而不是驱动器汇报的逻辑扇区尺寸 512 字节。

使用这个设备节点创建的 ZFS 就会采用正确的 ashift 值了。

使用 zdb -C pool名字可以检查 ashift 值:对于扇区尺寸为 512 字节的 zpool,其 ashift 是 9,而我们希望的 ashift 值是12。

gnop节点在系统重启以后会消失,但 ZFS 会记住 ashift,因此并不会导致问题。此处也可以 zpool export,gnop destroy /dev/gpt/store.nop 然后再 zpool import 来验证。

经测试,ZFS在知道正确的扇区尺寸以后,持续写操作的性能可以提高至少一倍。

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

在远程FreeBSD服务器上运行VirtualBox

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

现时提倡的安装方式为 pkg,本文并未对此进行更新。

VirtualBox可以在远程运行,并把界面通过 ssh 的 X11 转发放到管理员的桌面。

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

基于 Supermicro X7SPA-H (Atom D510) 的路由器(3)

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

本文介绍的是已经停产的硬件,内容已过时。

之前家里用的那个 Linksys WRT310N 路由器就有相当严重的问题(不排除是DD-WRT的问题),如果连续若干天不重启的话,无线网络的连接有时就会失败。部署新的路由器之后,设置了一个cron任务令其每天早上5:30重启:

30 5 * * * /usr/bin/ssh root@10.253.87.254 reboot > /dev/null 2>&1

当然,执行cron的那个用户需要使用ssh key来登录WRT310N,并事先将key传到WRT310N上面。

由于 FreeBSD 默认会对链路状态的变化进行记录,因此只要查看系统日志就可以知道cron是否真的执行了。

在之前的部分我们讨论过关于功耗的问题。在实际使用过程中,我发现 powerd(8) 对于 CPU 占用的计算是有问题的:它计算的是所有CPU的占用率之和,而比较合理的依据则是占用率最高的CPU的占用率。不过,对 Atom 来说 powerd 能够产生的影响有限,因此如果真在使用Atom系统的话不一定真的需要这个patch。下面这个patch可以让 powerd 更有效地 throttle CPU 的频率:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Index: usr.sbin/powerd/powerd.c
===================================================================
--- usr.sbin/powerd/powerd.c    (revision 213306)
+++ usr.sbin/powerd/powerd.c    (working copy)
@@ -127,6 +127,7 @@
 {
        static long *cp_times = NULL, *cp_times_old = NULL;
        static int ncpus = 0;
+       int newload;
        size_t cp_times_len;
        int error, cpu, i, total;

@@ -151,7 +152,7 @@
                return (error);

        if (load) {
-               *load = 0;
+               *load = newload = 0;
                for (cpu = 0; cpu < ncpus; cpu++) {
                        total = 0;
                        for (i = 0; i < CPUSTATES; i++) {
@@ -160,8 +161,10 @@
                        }
                        if (total == 0)
                                continue;
-                       *load += 100 - (cp_times[cpu * CPUSTATES + CP_IDLE] -
+                       newload = 100 - (cp_times[cpu * CPUSTATES + CP_IDLE] -
                            cp_times_old[cpu * CPUSTATES + CP_IDLE]) * 100 / total;
+                       if (*load < newload)
+                               *load = newload;
                }
        }

对路由器这样的设备来说,当有软件 bug 的时候,我们往往希望系统自己恢复并报告问题,而不是等待用户去用调试器现场调试。想要达到这个目的,可以使用 watchdog 机制。在这款主板上有两个 watchdog,其中系统没有自带的那个 Winbond watchdog 的驱动如下:

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

基于 Supermicro X7SPA-H (Atom D510) 的路由器(2)

续前。

除了硬件上直接采用的降噪措施之外,一些软件方面的配置也可以提高其效果。

首先是BIOS中的配置。风扇转速最低可调整为"Energy Saving"(即使用30%的频率)。启用Active Power State之后,可节省大约2W左右的耗电(这个选项的默认值是Disabled)。

然后是FreeBSD本身的配置。我个人采用的配置包括:

上述设置,除了ahci部分之外,可将系统闲置时的功耗降低到17W左右。

以下是实现中采用的loader.conf相关的部分:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

hint.apic.0.clock=0
hint.atrtc.0.clock=0
hw.pci.do_power_nodriver=3
hint.ahcich.0.pm_level=5
hint.ahcich.1.pm_level=5
hint.ahcich.2.pm_level=5
hint.ahcich.3.pm_level=5
hint.ahcich.4.pm_level=5
hint.ahcich.5.pm_level=5
阅读全文…( 本文约 4499 字,阅读大致需要 9 分钟 )

FreeBSD的textdump

最近遇到一些奇怪的bug,因为是对恢复时间有比较高要求的系统,所以顺便研究了一下用FreeBSD的textdump来代替更早前出现的minidump的方法。

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

基于 Supermicro X7SPA-H (Atom D510) 的路由器(1)

| Life | #Supermicro | #X7SPA-H | #router | #FreeBSD | #hardware | #ZFS

最近找时间做了一个家用的路由器。用基于 Intel Atom 处理器的解决方案并不便宜(与传统的嵌入式解决方案相比),但因为软硬件都是 x86,因此开发起来会方便一些。另一方面,Atom的计算性能要远高于其他的传统嵌入式方案。

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

RTC 与 NTP

| Kernel | #FreeBSD | #ntp

早期版本的 FreeBSD 有一个问题是,如果使用 ntpd 来校准系统时钟的话,如果长期开机,则在重启之后,时间会差很远,之前一直没仔细研究这个问题。最近突然发现 FreeBSD 8.1-RELEASE 里面没有这个问题了,于是翻看了一下代码和之前的一些邮件才明白是怎么回事,总结一下:

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