在 LAN 适配器上启用 dog 线程使用

通过启用跟踪线程功能,驱动将进入的信息包排队到线程中,且该线程处理对 IP、TCP 和套接字码的调用。

缺省状况下,驱动程序直接调用 IP 层,将正在中断级别上运行的协议存储栈召唤到套接字级别上来。 这就减小了指令路径的长度,但增加了中断挂起的时间。 在 SMP 系统上,单个的 CPU 可能会成为从快的适配器上接收信息包时的瓶颈问题。 这个线程可以在可能空闲的其他 CPU 上运行。 在一些情况下,当进入的信息包速度很高时,启用跟踪线程可以提高系统容量,因为它允许多个 CPU 并行处理进入的信息包。

跟踪线程功能的缺点在于在轻负载的情况下,它会增加等待时间,还会增加主机 CPU 的使用,这是因为信息包必须排队到线程中,而线程则必须被分派。

注: 此功能在 uniprocessor 上不受支持,因为它只会添加路径长度并降低性能。

这是 LAN 适配器输入端(接收)的特点。 可使用 ifconfig 命令(ifconfig interface threadifconfig interface hostname up thread)在接口级进行配置。

要禁用该功能,请使用 ifconfig interface -thread 命令,如下例所示:
# ifconfig en0 thread

# ifconfig en0
en0: flags=5e080863,e0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD,PSEG,THREAD,CHAIN>
        inet 192.1.0.1 netmask 0xffffff00 broadcast 192.1.0.255

# ifconfig en0 -thread

# ifconfig en0
en0: flags=5e080863,c0<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64BIT,CHECKSUM_OFFLOAD,PSEG,THREAD,CHAIN>
        inet 192.1.0.1 netmask 0xffffff00 broadcast 192.1.0.255

netstat -s 命令还显示一些计数器,以显示由线程处理的信息包的数量,以及线程队列是否丢弃了任何传入的信息包。 下面是 netstat -s 命令的示例:
# netstat -s| grep hread

        352 packets processed by threads
        0 packets dropped by threads

下面是考虑使用跟踪线程时的准则:

  • 需要安装比适配器还要多的 CPU。 典型情况下,推荐使用至少比适配器多两倍的 CPU。
  • 系统的 CPU 越快受益越少。 如果一个主机的 CPU 速率较慢可能会帮助最大。
  • 当输入信息包的速率很高的时候,这个特点最有可能提高性能。 在 MTU 1500 上性能的提高比 MTU 9000 (jumbo frames) 还要好,因为信息包的速率在小 MTU 的网络中会更高。

    当跟踪线程发现在它们的队列中有更多的任务不用返回睡眠状态(等待输入)时,它们运行得最好。 这就节省了驱动唤醒线程和系统调用线程的开销。

  • 跟踪线程也可以屏蔽中断,这样就降低了指定 CPU 所花费的时间。 这可以更快地释放 CPU,继续一般的用户级别的任务。
  • 如果信息包速率没有足够快得可以允许线程保持运行,跟踪线程也可以降低性能大约 10%。 这个 10% 是因为需要安排和调度线程导致 CPU 开销增加得一个均值。