簡介 Intel 的超線程技術通過復制、分區和共享 Intel NetBurst 微體系結構管道中的資源,使得一個物理處理器能包含兩個邏輯處理器。 被復制的資源為兩個線程創建了資源副本: 每個 CPU 的所有體系結構狀態 指令指針,重命名邏輯 一些較小的資源(例如返回堆棧預測器、ITLB 等) 已分區的資源劃分執行線程之間的資源: 幾個緩沖區(Re-Order 緩沖區、Load/Store 緩沖區、隊列等) 共享的資源按需在兩個正在執行的線程之間使用資源: 亂序執行引擎 高速緩存 通常,每個物理處理器在一個處理器核心上都有一個體系結構狀態,來為線程提供服務。使用了 HT,每個物理處理器在單個核心上就有兩個體系結構狀態,這使得物理處理器看起來象有兩個邏輯處理器在為線程提供服務。系統 BIOS 列舉出物理處理器中的每個體系結構狀態。由於支持超線程的操作系統利用了邏輯處理器,因此這些操作系統就有兩倍的資源可用於為線程提供服務。
Xeon 處理器中的超線程支持 在通用處理器中 Xeon 處理器最先實現同步多線程(SMT)(請參閱參考資料以獲取有關 Xeon 處理器系列的更多信息)。為達到在單一物理處理器上執行兩個線程的目標,該處理器同時維持多個線程的上下文,這允許調度程序並發分派兩個可能無關的線程。 操作系統(OS)將多個線程代碼調度和分派給每個邏輯處理器,就如同在 SMP 系統中。沒有分派線程時,相關的邏輯處理器保持空閒。 當將一個線程調度和分派給邏輯處理器 LP0 時,超線程技術利用必需的處理器資源來執行該線程。 當將第二個線程調度和分派給第二個邏輯處理器 LP1 時,就要按需為執行該線程而復制、劃分或共享資源。每個處理器都在管道各點上進行選擇,以控制和處理這些線程。當每個線程完成時,操作系統將未用的處理器置為空閒,釋放資源讓正在運行的處理器使用。 OS 將線程調度和分派給每個邏輯處理器,就好像是在雙處理器或多處理器系統中進行的那樣。當系統調度線程並將之引入到管道中時,按需利用資源以處理這兩個線程。
Linux 內核 2.4 中的超線程支持 Linux 內核將帶有兩個虛擬處理器的超線程處理器看成是一對真正的物理處理器。其結果是,處理 SMP 的調度程序也應該能處理超線程。Linux 內核 2.4.x 中的超線程支持始於 2.4.17,它包括了以下增強技術: 128 字節鎖對齊 螺旋等待循環優化 基於非執行的延遲循環 檢測支持超線程的處理器,並啟動邏輯處理器,如同該機器是 SMP MTRR 和微碼更新(Microcode Update)驅動程序中的串行化,因為它們影響共享狀態 在邏輯處理器上的調度發生之前,當系統空閒時對物理處理器上的調度進行優先級排序時,對調度程序進行優化 偏移用戶堆棧以避免 64K 混疊 內核性能測量 為評定超線程對 Linux 內核性能的影響,我們在包括 Intel Xeon 處理器(具有 HT 功能)的系統上測量了內核基准測試程序的性能。硬件是:支持 SMT 的單 CPU、1.6 GHz Xeon MP 處理器、2.5 GB RAM 和兩個 9.2 GB SCSI 硬盤驅動器。測量的內核是配置和構建了支持 SMP 的現有內核 V2.4.19。內核超線程支持通過引導選項 acpismp=force 來指定使用超線程,並通過引導選項 noht 來指定不使用超線程。查看是否支持超線程可以通過使用命令 cat /proc/cpuinfo,來顯示處理器 0 和處理器 1 這兩個處理器是否存在。請注意清單 1 中用於 CPU 0 和 1 的 ht 標志。在不支持超線程的情況下,將只顯示處理器 0 的數據。 清單 1. cat /proc/cpuinfo 的輸出,顯示超線程支持 processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 1 model name : Intel(R) Genuine CPU 1.60GHz stepping : 1 cpu MHz : 1600.382 cache size : 256 KB . . . fpu : yes fpu_exception: yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm bogomips : 3191.60 processor : 1 vendor_id : GenuineIntel cpu family : 15 model : 1 model name : Intel(R) Genuine CPU 1.60GHz stepping : 1 cpu MHz : 1600.382 cache size : 256 KB . . . fpu : yes fpu_exception: yes cpuid level : 2 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm bogomips : 3198.15
Linux 內核基准測試程序 為測量 Linux 內核性能,使用了 5 個基准測試程序:LMbench、AIM Benchmark Suite IX(AIM9)、chat、dbench 和 tbench。LMbench 基准測試程序對各種 Linux 應用程序編程接口(API)(例如,基本系統調用、上下文切換延遲和內存帶寬)進行計時。AIM9 基准測試程序提供對用戶應用程序工作負載的測量。chat 基准測試程序是模仿聊天室的客戶機/服務器工作負載。dbench 基准測試程序是文件服務器工作負載,tbench 是 TCP 工作負載。chat、dbench 和 tbench 是多線程基准測試程序,而其它的則是單線程基准測試程序。 超線程對 Linux API 的影響 超線程對 Linux API 的影響通過 LMbench 來測量,LMbench 是包含一套帶寬和延遲測量方法的微基准測試程序。這些影響中涉及了高速緩存文件讀取、內存復制(bcopy)、內存讀/寫(和延遲)、管道、上下文切換、聯網、文件系統的創建和刪除、進程的創建、信號處理以及處理器時鐘延遲。LMbench 著重測量以下內核組件:調度程序、進程管理、通信、聯網、內存映射和文件系統。低級內核原語提供一個很好的、底層硬件能力和性能的指示器。 為研究超線程的效果,我們著重於延遲的測量,它測量消息控制的時間(換句話說,系統執行某個操作能有多快)。延遲的數量用“微秒/操作”進行記錄。 表 1 顯示了用 LMbench 進行測試的部分內核功能列表。每個數據點是三次運行的平均值,而且該數據已經作過收斂測試,以保證在相同的測試環境條件下它們是可再現的。通常,對於那些作為單線程運行的功能來說,有超線程和無超線程之間沒有什麼性能差別。然而,對於那些需要運行兩個線程的測試(例如,管道延遲測試和三個進程延遲測試)來說,超線程似乎延長了它們的延遲時間。已配置的現有的 SMP 內核被標為 2419s。如果配置的內核不支持超線程,則將其標為 2419s-noht。若有超線程支持,則該內核被列為 2419s-ht。 表 1. 超線程對 Linux API 的影響 管道延遲的測試使用了兩個通過 UNIX 管道進行通信的進程來測量經由套接字的進程間通信延遲。基准測試程序在這兩個進程之間來回傳送標記。性能下降幅度為 1%,小得可以忽略不計。 這三個進程測試包括了在 Linux 中進行的進程創建和執行。目的是測量創建基本控制線程所花去的時間。對於進程 fork+exit 測試來說,該數據表示將一個進程分成兩個(幾乎)相同的副本並退出其中一個所花的延遲時間。新進程就是這麼創建的 - 但這不是非常有用,因為兩個進程執行相同的操作。在這個測試中,超線程造成的性能下降幅度為 4%。 在進程 fork+execve 中,數據表示創建新進程並讓該新進程運行新程序所花的時間。這是所有 shell(命令解釋器)的內循環。由於超線程,可以看到這個測試性能下降幅度為 6%。 在進程 fork+/bin/sh -c 測試中,數據表示創建新進程並使該新進程運行新程序(通過讓系統 shell 查找該程序並運行它)所要花去的時間。C 庫接口就是這樣實現對系統的調用。這個調用最常見,也最費時。在使用超線程的情況下,相對不用超線程而言,運行本測試慢了 2%。 超線程對 Linux 單用戶應用程序工作負載的影響 AIM9 基准測試程序是單用戶工作負載,旨在測量硬件和操作系統的性能。結果如表 2 所示。該基准測試程序中的大多數測試在使用超線程和不用超線程情況下執行性能都相同,只是同步文件操作和整數過濾(Integer Sieve)有所不同。同步隨機磁盤寫操作(Sync Random Disk Writes)、同步順序磁盤寫操作(Sync Sequential Disk Writes)和同步磁盤復制(Sync Disk Copies)這三個操作在使用超線程的情況下都慢了將近 35%。相反,在整數過濾的情況下使用超線程比不使用超線程速度提高了 60%。 表 2. 超線程對 AIM9 工作負載的影響 超線程對 Linux 多線程應用程序工作負載的影響 為測量超線程對 Linux 多線程應用程序的影響,我們使用模仿聊天室的 chat 基准測試程序。該基准測試程序包括了客戶機和服務器。該基准測試程序的客戶機端將報告每秒鐘所發送的消息數;聊天室和消息的數量將控制工作負載。該工作負載創建許多線程和 TCP/IP 連接,並發送和接收許多消息。它使用了以下缺省參數: 聊天室個數 = 10