服务器 频道

FreeBSD应该如何调优

    kern.ipc.somaxconn限制接收TCP连接的侦听队列(listen queue)的大小。缺省是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支持4MB MMU页面,内核用来将自己影射到内存中,在重负荷的系统调用下这会增加性能。

    IDE WR99vE CACHE
    FreeBSD 4.3不认真考虑地将IDE写缓存关闭。这降低了到IDE磁盘的写盘带宽,但是考虑到硬盘厂商引入的严重的数据一致性问题而言是必要的。基本问题是IDE驱动器在写完成上说谎。当IDE写缓冲打开时,IDE硬盘不仅不会按次序将数据写入磁盘,而且在严重的磁盘负荷下有时会永远耽搁有些数据块。当系统崩溃或掉电时会导致严重的文件系统损坏。所以我们的缺省值是安全的。不幸的是结果是巨大的性能损失,我们投降了并在发行后把缺省值改了过来。你应该通过查看hw.ata.wc这个sysctl来检查你系统上的缺省值。如果IDE写缓冲是关闭的,你可以将通过将hw.ata.wc内核变量设置为1而将它改回来。这必须在boot loader(8)启动时做。企图在内核启动后在做是没有作用的。请参见
ata(4)和loader(8)。

    还有IDE硬盘的一个试验性的功能叫做hw.ata.tags(也能够在boot loader中设置)允许写缓冲被安全地打开。这是将SCSI的tagging功能带到IDE驱动器上。写这篇文章时只有IBM的DPTA和DTLA驱动器支持这个功能。警告!这些驱动器明显有质量控制方面的问题,所以我建议你不要在这个时候买。如果你需要性能,选用SCSI吧。

    CPU,MEMORY,DISK,NETWORK
    做何种调整依赖于你的系统在负载变大时哪一部分开始成为瓶颈。如果你的系统用完了CPU(空闲时间为0%)那你需要升级CPU或转移到SMP的主板(多CPU),或者你需要重新回顾你那个引起负荷的程序并试着优化它。如果系统正有大量的页面交换,需要考虑增加内存。如果系统真让磁盘满载通常能看到高CPU idle值和满载的磁盘。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等)。

0
相关文章