delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

26 Sep 2010

基于 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。

(未完待续)