服务器 频道

FreeBSD应该如何调优

    【IT168 服务器学院】FreeBSD下的系统性能调优

    SYSTEM SETUP - DISKLABEL,NEWFS,TUNEFS,SWAP 当用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 -f 2048 -b 16384。。。。使用更大的块尺寸将导致缓冲区碎块,降低性能.

    如果大分区主要趋向于使用少量的大文件,例如数据库文件。你可以增加bytes/inode比例,它减少该分区的i节点的数量(最大可被建立的文件和目录数量)。减少文件系统i节点数量可以大大减少fsck(8)在系统崩溃后恢复的时间。不要使用这个选项,除非你确实在这个分区存放大文件.如果你过度这样做,你可能会被文件系统依然有大量的空间而不能创建文件的事情所困扰。使用32768,65536或262144 bytes/inode是建议的值。你可以调的更高,但是那只影响fsck的恢复时间.例如,newfs -i 32768...

    最后,增加cylinders/group比例可把i节点间距放的更近。这样可以增加目录性能和减少fsck的是时间.如果你使用这个选项,我建议最大化。使用newfs -c999,然后newfs报错会告诉你最大可能的值.

    tunefs(8)可以进一步调整文件系统。这个命令可以运行在单用户方式而不用重新格式化文件系统。然而,这个程序可能是系统中最容易被滥用的程序。许多人企图通过把最小自由空间百份比设置为0来增加可使用的文件系统空间,这可导致严重的文件系统碎片,我们不建议这样做。实际上唯一值得使用的tunefs 选项是使用tunefs -n enable /filesystem 打开softupdates开关(注意:在5.x中,可以用newfs -U选项打开)。softupdates戏剧性地提高meta-data的性能,主要是文件创建和删除。我们建议对所有的文件系统都打开softupdates开关。softupdates有两个副作用你必须知道: 首先softupdats保证当系统崩溃时文件系统状态的一致性的,但是更新磁盘可能要延时几秒种。如果系统崩溃,可能丢失更多的数据。第二,softupdates延时文件系统自由块的释放,如果你的文件系统将要满了(例如,根文件系统),对系统做一次升级,例如,make insta- 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及VM page cache相关的sysctl。我们不建议去弄乱它们。从FreeBSD 4.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而不正确的关闭活动的连接。

0
相关文章