戴文的Linux核心專題:08 配置核心(4)

譯者: geekpi發表於2013-11-11

在這個第四部分裡,我們將繼續配置更多的設定和特性。

這裡我們被問及關於"IBM Calgary IOMMU support (CALGARY_IOMMU)"。這個選項將會提供對IBM xSeries x366和x460的IOMMU的支援。這也將讓那些32位PCI的裝置工作正常——在這些系統上不支援雙地址週期(DAC : Double Address Cycle)——因為該系統設定在訪問超過3GB記憶體的時候會有問題。如果需要這些IOMMU裝置可以用"iommu=off"在啟動時關閉。(這些核心/模組引數會在以後的文章中討論)

IOMMU(input/output memory management unit)是一個記憶體管理單元(MMU),它連線具有DMA功能的I/O匯流排到主記憶體上。DMA(Direct Memory Access)是許多計算機支援的一種允許特定裝置不借助CPU直接訪問記憶體的特性。雙地址週期(Double Address Cycle, DAC)是64位DMA;而通常的DMA使用32位。

下面,我們被問及是否預設啟用Calgary(Should Calgary be enabled by default? (CALGARY_IOMMU_ENABLED_BY_DEFAULT))。Calgary與上面提到的IOMMU是同一個概念。這兩者之間的不同是IOMMU可以支援許多裝置而Calgary只能支援IBM IOMMU裝置。如果禁用了它,但是以後需要使用到它,可以使用核心引數(iommu=calgary)。

這裡有個問題需要小心處理(Enable Maximum number of SMP Processors and NUMA Nodes (MAXSMP))。只有在核心執行在擁有很多SMP處理器和NUMA節點的情況下才啟用它,如Core i7和許多AMD CPU晶片。如果系統缺乏或者只有少量的SMP處理器和NUMA節點,核心就會變得低效。這個最好選擇"No"。

非一致性記憶體訪問(Non-Uniform Memory Access (NUMA))是一個每塊記憶體都需要花費更長時間訪問其他部分記憶體的系統。一個節點就是一組記憶體。例如,一個NUMA系統可能有三塊記憶體晶片。每塊晶片是一個節點,在帶CPU的主機板上有一個節點/晶片(這是最快的節點),另外兩個在不同的匯流排上。這兩個節點需要比第一個節點花費更長的時間去訪問。

注意:ccNUMA和NUMA目前是一樣的,至少是非常相似的。

對稱多處理器(Symmetric Multi-Processing (SMP))是NUMA的替代品。它的記憶體在同一根匯流排上。只有限定數量的CPU可以訪問匯流排,所以這限制了SMP系統上處理器的數量。然而它記憶體的訪問速度一樣塊。

注意:我是在為AMD64系統在編譯核心,所以我會告訴你我的選擇,來幫助讀者理解過程和選擇。如果我沒有指出我的選擇,那麼我用的就是預設選擇。如果你在為不同的系統編譯或者你有不同的需求,你需要在你的情況下做出替代的選擇。

接下來,除非配置工具已經為你做了選擇,選擇一個核心需要支援的最多CPU的數量。這個配置根據你給的數量優化核心。

接著啟用或禁用"SMT (Hyperthreading) scheduler support (SCHED_SMT)"(超執行緒排程器支援)。SMT排程器提升了在使用了超執行緒技術的Pentium 4處理器上的CPU決策能力。然而,這會帶來額外的功耗,在一些系統上最好像我一樣選擇"no"。

超執行緒一種專有的SMT並行微處理器(Intel 實現了它)。這是多工/多執行緒(同時做許多工)的一種特殊形式,並行多執行緒(Simultaneous multithreading (SMT))提升了多執行緒執行的效率。

在這之後,啟用或者禁用"Multi-core scheduler support (SCHED_MC)"。這樣也是一種提升多核CPU決策的特性。然而這回帶來額外功耗,我選擇了"No"。

在下一個選項中可以選擇搶佔模式。

Preemption Model(搶佔模式)

1. No Forced Preemption (Server) (PREEMPT_NONE) (非強制搶佔)

> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY) (自願核心搶佔)

3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT) (可搶佔核心)

choice[1-3]: 2

搶佔就是暫停一個意圖讓它之後繼續執行的中斷任務的過程。搶佔強制一個程式暫停,執行中的任務無法忽視搶佔。

