基于 Supermicro X7SPA-H (Atom D510) 的路由器(2)
续前。
除了硬件上直接采用的降噪措施之外,一些软件方面的配置也可以提高其效果。
首先是BIOS中的配置。风扇转速最低可调整为"Energy Saving"(即使用30%的频率)。启用Active Power State之后,可节省大约2W左右的耗电(这个选项的默认值是Disabled)。
然后是FreeBSD本身的配置。我个人采用的配置包括:
- 禁用硬盘的APM。WD的这款硬盘默认的APM值为128,这样它每隔大约10秒没有操作时就会将磁盘转速降低。这类操作对磁盘的寿命有一定影响(一般来说磁盘的机械部分支持10万到20万次这样的操作),因此可将其设为254;
- 启用磁盘的AAM。这个配置的好处是让磁盘控制其磁头臂的加速度,其效果是减少噪音,并且有一定的节能效果。注意:实际测试显示这个设置产生的节能效果基本上可以忽略不计,并且会稍微降低一些性能。磁盘的AAM数值设置为128(默认为254);
- 将经常写的日志放到 /tmp (使用tmpfs);
- 将收集entropy(随机数种子)的频率由每11分钟一次降低到每天一次;
- 启用 AHCI 磁盘驱动;将ahci通道的pm_level全部设置为5(设备在闲置125ms之后可申请通道链路进入SLUMBER模式)
- 禁用APIC时钟。
- 禁用AT RTC时钟。
- 对于没有驱动的PCI设备,将其置入D3模式(停电)。
上述设置,除了ahci部分之外,可将系统闲置时的功耗降低到17W左右。
以下是实现中采用的loader.conf相关的部分:
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
在引导系统时,root crontab使用下面的配置:
将APM设为254。注意,每个硬盘都需要:
@reboot /sbin/camcontrol cmd ada0 -a "EF 05 00 00 00 00 00 00 00 00 FE 00"
将APM设为254。注意,每个硬盘都需要:
@reboot /sbin/camcontrol cmd ada0 -a "EF 42 00 00 00 00 00 00 00 00 80 00"
禁止硬盘自行idle;并不真的需要这个设置,它是预防性的:
@reboot /sbin/camcontrol idle ada0 -t 0
在 /etc/rc.conf 中启用一部分节能基础设施:
powerd_flags="-a hadp -b hadp -n hadp -i 25 -p 1500"
说明:hadp是默认的配置,实际并不需要;-p 1500表示将采样时间从250ms提高到1500ms,这可以减少powerd本身由于采样操作带来的CPU开销(我对powerd进行了少量改动以使其使用正确的CPU占用比例,系统自带的powerd目前采用的是CPU的占用比例总和,其采样值会比应该使用的值高CPU个数倍),-i 25表示将默认的idle阈值由50%降低为25%,这可以在一定程度上弥补由于减少采样速率导致对突发CPU需求响应变慢的不足。
X7SPA-H主板包含两个watchdog,一个是ICH9R芯片组内建的,另一个是 Winbond W83627DGH-P Super I/O 控制器内建的。在 BIOS 中打开 Watchdog 时启用的是后一个 watchdog。如果在 BIOS 交权后5分钟操作系统仍然没有去安抚watchdog,则硬件会直接对系统进行复位。
FreeBSD目前并没有包含 Winbond W83627 系列watchdog的驱动,我自己写了一个来支持它。在调试过程中发现,似乎没有有效的办法来判断其是否存在,故退而求其次改为检测芯片的revision来判断其存在。注意:这样做是有一定的风险的(读端口仍然可能触发不同硬件的动作)。
写好驱动并加入内核以后,在 /etc/rc.conf 中加入:
watchdogd_enable="YES"
watchdogd_flags="-s 4 -t 32"
这里还是同样的路子:尽可能减少不必要的上下文切换。每4秒安抚一次狗,同时将其触发点设为32秒。这样,当内核停止响应28-32秒的时候硬件便会自动复位。
这些设置可以提高系统在出现问题时自动恢复的机会。
由于Atom的计算能力较差,因此,可以使用计算能力较好的笔记本CPU来代替它来编译,具体方法是将系统的 / 等文件系统通过 NFS 来 export 给局域网的其他机器,在上位机上mount之后chroot进去编译,或者使用 ports 的 DESTDIR 支持,或编译好包之后上去 pkg_add。具体的做法可根据需要决定。
以下是我使用的内核编译配置,仅供参考。
--- GENERIC 2010-09-10 17:37:11.669670139 -0700
+++ NEPTUNE 2010-09-23 03:44:26.018389103 -0700
@@ -1,25 +1,10 @@
#
-# GENERIC -- Generic kernel configuration file for FreeBSD/amd64
+# NEPTUNE -- Customized kernel configuration file for FreeBSD/amd64
#
-# For more information on this file, please read the config(5) manual page,
-# and/or the handbook section on Kernel Configuration Files:
-#
-# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
-#
-# The handbook is also available locally in /usr/share/doc/handbook
-# if you've installed the doc distribution, otherwise always see the
-# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
-# latest information.
-#
-# An exhaustive list of options and more detailed explanations of the
-# device lines is also present in the ../../conf/NOTES and NOTES files.
-# If you are in doubt as to the purpose or necessity of a line, check first
-# in NOTES.
-#
-# $FreeBSD: stable/8/sys/amd64/conf/GENERIC 211171 2010-08-11 07:11:20Z bschmidt $
+# From FreeBSD: stable/8/sys/amd64/conf/GENERIC 211171 2010-08-11 07:11:20Z bschmidt
cpu HAMMER
-ident GENERIC
+ident NEPTUNE
# To statically compile in device wiring instead of /boot/device.hints
#hints "GENERIC.hints" # Default places to look for devices.
@@ -31,34 +16,22 @@ ident GENERIC
# env "GENERIC.env"
makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
+makeoptions CONF_CFLAGS=-fno-builtin #Don't allow use of memcmp, etc.
options SCHED_ULE # ULE scheduler
options PREEMPTION # Enable kernel thread preemption
options INET # InterNETworking
options INET6 # IPv6 communications protocols
options SCTP # Stream Control Transmission Protocol
-options FFS # Berkeley Fast Filesystem
-options SOFTUPDATES # Enable FFS soft updates support
-options UFS_ACL # Support for access control lists
-options UFS_DIRHASH # Improve performance on big directories
-options UFS_GJOURNAL # Enable gjournal-based UFS journaling
-options MD_ROOT # MD is a potential root device
options NFSCLIENT # Network Filesystem Client
options NFSSERVER # Network Filesystem Server
options NFSLOCKD # Network Lock Manager
-options NFS_ROOT # NFS usable as /, requires NFSCLIENT
-options MSDOSFS # MSDOS Filesystem
-options CD9660 # ISO 9660 Filesystem
options PROCFS # Process filesystem (requires PSEUDOFS)
options PSEUDOFS # Pseudo-filesystem framework
options GEOM_PART_GPT # GUID Partition Tables.
options GEOM_LABEL # Provides labelization
-options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty)
options COMPAT_FREEBSD32 # Compatible with i386 binaries
-options COMPAT_FREEBSD4 # Compatible with FreeBSD4
-options COMPAT_FREEBSD5 # Compatible with FreeBSD5
-options COMPAT_FREEBSD6 # Compatible with FreeBSD6
-options COMPAT_FREEBSD7 # Compatible with FreeBSD7
+options COMPAT_FREEBSD7
options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
options KTRACE # ktrace(1) support
options STACK # stack(9) support
@@ -70,11 +43,9 @@ options _KPOSIX_PRIORITY_SCHEDULING # P
options PRINTF_BUFR_SIZE=128 # Prevent printf output being interspersed.
options KBD_INSTALL_CDEV # install a CDEV entry in /dev
options HWPMC_HOOKS # Necessary kernel hooks for hwpmc(4)
-options AUDIT # Security event auditing
-options MAC # TrustedBSD MAC Framework
options FLOWTABLE # per-cpu routing cache
-#options KDTRACE_FRAME # Ensure frames are compiled in
-#options KDTRACE_HOOKS # Kernel DTrace hooks
+options KDTRACE_FRAME # Ensure frames are compiled in
+options KDTRACE_HOOKS # Kernel DTrace hooks
options INCLUDE_CONFIG_FILE # Include this file in kernel
# Make an SMP-capable kernel by default
@@ -87,181 +58,30 @@ device cpufreq
device acpi
device pci
-# Floppy drives
-device fdc
-
-# ATA and ATAPI devices
-device ata
-device atadisk # ATA disk drives
-device ataraid # ATA RAID drives
-device atapicd # ATAPI CDROM drives
-device atapifd # ATAPI floppy drives
-device atapist # ATAPI tape drives
-options ATA_STATIC_ID # Static device numbering
-
# SCSI Controllers
-device ahc # AHA2940 and onboard AIC7xxx devices
-options AHC_REG_PRETTY_PRINT # Print register bitfields in debug
- # output. Adds ~128k to driver.
-device ahd # AHA39320/29320 and onboard AIC79xx devices
-options AHD_REG_PRETTY_PRINT # Print register bitfields in debug
- # output. Adds ~215k to driver.
-device amd # AMD 53C974 (Tekram DC-390(T))
-device hptiop # Highpoint RocketRaid 3xxx series
-device isp # Qlogic family
-#device ispfw # Firmware for QLogic HBAs- normally a module
-device mpt # LSI-Logic MPT-Fusion
-#device ncr # NCR/Symbios Logic
-device sym # NCR/Symbios Logic (newer chipsets + those of `ncr')
-device trm # Tekram DC395U/UW/F DC315U adapters
-
-device adv # Advansys SCSI adapters
-device adw # Advansys wide SCSI adapters
-device aic # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
-device bt # Buslogic/Mylex MultiMaster SCSI adapters
+device ahci
# SCSI peripherals
device scbus # SCSI bus (required for SCSI)
-device ch # SCSI media changers
device da # Direct Access (disks)
-device sa # Sequential Access (tape etc)
-device cd # CD
device pass # Passthrough device (direct SCSI access)
-device ses # SCSI Environmental Services (and SAF-TE)
-
-# RAID controllers interfaced to the SCSI subsystem
-device amr # AMI MegaRAID
-device arcmsr # Areca SATA II RAID
-#XXX it is not 64-bit clean, -scottl
-#device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID
-device ciss # Compaq Smart RAID 5*
-device dpt # DPT Smartcache III, IV - See NOTES for options
-device hptmv # Highpoint RocketRAID 182x
-device hptrr # Highpoint RocketRAID 17xx, 22xx, 23xx, 25xx
-device iir # Intel Integrated RAID
-device ips # IBM (Adaptec) ServeRAID
-device mly # Mylex AcceleRAID/eXtremeRAID
-device twa # 3ware 9000 series PATA/SATA RAID
-
-# RAID controllers
-device aac # Adaptec FSA RAID
-device aacp # SCSI passthrough for aac (requires CAM)
-device ida # Compaq Smart RAID
-device mfi # LSI MegaRAID SAS
-device mlx # Mylex DAC960 family
-#XXX pointer/int warnings
-#device pst # Promise Supertrak SX6000
-device twe # 3ware ATA RAID
# atkbdc0 controls both the keyboard and the PS/2 mouse
device atkbdc # AT keyboard controller
device atkbd # AT keyboard
-device psm # PS/2 mouse
device kbdmux # keyboard multiplexer
device vga # VGA video card driver
-device splash # Splash screen and screen saver support
-
# syscons is the default console driver, resembling an SCO console
device sc
-device agp # support several AGP chipsets
-
-# PCCARD (PCMCIA) support
-# PCMCIA and cardbus bridge support
-device cbb # cardbus (yenta) bridge
-device pccard # PC Card (16-bit) bus
-device cardbus # CardBus (32-bit) bus
-
# Serial (COM) ports
device uart # Generic UART driver
-# Parallel port
-device ppc
-device ppbus # Parallel port bus (required)
-device lpt # Printer
-device plip # TCP/IP over parallel
-device ppi # Parallel port interface device
-#device vpo # Requires scbus and da
-
-# If you've got a "dumb" serial or parallel PCI card that is
-# supported by the puc(4) glue driver, uncomment the following
-# line to enable it (connects to sio, uart and/or ppc drivers):
-#device puc
-
# PCI Ethernet NICs.
-device de # DEC/Intel DC21x4x (``Tulip'')
device em # Intel PRO/1000 Gigabit Ethernet Family
-device igb # Intel PRO/1000 PCIE Server Gigabit Family
-device ixgbe # Intel PRO/10GbE PCIE Ethernet Family
-device le # AMD Am7900 LANCE and Am79C9xx PCnet
-device ti # Alteon Networks Tigon I/II gigabit Ethernet
-device txp # 3Com 3cR990 (``Typhoon'')
-device vx # 3Com 3c590, 3c595 (``Vortex'')
-
-# PCI Ethernet NICs that use the common MII bus controller code.
-# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
-device miibus # MII bus support
-device ae # Attansic/Atheros L2 FastEthernet
-device age # Attansic/Atheros L1 Gigabit Ethernet
-device alc # Atheros AR8131/AR8132 Ethernet
-device ale # Atheros AR8121/AR8113/AR8114 Ethernet
-device bce # Broadcom BCM5706/BCM5708 Gigabit Ethernet
-device bfe # Broadcom BCM440x 10/100 Ethernet
-device bge # Broadcom BCM570xx Gigabit Ethernet
-device dc # DEC/Intel 21143 and various workalikes
-device et # Agere ET1310 10/100/Gigabit Ethernet
-device fxp # Intel EtherExpress PRO/100B (82557, 82558)
-device jme # JMicron JMC250 Gigabit/JMC260 Fast Ethernet
-device lge # Level 1 LXT1001 gigabit Ethernet
-device msk # Marvell/SysKonnect Yukon II Gigabit Ethernet
-device nfe # nVidia nForce MCP on-board Ethernet
-device nge # NatSemi DP83820 gigabit Ethernet
-#device nve # nVidia nForce MCP on-board Ethernet Networking
-device pcn # AMD Am79C97x PCI 10/100 (precedence over 'le')
-device re # RealTek 8139C+/8169/8169S/8110S
-device rl # RealTek 8129/8139
-device sf # Adaptec AIC-6915 (``Starfire'')
-device sge # Silicon Integrated Systems SiS190/191
-device sis # Silicon Integrated Systems SiS 900/SiS 7016
-device sk # SysKonnect SK-984x & SK-982x gigabit Ethernet
-device ste # Sundance ST201 (D-Link DFE-550TX)
-device stge # Sundance/Tamarack TC9021 gigabit Ethernet
-device tl # Texas Instruments ThunderLAN
-device tx # SMC EtherPower II (83c170 ``EPIC'')
-device vge # VIA VT612x gigabit Ethernet
-device vr # VIA Rhine, Rhine II
-device wb # Winbond W89C840F
-device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
-
-# ISA Ethernet NICs. pccard NICs included.
-device cs # Crystal Semiconductor CS89x0 NIC
-# 'device ed' requires 'device miibus'
-device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards
-device ex # Intel EtherExpress Pro/10 and Pro/10+
-device ep # Etherlink III based cards
-device fe # Fujitsu MB8696x based cards
-device sn # SMC's 9000 series of Ethernet chips
-device xe # Xircom pccard Ethernet
-
-# Wireless NIC cards
-device wlan # 802.11 support
-options IEEE80211_DEBUG # enable debug msgs
-options IEEE80211_AMPDU_AGE # age frames in AMPDU reorder q's
-options IEEE80211_SUPPORT_MESH # enable 802.11s draft support
-device wlan_wep # 802.11 WEP support
-device wlan_ccmp # 802.11 CCMP support
-device wlan_tkip # 802.11 TKIP support
-device wlan_amrr # AMRR transmit rate control algorithm
-device an # Aironet 4500/4800 802.11 wireless NICs.
-device ath # Atheros pci/cardbus NIC's
-device ath_hal # pci/cardbus chip support
-options AH_SUPPORT_AR5416 # enable AR5416 tx/rx descriptors
-device ath_rate_sample # SampleRate tx rate control for ath
-device ral # Ralink Technology RT2500 wireless NICs.
-device wi # WaveLAN/Intersil/Symbol 802.11 wireless NICs.
# Pseudo devices.
device loop # Network loopback
@@ -281,45 +101,49 @@ device firmware # firmware assist modul
device bpf # Berkeley packet filter
# USB support
-options USB_DEBUG # enable debug msgs
+#options USB_DEBUG # enable debug msgs
device uhci # UHCI PCI->USB interface
-device ohci # OHCI PCI->USB interface
device ehci # EHCI PCI->USB interface (USB 2.0)
device usb # USB Bus (required)
-#device udbp # USB Double Bulk Pipe devices
-device uhid # "Human Interface Devices"
device ukbd # Keyboard
-device ulpt # Printer
device umass # Disks/Mass storage - Requires scbus and da
-device ums # Mouse
-device urio # Diamond Rio 500 MP3 player
-# USB Serial devices
-device uark # Technologies ARK3116 based serial adapters
-device ubsa # Belkin F5U103 and compatible serial adapters
-device uftdi # For FTDI usb serial adapters
-device uipaq # Some WinCE based devices
-device uplcom # Prolific PL-2303 serial adapters
-device uslcom # SI Labs CP2101/CP2102 serial adapters
-device uvisor # Visor and Palm devices
-device uvscom # USB serial support for DDI pocket's PHS
-# USB Ethernet, requires miibus
-device aue # ADMtek USB Ethernet
-device axe # ASIX Electronics USB Ethernet
-device cdce # Generic USB over Ethernet
-device cue # CATC USB Ethernet
-device kue # Kawasaki LSI USB Ethernet
-device rue # RealTek RTL8150 USB Ethernet
-device udav # Davicom DM9601E USB
-# USB Wireless
-device rum # Ralink Technology RT2501USB wireless NICs
-device uath # Atheros AR5523 wireless NICs
-device ural # Ralink Technology RT2500USB wireless NICs
-device zyd # ZyDAS zb1211/zb1211b wireless NICs
-
-# FireWire support
-device firewire # FireWire bus code
-#device sbp # SCSI over FireWire (Requires scbus and da)
-device fwe # Ethernet over FireWire (non-standard!)
-device fwip # IP over FireWire (RFC 2734,3146)
-device dcons # Dumb console driver
-device dcons_crom # Configuration ROM for dcons
+
+device coretemp
+device cpuctl
+device pf
+device smbus
+device smb
+device ichsmb
+device ichwd
+device winbondwd
+device crypto # core crypto support
+device cryptodev # /dev/crypto for access to h/w
+options IPSEC #IP security (requires device crypto)
+options PANIC_REBOOT_WAIT_TIME=5
+
+options ACCEPT_FILTER_DATA
+options ACCEPT_FILTER_HTTP
+options ACCEPT_FILTER_DNS
+options NULLFS
+options TMPFS
+
+options ALTQ
+options ALTQ_CBQ # Class Based Queueing
+options ALTQ_RED # Random Early Detection
+options ALTQ_RIO # RED In/Out
+options ALTQ_HFSC # Hierarchical Packet Scheduler
+options ALTQ_CDNR # Traffic conditioner
+options ALTQ_PRIQ # Priority Queueing
+options ALTQ_NOPCC # Required if the TSC is unusable
+
+options SHMMAXPGS=65536
+options SEMMNI=40
+options SEMMNS=240
+options SEMUME=40
+options SEMMNU=120
+
+options KDB
+options DDB
+options KDB_TRACE
+options DDB_NUMSYM
+options HZ=100
主要的改动包括:
- 删掉了FFS相关的配置,因为系统是纯ZFS的。注意:这个配置会导致不能使用UFS。
- 删掉了MSDOSFS,CD9660等用不到的文件系统支持。需要时可通过模块加载。
- 删掉了针对 FreeBSD 4-6 以及 4.3BSD TTY 的兼容支持
- 删掉了安全审计、MAC支持
- 完全删掉了 ata 支持。(采用ahci而不用ata(4)驱动)
- 没有用到的SCSI、PCMCIA、RAID、网卡、1394等一律砍掉
- USB部分只保留这款主板支持的ehci和uhci两种,砍掉ohci;内核只保留用于键盘的ukbd和用于外接硬盘的umass;
- 增加了coretemp(检测CPU温度,Atom D510的Tj(max)是100摄氏度、cpuctl(调试用)、pf(包过滤/NAT等)、smb相关(主板监控)、winbondwd(我写的watchdog驱动)、IPSec、ALTQ支持;
- 增加了内核调试器(注意,因为这台机器是在家使用,因此没使用SC_DISABLE_KDBKEY)以方便使用textdump。
- 内核上下文切换频率降为100Hz。这可以省掉大约4/5的中断。
实测静置(只跑网络部分,或完全闲置,网络流量在不吃CPU的时候对耗电影响不太明显)时耗电为17W。理论上AHCI相关的设置可以进一步减少耗电,但我还没有测过具体的影响。
当执行计算任务并且有大量硬盘操作时的耗电峰值是23W。
(未完待续)