在 LAN 适配器上启用 dog 线程使用
通过启用跟踪线程功能,驱动将进入的信息包排队到线程中,且该线程处理对 IP、TCP 和套接字码的调用。
缺省状况下,驱动程序直接调用 IP 层,将正在中断级别上运行的协议存储栈召唤到套接字级别上来。 这就减小了指令路径的长度,但增加了中断挂起的时间。 在 SMP 系统上,单个的 CPU 可能会成为从快的适配器上接收信息包时的瓶颈问题。 这个线程可以在可能空闲的其他 CPU 上运行。 在一些情况下,当进入的信息包速度很高时,启用跟踪线程可以提高系统容量,因为它允许多个 CPU 并行处理进入的信息包。
跟踪线程功能的缺点在于在轻负载的情况下,它会增加等待时间,还会增加主机 CPU 的使用,这是因为信息包必须排队到线程中,而线程则必须被分派。
注: 此功能在 uniprocessor 上不受支持,因为它只会添加路径长度并降低性能。
这是 LAN 适配器输入端(接收)的特点。 可使用 ifconfig 命令(ifconfig interface thread 或 ifconfig 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 开销增加得一个均值。