接著,我們被詢問關於"Reroute for broken boot IRQs (X86_REROUTE_FOR_BROKEN_BOOT_IRQS)"。這是一個對於假中斷的簡單修復。假中斷是一種無用的硬體中斷,這些通常是有電子干擾或者錯誤連線的電子產品觸發。記住,中斷是傳送給處理器需要馬上注意的訊號。

這個選項對任何機器都很重要;我懷疑任何人可能都會有禁用這個特性的理由(Machine Check / overheating reporting (X86_MCE))。核心必須意識到過熱和資料損壞,不然,系統將會繼續操作,這樣只會導致進一步的破壞。

下面,使用者可以啟用禁用"Intel MCE features (X86_MCE_INTEL)",這是一種額外的對像熱度監控的Intel MCE特性的支援。因為我是為AMD64處理器編譯核心所以我選擇了"no"。機器檢測異常(MCE)是一種當處理器發現硬體問題時的錯誤輸出。MCE通常會導致核心嚴重錯誤(kernel panic)(相當於Windows中的"藍屏")。

這個除了是AMD裝置外是同一個問題Intel MCE features (X86_MCE_INTEL)。

下一個是我會禁用的除錯特性(Machine check injector support (X86_MCE_INJECT))。這個會允許注射檢查。如果你偶爾執行機器注射,那最好編譯成模組而不是編譯進核心。機器注射可以使裝置即使實際沒有錯誤也可以傳送一個偽造的錯誤資訊。這個用來確認核心和其他程式可以正常處理錯誤。比如,如果CPU過熱,接著應該關機,但是開發者如何在不損壞CPU的情況下測試程式碼。注射錯誤是一種最好的方法,因為它只是一種告訴硬體傳送錯誤訊號的軟體。

注:模組是對可能被使用或者很少執行的特性/驅動而言的。只加入在許多使用該核心的系統中用到的特性/驅動到核心中。

如果核心很可能用在Dell筆記本上,那麼啟用這個特性(Dell laptop support (I8K))。否則,如果一些使用者可能在戴爾膝上型電腦上用到這個核心,將其作為一個模組加入。如果這個核心不打算支援Dell筆記本,那就像我一樣忽略掉它。特別地,這個支援是一個允許Dell Inspiron 8000系列筆記本訪問處理器的系統管理模式的驅動。系統管理模式的目的是得到處理器的溫度和風扇狀態,這對一些需要控制風扇的系統有用。

下面,使用者可以選擇微碼載入支援(CPU microcode loading support (MICROCODE))。這可以允許使用者在支援這個特性的AMD或者Intel晶片上更新微碼。

注意:為了載入微碼,你必須擁有一個為你的處理器設計的合法的二進位制微程式碼拷貝。

如果要載入微碼補丁(修復bug或加入次要的特性)到intel晶片上(Intel microcode loading support (MICROCODE_INTEL)),這個就必須啟用。這裡我禁用了它。

然後是AMD晶片的類似選項(AMD microcode loading support (MICROCODE_AMD))。

