当用disklabel(8)在你的硬盘上布局文件系统时,重要的是要记住硬盘在传送数据时外磁道比内磁道快。为了利用这个特点,你应该把较小的文件系统和交换区靠近外磁道,随后是较大的文件系统,最后是最大的文件系统。还有重要的是把标准文件系统大小确定在当你要增加这台机器负荷时也不需要重定他们的大小。我经常建立的文件系统的次序是128M的root,1G的swap,128M的 /var/tmp,3G的/usr,其余的空间留给/home。
典型地,你应该把交换区大小定为2倍的内存大小。如果你没有很多内存,那样的话,你将需要更多的交换区空间。不建议将交换区定在小于256M,当你确定交换区大小的时候,你要考虑到将来可能要扩充内存。内核的VM(虚拟内存)换页算法性能是准对交换区至少是内存大小2倍的条件进行优化的。配置太小的交换区会导致VM页面扫描的低效率,当内存扩充后,随之也会导致问题。最后在一个有多个SCSI硬盘的大系统上(或者有多个IDE磁盘工作在多个IDE控制器上),我们强烈建议在每个驱动器上配置交换分区,每个交换分区的大小应该是几乎一样的,内核能处理任意大小的交换区,但是内部数据结构放大到最大分区的4 倍大小。保持交换分区同样的大小允许内核优化地将交换空间交叉分布在N个磁盘上。不要担心这样做有点过份,交换区是UNIX的救星,甚至于你虽然通常不用那么多交换区,在被迫重新启动之前,它也可以给你时间去从一个出轨的程序中把系统恢复过来。
怎样为你的/var分区定大小主要依赖于你将怎样使用这台机器。这个分区主要存放邮箱,打印缓冲区和日志文件。有些人甚至于把/var/log作为一个独立的分区(但是除非有特别的情况,这样做不值得,只会浪费一个分区ID)。如果你这台机器主要用做邮件或打印服务器,或者运行一个大访问量的WEB服务器,你应该考虑把这个分区建的更大一点,可能1G或更多。很容易低估日志文件的存储需求。
确定/var/tmp的大小依赖于你将需要怎样使用你的临时文件。128M是建议的最小的尺寸。注意sysinstall将建立一个/tmp目录,但是通常把/tmp作为/var/tmp 的连接是个好注意。为临时文件建立一个分区有两个重要的原因:首先,它减少了系统崩溃后文件系统损坏的可能性,再就是减少一个出轨程序填满[/var]/tmp 时影响其他重要子系统(mail,logging等等)的机会。填满[/var]/tmp是经常发生的问题。
在以前/tmp和/var/tmp是不同的东西,但是引入/var(和/var/tmp)是被程序员引起的大迷惑,今天的程序间或使用一个或另一个,它们两者变的没有区别。所以把它们变成一个临时目录是有道理的.然而,当你处理/tmp时,有一件事情是你不想做的,就是把/tmp驻留在根分区上,导致根分区被填满或崩溃后重启时文件系统损坏.
/usr分区存放大量用于支持系统的文件,子目录/usr/local存放大量从ports(7) 安装的文件.如果你不那么多使用ports,也不将系统源代码(/usr/src)存放在机器上,你可以为/usr节省1G的磁盘空间.相反,如果你安装大量的ports(特别是窗口管理和Linux仿真)建议你至少2G的/usr,如果你还要将系统源代码放在机器上,我们建议你3G的/usr,不要低估所需的空间,它会慢慢爬起来,让你大吃一惊.
/home分区存放用户自己的数据,我通常把余下的空间留给这个分区.为什么要分区?为什么不建一个大的/分区就行了?那样我就不需要考虑分区大小问题。有几个原因显示这不是个好注意。首先,每个分区都有不同的操作特征,分开它们有利于文件系统准对这些特征调整它自己.例如,根和/usr分区主要是读操作,只有少量的写,而大量的读和写可以发生在/var在/var/tmp。把小的但是具有更繁忙的写操作的分区分开,就不会影响读操作居多的分区.再就是,把写操作居多的分区靠近磁盘外侧(例如,不是在一个大分区前,而是分区表后)有利于对你经常需要的分区增加性能。你可能也需要在大分区中的I/O性能,但是它们是那样的大以至于把它们移到磁盘外侧也不会显着增加性能,但是把/var移到磁盘外侧会有显着的不同.
正确分区你的系统允许你调整newfs(8)和tunefs(8)的参数。调整newfs(8)需要更多的经验,但是会带来显着的性能提高。有三个参数可以相对安全的调整: blocksize(块尺寸),bytes/inode(每i节点字节数)和cylinders/group(每组柱面数).
当块尺寸是8K或16K时,FreeBSD运行的最好.缺省的文件系统块尺寸是8K。对于一个大的分区使用16K块尺寸是个好注意.这同样需要你指定碎片(Fragment)大小。我们建议碎片总是块大小的1/8(其他的碎片尺寸测的不多)。newfs(8)选项是 newfs-f2048-b16384。。。。使用更大的块尺寸将导致缓冲区碎块,降低性能.如果大分区主要趋向于使用少量的大文件,例如数据库文件。你可以增加 bytes/inode比例,它减少该分区的i节点的数量(最大可被建立的文件和目录数量 )。减少文件系统i节点数量可以大大减少fsck(8)在系统崩溃后恢复的时间。不要使用这个选项,除非你确实在这个分区存放大文件.如果你过度这样做,你可能会被文件系统依然有大量的空间而不能创建文件的事情所困扰。使用32768, 65536或262144bytes/inode是建议的值。你可以调的更高,但是那只影响fsck的恢复时间.例如,newfs-i32768...
最后,增加cylinders/group比例可把i节点间距放的更近。这样可以增加目录性能和减少fsck的是时间.如果你使用这个选项,我建议最大化。使用newfs-c999,然后newfs报错会告诉你最大可能的值.
tunefs(8)可以进一步调整文件系统。这个命令可以运行在单用户方式而不用重新格式化文件系统。然而,这个程序可能是系统中最容易被滥用的程序。许多人企图通过把最小自由空间百份比设置为0来增加可使用的文件系统空间,这可导致严重的文件系统碎片,我们不建议这样做。实际上唯一值得使用的tunefs 选项是使用tunefs-nenable/filesystem打开softupdates开关(注意:在5.x中,可以用newfs-U选项打开)。softupdates戏剧性地提高meta-data的性能,主要是文件创建和删除。我们建议对所有的文件系统都打开softupdates开关。 softupdates有两个副作用你必须知道:首先softupdats保证当系统崩溃时文件系统状态的一致性的,但是更新磁盘可能要延时几秒种。如果系统崩溃,可能丢失更多的数据。第二,softupdates延时文件系统自由块的释放,如果你的文件系统将要满了(例如,根文件系统),对系统做一次升级,例如,makeinsta- llworld,可能导致空间不够而失败.
大量的运行时mount选项可以帮你调整系统。最明显最危险的是async。不要尝试使用它,这太危险了.一个危险性更少但是很有用的选项是noatime。UNIX文件系统通常更新文件或目录的最近存取时间,这个操作在FreeBSD内部被延时写处理,通常不会成为系统的负担.如果你的系统连续存取巨量的文件,缓冲区会被更新atime而弄脏变的紧张,成为系统负担.
例如,你正在运行一个高负载的web服务器,或者一个有大量读者的news服务器,你可以考虑在大分区上关掉atime更新的mount选项.不要无理由的在任何地方关掉atime更新选项,例如,你最好在那些以读居多的分区上保持打开这个选项,例如/和/usr。(特别是/,因为很多系统工具使用atime字段报告系统状况)。
STRIPING DISKS
在一个更大的系统上,你可能把一个分区分布(strip)到几个驱动器上去以建立一个更大的分区。striping可以通过把操作分开到不同的磁盘上去而提高文件系统性能。vinum(8)和ccd(4)可以建立strip化的文件系统。通常的说,strip 化一个小的分区例如根和/var/tmp或以读居多的分区例如/usr是彻底浪费时间。你应该strip化那些需要严重的I/O性能的分区,典型的是/var,/home和定制的用来存放数据库和web页的分区。选择正确的strip尺寸是同样重要的。文件系统企图把meta-data放在2的倍数边界上,你总是希望减少查找而不是增加查找。这意味着你要使用大的离心strip大小例如1152个扇区,使得顺序I/O不用查找几个磁盘而meta-data将分布在不同的磁盘上而不是集中在一个磁盘上。如果你真的很老练,我们建议你使用FreeBSD支持的控制器列表中的真正的硬件raid 控制器。
SYSCTL TUNING
在系统中有几百个sysctl(8)变量,包括那些看起来可以调整但是实际上不是的那些。在这个文档中我们将只是涵盖那些会最大地影响系统的sysctl。 kern.ipc.shm_use_phys缺省是0,可以被设置成0(off)或1。把它设置1引起 SysV共享内存段被映射到不可交换的物理内存上。这个功能只影响那些或者 (A)映射少量内存并在很多进程间共享或(B)映射大量内存并在任意数量的进程间共享内存的情况。这个功能允许内核通过将共享内存页锁定在核心存储中而消除大量的内部内存管理和页面跟踪的开销,使得它们不可被换出。 vfs。vmiodirenable缺省是0(不久将改为1)可以设置为0(off)或1(on)。这个参数控制目录怎样被缓存。大多数目录是小的而且只使用在文件系统中的一个碎块(典型的是1K)甚至在缓冲区中更小(典型的是512字节)。然而,在缺省的操作模式中,缓冲取只缓冲固定数量的目录哪怕你有巨量内存。把这个 sysctl打开就允许缓冲区利用虚拟内存页缓冲来缓冲目录。这样做的一个缺点是最少也要用去一个物理页面(典型的是4K)而不是512字节。如果正在你正在运行一个需要操作大量文件的服务,我们建议你打开这个选项。这些服务包括web页缓冲,大mail系统,news系统。打开这个选项通常情况下不会导致性能下降哪怕甚至内存浪费,但是你要尝试去发现。
有几个和buffer-cache及VMpagecache相关的sysctl。我们不建议去弄乱它们。从FreeBSD4.3开始,VM子系统能很好的对自己做调整。
如果你在运行面向网络的应用,net.inet.tcp.sendspace和net.inet.tcp. recvspace是特别令人感兴趣sysctl。它们控制任何一个tcp连接允许的发送和接收缓冲区的大小。缺省是16K。通过增加缺省值牺牲更多内核内存你总能够获得更高的带宽利用率。如果你正在服务成百上千个连接,我们不建议你增加缺省值,因为那样很容易因为滞留的连接累积起来后用完内存。但是如果你需要高带宽甚于更少的连接数量,特别是你有千兆以太网,增加缺省值将会得到完全不同的结果。你可以分开调整接收和发送缓冲区的大小。例如,如果你的机器主要是做web服务的,那么你可以减少接收缓冲区的大小用来增加发送缓冲区的大小而不用吃掉更多的内核内存。注意路由表(参见 route(8))能用于与路由相关的发送和接收缓冲去的缺省大小。另外一个工具是你能用防火墙规则中的管道(pipe)限制从某个IP地址或端口区出去或进来的流量。
例如,如果你有T1线路,你可能想要限制web流量为整个T1线路的70%而把余下的带宽留给mail和交互方式的使用。通常一个被繁忙地访问的web服务器不会显着的增加对其他服务的时延,但是强制这个限制能使事情更加光滑导致更长时间的稳定。为了确信不使用太多的带宽,许多人也人为地强制带宽限制。
除非双方主机支持TCP的窗口伸缩扩展,把TCP发送和接收缓冲区定为大于65535 将导致魔术般的性能提升,窗口伸缩由net.inet.tcp.rfc1323控制。这个扩展应该被使能并且为了在一些网络链路上获得好的性能,TCP缓冲区大小应该设置为大于65536,特别是千兆广域网和高时延的卫星链路。
我们建议你打开这个开关(设置为1)并且让net.inet.tcp.always_keepalive 也设置为1。缺省是off的。这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接。
kern.ipc.somaxconn限制接收TCP连接的侦听队列(listenqueue)的大小。缺省是128,这对在一个繁忙的web服务器环境中可靠的处理新的连接来说太小了。在那样的环境中,我们建议增加这个值调到1024或更高。服务进程可能自己限制侦听队列的长度(例如sendmail(8),apache)但是总会有一个配置项在配置文件中允许你调整队列的大小。大的侦听队列也能更好的抵挡DOS攻击。
kern.maxfiles决定系统支持打开多少个文件。缺省的是几千个但如果你在运行数据库或大的很吃描述符的进程可以把它设到1万或2万个。
vm.swap_idle_enabled在大的多用户系统中是很有用的,那里有大量的用户进入和离开系统而且有大量的空闲进程。那种系统趋势是对于空闲内存的保留上产生大量持续的压力。打开这个功能调整换出(空闲秒数)。通过vm.swap_idle_ threhold1和vm.swap_idle_threshold2允许你以比普通换出算法更快的速度降低与空闲进程联系着的页面的优先级。这等于帮了换出守护进程(pageout daemon)一把。不要打开这个选项,除非你需要它,因为你在做的交易是预先而不是后来吃掉更多的交换空间和磁盘带宽。在一个小系统上这个选项有影响而在一个已经发生换页的大系统上这个选项允许VM系统更加容易地把整个进程换出或换如内存。
BOOT-TIME SYSCTL TUNING
有些sysctl在运行时是不能调整的因为内存申请必须在引导的早期进行。要改变这些sysctl,你必须把这些值放在loader.conf(5)并且重新启动系统。 kern.maxusers缺省值是难以相信的低。对于现在大多数机器,你可能需要增加这个值到64,128或256。我们不建议你超过256除非你需要一个巨大的文件描述符数量。网络缓冲区也将被影响但是可以由另外的内核选项来控制。不要只是使用maxusers来增加网络mbuf。比FreeBSD4.4旧的系统没有这个sysctl需要使用内核配置选项maxusers来设置。
kern.ipc.nmbclusters可以调整用来增加系统愿意申请的网络mbuf的数量。每个cluster(簇)大概2K的内存,所以值1024代表保留2M内核内存作为网络缓冲区。你可以简单的计算出需要多少。如果你有一个web服务器最多可以有1000个并发连接,每个连接吃掉16K接收和发送缓冲区,你大概需要32MB的网络缓冲区来对付它。一个比较粗糙的方法是乘以2,所以32MBx2=64MB/2K=32768。所以这个情况下你将需要设置nmbclusters到32768。我们建议为那些内存不多的机器设置1024到4096而4096到32768为那些有很多内存的机器。无论如何如何你不能设置一个很随意的值,这可能导致启动时崩溃。netstat(1)的-m选项可以用来查看网络缓冲区的使用情况。老的FreeBSD系统没有这个sysctl,所以需要设置内核配置选项NMBCLUSTERS。
越来越多的程序正在使用sendfile()系统调用通过网络传送文件。 kern.ipc.nsfbufs用来控制sendfile()可以使用的多少文件系统缓冲区数量来进行工作。这个参数名义上随maxusers伸缩,所以你不应该去弄乱这个参数,除非在非常特殊的场合。
KERNEL CONFIG TUNING
在一个大系统中有大量的内核选项你可能需要摆弄。为了改变这些选项你需要从源代码编译内核。config(8)和手册是学习怎样做这件事情的好起点。通常建立你自己的定制的内核的第一件事情是去掉所有你不用的驱动程序和服务。删除象INET6和你不用的驱动程序可以减少内核的大小,有时候能达1兆或几兆,留出更多的内存给应用程序。
SCSI_DELAY和IDE_DELAY可用于减少系统启动时间。缺省值相当高,在启动时可引起15秒以上的延时。减少SCSI_DELAY到5秒通常是可行的。减少IDE_DELAY也是行的但是你必须更小心点。
有很多*_CPU的选项你可以注释掉。如果你想让内核只能在奔腾类CPU上运行,你可以轻松的拿掉I386_CPU和I486_CPU,如果你相信你CPU可以被认作奔腾2或更好的CPU,你可以拿掉I586_CPU。有些clone可能被认作奔腾或486,没有这些选项将不能启动。如果它能工作,真是太伟大了!操作系统将能更好地使用高端CPU的的MMU功能,任务切换,记时,甚至设备操作。另外,高端CPU支持 4MBMMU页面,内核用来将自己影射到内存中,在重负荷的系统调用下这会增加性能。
IDE WRITECACHE
FreeBSD4.3不认真考虑地将IDE写缓存关闭。这降低了到IDE磁盘的写盘带宽,但是考虑到硬盘厂商引入的严重的数据一致性问题而言是必要的。基本问题是 IDE驱动器在写完成上说谎。当IDE写缓冲打开时,IDE硬盘不仅不会按次序将数据写入磁盘,而且在严重的磁盘负荷下有时会永远耽搁有些数据块。当系统崩溃或掉电时会导致严重的文件系统损坏。所以我们的缺省值是安全的。不幸的是结果是巨大的性能损失,我们投降了并在发行后把缺省值改了过来。你应该通过查看hw.ata.wc这个sysctl来检查你系统上的缺省值。如果IDE写缓冲是关闭的,你可以将通过将hw.ata.wc内核变量设置为1而将它改回来。这必须在bootloader(8)启动时做。企图在内核启动后在做是没有作用的。请参见 ata(4)和loader(8)。
还有IDE硬盘的一个试验性的功能叫做hw.ata.tags(也能够在bootloader中设置)允许写缓冲被安全地打开。这是将SCSI的tagging功能带到IDE驱动器上。写这篇文章时只有IBM的DPTA和DTLA驱动器支持这个功能。警告!这些驱动器明显有质量控制方面的问题,所以我建议你不要在这个时候买。如果你需要性能,选用SCSI吧。
CPU,MEMORY,DISK,NETWORK
做何种调整依赖于你的系统在负载变大时哪一部分开始成为瓶颈。如果你的系统用完了CPU(空闲时间为0%)那你需要升级CPU或转移到SMP的主板(多CPU),或者你需要重新回顾你那个引起负荷的程序并试着优化它。如果系统正有大量的页面交换,需要考虑增加内存。如果系统真让磁盘满载通常能看到高CPUidle值和满载的磁盘。systat(1)可用于监视这个情况。对付磁盘满载有很多种方法:增加内存用于缓冲,镜象磁盘,把操作分到不同的机器等等。如果磁盘性能是个问题而且正在使用IDE硬盘,切换到SCSI能帮大忙。现代IDE驱动器与SCSI在低级顺序带宽上比较时,当你开始寻找,SCSI驱动器通常会赢。
最后,你可能用完了网络带宽。提高网络性能的第一道防线用switch替换hub,特别是今天switch和hub一样便宜。hub由于冲突补偿在重负载下有严重问题,一个坏主机会严重影响整个LAN。第二是尽可能优化网络路径。例如,在firewall(7)中我们描述了一个保护内部主机的拓扑结构,外部可视主机不通过它路由。按照你的需要,使用100BaseT而不是10BaseT,或使用1000BaseT而不是100BaseT。许多瓶颈发生在广域网连接上(例如mode,T1,DSL等)。如果要扩展链路是不可能的,可以使用dummynet(4)功能实现流量限制以阻止高负载服务(例如web服务)影响其他服务 (例如email服务),或正好相反。在家庭安装中,可以让交互式的传输的优先级高于你输出的其他服务(web服务,email等)。
本文作者: