Linux系统网络性能实例分析( 四 )


1、 NetBench
下图所示为 Linux内核与 Samba的各种增强和调优机制给 NetBench基准程序吞吐率带来的性能改进 。 这些测试的硬件执行环境是由 4个 1.5GHz P4处理器、 4个千兆位以太网适配器、 2GB内存以及 14个 15krpm SCSI磁盘构成的 Pentium 4系统 。所有测试都使用 SUSE 8.0版本 。每次后续测试都会包含一个新的内核、 调优或 Samba变化 。 所有测试都使用Ziff-Davis的 NetBench Enterprise Disk Suite基准程序。
Linux系统网络性能实例分析文章插图
下面描述了上图中各列的名称:

  • 基准配置(Baseline) 。 代表了 SUSE Linux企业级服务器 8.0版本(SUSE SLES 8)的一个干净安装 , 未对性能配置进行任何修改 。
  • data=http://kandian.youth.cn/index/writeback 。对一个 Ext3默认挂接选项的配置加以改动 , 将/data文件系统(提供了 Samba共享)从 ordered改为writeback 。 这极大改进了文件系统在元数据密集的工作负荷下的性能 , 例如本例 。
  • smblog=1 。 Samba日志级别从 2改为 1 , 以减少对 Samba日志文件的磁盘 I/O操作 。 级别1足以将关键错误记入日志中 。
  • SendFile/Zerocopy 。该补丁使得 Samba对于客户读请求使用 SendFile机制 。 该补丁与 Linux的 Zerocopy技术(最早出现于 2.4.4版本中)结合使用 , 可以消除两种高开销的内存复制操作 。
  • O(1)调度器 。这个小改进有利于未来的其他性能改进 。O(1)调度器是能够改进对称多处理器性能的多队列调度器 。 这是 Linux 2.5和 2.6内核中的默认调度器 。
  • 均等亲合的 IRQ(evenly affined IRQ) 。4个网络适配器中每个适配器的中断都由唯一的处理器来处理 。 在 P4体系结构中 , SUSE SLES 8的 IRQ至 CPU映射机制默认为轮询分配(destination= irq_num% num_cpus) 。 在示例中 , 网络适配器的所有 IRQ都被转至 CPU0 。这对于性能非常有益 ,因为该代码上的 cache暖和性已获得改进 ,但随着更多NIC被添加到系统中 ,单个 CPU可能难以处理全部网络负荷 。 理想的解决方案是均匀地亲合这些 IRQ ,使得每个处理器都处理来自一个 NIC的中断 。 这种机制与进程亲合性结合使用 , 应该能够将指派给某个特定 NIC上的进程也指派到一个 CPU上 , 以便获取最高性能 。
  • 进程亲合性 。该技术确保对于每个被处理的网络中断 , 相应的 smbd进程都在同一个 CPU上被调度以便进一步改善cache暖和性 。
这主要是一种基准测试技术 , 并不广泛用于其他场合 。 如果可以在逻辑上将工作负荷均匀划分到多个 CPU上 ,这将是一个很大的性能收益 。 现实中的大多数工作负荷都是动态的 , 因此无法预先确定亲合性 。
  • /proc/sys/net/hl=763 。增加网络协议栈代码中拥有的缓冲区数量 , 从而使网络栈不需调用内存系统来从中获取或释放缓冲区 。Linux 2.6内核中未提供这个调优特性 。
  • 实施大小写敏感特性 。如果未实施这个特性 ,Samba在打开一个文件前可能需要搜索该文件的不同版本名称 ,因为同一个文件可以拥有多个文件名组合 。 启动大小写敏感特性就可以消除这些猜测 。
  • 自旋锁(spinlock) 。Samba的数据库中使用了高开销的 fcntl()调用 。 可以使用自旋锁来代替这个调用 。 利用在posix_lock_file()中发现的大内核锁(Big Kernel Lock)可以减少大内核锁的竞争和等待时间 。 要使用该特性 ,可以通过--use-spin-locks来配置Samba , 如下例所示 。 Smbd --use-spin-locks -p-O-s