啟用這個支援(/dev/cpu/*/msr - Model-specific register support (X86_MSR))可以允許某個處理器有許可權使用x86特殊模組暫存器(Model-Specific Registers (MSRs))。這些暫存器是一些字元裝置,包括major 202下minor 0到31的裝置((/dev/cpu/0/msr to /dev/cpu/31/msr))。這個特性用在多處理器系統上。每個虛擬字元裝置都連線到一個特定的CPU。

注意:MSRs被用來改變CPU裝置、除錯、效能監控和執行追蹤。MSRs使用x86指令集。

在這之後,我們有一個選項"CPU information support (X86_CPUID)",啟用這個特性允許處理器訪問x86 CPUID指令,這需要通過字元裝置在一個特定的CPU上執行。這些字元裝置包括major 202下minor 0到31的裝置(/dev/cpu/0/msr to /dev/cpu/31/msr),就像上面x86_MSR支援的這些。

如果處理器支援,啟用核心線性對映來使用1GB的記憶體頁(Enable 1GB pages for kernel pagetables (DIRECT_GBPAGES))。啟用這個可以幫助減輕TLB的壓力。

頁是記憶體本身的基本單位(位是資料的基本單位)。頁的大小是由硬體自身決定的。頁碼錶是虛擬和實體記憶體間的對映。實體記憶體是裝置上的記憶體。虛擬記憶體是到記憶體的地址。依賴於系統架構,硬體可以訪問大於實際記憶體地址的地址。舉例來說,一個64位系統擁有6GB記憶體,管理員在需要時可以加上更多的記憶體。這是因為還有很多虛擬記憶體地址。然而,在很多32位系統上,系統管理員可以增加一條8GB的記憶體,但是系統無法完全使用它,因為系統中沒有足夠的虛擬記憶體地址去訪問大容量的記憶體。轉換後援緩衝器(Translation Lookaside Buffer (TLB))是一種提升虛擬記憶體轉換速度的快取系統。

下面,我們看到了NUMA選項(Numa Memory Allocation and Scheduler Support (NUMA))。這可以允許核心在CPU本地記憶體分配器上分配CPU可使用的記憶體。這個支援同樣可使核心更好感知到NUMA。很少的32位系統需要這個特性,但是一些通用的645位處理器使用這個特性。我選擇了"no"。

為了系統使用舊方式來檢測AMD NUMA節點拓撲,啟用這個特性(Old style AMD Opteron NUMA detection (AMD_NUMA))。下一個選項是一種更新的檢測方式(ACPI NUMA detection (X86_64_ACPI_NUMA))。如果兩個都啟用,新的方式將會佔支配作用。一些硬體在使用其中一種方式而不是另外一個時工作得更好。

如果為了除錯目的的NUMA模擬,可以啟用下一個特性(NUMA emulation (NUMA_EMU))。

注意:如果你不打算進行除錯並且你需要一個快速、輕量級系統,那麼禁用盡可能多的除錯特性。

下一個選項中,選擇你的核心打算如何處理NUMA節點的最大數量。接下來選擇記憶體模型,這裡可能只有一個記憶體模型選擇。記憶體模型指定了記憶體如何儲存。

Maximum NUMA Nodes (as a power of 2) (NODES_SHIFT) [6]

Memory model

> 1. Sparse Memory (SPARSEMEM_MANUAL)

choice[1]: 1

為了提升效能,這裡有一個選項用通過虛擬記憶體對映(Sparse Memory virtual memmap (SPARSEMEM_VMEMMAP))來優化pfn_to_page和page_to_pfn操作。頁幀號是每頁被給定的號碼。這兩個操作用來從號碼得到頁或者從頁得到號碼。

下一個選項是允許一個節點可以移除記憶體(Enable to assign a node which has only movable memory (MOVABLE_NODE))。核心頁通常無法移除。當啟用後,使用者可以熱插拔記憶體節點,同樣可移除記憶體允許記憶體整理。作為出入記憶體的資料,只要有可用空間一組資料可能被劃分到不同記憶體。

接著前面的記憶體問題,我們還有更多的問題。這些可能已被配置工具預配置了。第三個選項(BALLOON_COMPACTION),當啟用時可以幫助減少記憶體碎片。碎片記憶體會減慢系統速度。第四個選項(COMPACTION)允許記憶體壓縮。下面列到的第五個選項(MIGRATION)允許頁面被移動。

  • Allow for memory hot-add (MEMORY_HOTPLUG) (允許記憶體熱新增)
  • Allow for memory hot remove (MEMORY_HOTREMOVE) (允許記憶體熱移除)
  • Allow for balloon memory compaction/migration (BALLOON_COMPACTION) (允許泡狀記憶體規整和合並)
  • Allow for memory compaction (允許記憶體規整)
  • Page migration (MIGRATION) (頁合併)

注意:啟用可移動記憶體會啟用以上5個特性。

下一步,我們可以"Enable KSM for page merging (KSM)"。核心同頁合併(Kernel Samepage Merging (KSM))會檢視程式認為可以合併的核心。如果兩頁記憶體完全相同這可以節約記憶體。一塊記憶體可以被刪除或者被合併,並且只有一塊可以使用。

配置工具可能會自動選擇儲存多少記憶體用於使用者分配(Low address space to protect from user allocation (DEFAULT_MMAP_MIN_ADDR) [65536])。

下一個選項很重要(Enable recovery from hardware memory errors (MEMORY_FAILURE))。如果記憶體故障並且系統有MCA恢復或者ECC記憶體,系統就可以繼續執行並且恢復。要使用這個特性,硬體自身和核心都必須支援。

機器檢測架構(Machine Check Architecture (MCA))是一個一些CPU上可以傳送硬體錯誤資訊給作業系統的特性。錯誤更正碼記憶體(Error-correcting code memory (ECC memory))是一種記憶體裝置檢測和糾正錯誤的形式。

下面,配置工具會自動啟用"HWPoison pages injector (HWPOISON_INJECT)"。這個特性允許核心標記一塊壞頁為"poisoned",接著核心會殺死建立壞頁的程式。這有助於停止並糾正錯誤。

為了允許核心使用大頁(Transparent Hugepage Support (TRANSPARENT_HUGEPAGE)),啟用這個特性。這可以加速系統但是需要更多記憶體。嵌入式系統不必使用這個特性。嵌入式系統通常只有非常小的記憶體。

如果啟用了上面的,那麼必須配置大頁的sysfs支援。

Transparent Hugepage Support sysfs defaults

1. always (TRANSPARENT_HUGEPAGE_ALWAYS)

> 2. madvise (TRANSPARENT_HUGEPAGE_MADVISE)

choice[1-2?]: 2

下面的選項是增加process_vm_readv和process_vm_writev這兩個系統呼叫(Cross Memory Support (CROSS_MEMORY_ATTACH))。這允許特權程式訪問另外一個程式的地址空間。

如果有tmem,啟用快取清理(cleancache)通常是一個好主意 (Enable cleancache driver to cache clean pages if Transcendent Memory (tmem) is present (CLEANCACHE))。當一些記憶體頁需要從記憶體中移除時,cleancache會將頁面放在cleancache-enabled的檔案系統上。當需要該頁時,頁會被重新放回記憶體中。超記憶體(tmem)沒有一組已知大小的記憶體,核心對此記憶體使用間接定址。

下一個選項允許在tmen啟用後快取交換頁(Enable frontswap to cache swap pages if tmem is present (FRONTSWAP))。frontswap在交換分割槽放置資料。交換特性的支援需要這個。

最好啟用下一個特性(Check for low memory corruption (X86_CHECK_BIOS_CORRUPTION))。這會檢測低位記憶體的記憶體損壞情況。這個特性在執行期被禁止。為了啟用這個特性,在核心命令列內加入 "memory_corruption_check=1"(這會在以後的文章中討論;這不同於任何命令列)。即使經常執行這個特性,也只使用非常小的開銷(接近沒有)。

接下來我門可以設定記憶體損壞檢測的預設設定(“Set the default setting of memory_corruption_check (X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK))。這可以選擇是否開啟或關閉memory_corruption_check。最好啟用記憶體損壞檢測不然如果一部分重要記憶體損壞後可能會導致資料丟失和系統崩潰。

這個選項關注的是BIOS(Amount of low memory, in kilobytes, to reserve for the BIOS (X86_RESERVE_LOW) [64])。配置工具通常知道給BIOS預留記憶體的最佳大小。

對於Intel P6處理器,開發者可以啟用儲存區域型別暫存器(MTRR (Memory Type Range Register) support (MTRR))。這用於連線著VGA卡的AGP和PCI卡。啟用這個特性核心會建立/proc/mtrr。

如果X驅動需要加入回寫入口,那麼啟用下面的選項(MTRR cleanup support (MTRR_SANITIZER))。這會將MTRR的佈局從連續轉換到離散。儲存區域型別暫存器(Memory type range registers (MTRRs))提供了一種軟體訪問CPU快取的方法。

下面,配置工具已經設定了一些MTRR選項

  • MTRR cleanup enable value (0-1) (MTRR_SANITIZER_ENABLE_DEFAULT) [1]

  • MTRR cleanup spare reg num (0-7) (MTRR_SANITIZER_SPARE_REG_NR_DEFAULT) [1]

為了設定頁級緩衝控制,那就啟用PAT屬性(x86 PAT support (X86_PAT))。頁屬性表(Page Attribute Table (PATs))是現在版的MTRRs並比它更靈活。如果你經歷過因啟用它而引發的啟動問題,那麼禁用這個特性後重新編譯核心。我選擇了"no"。


via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-4.4392/

譯者:geekpi 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章