(轉)虛擬化調試和優化指南


原文:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/virtualization_tuning_and_optimization_guide/

KVM總結-KVM性能優化之磁盤IO優化-----------https://blog.csdn.net/dylloveyou/article/details/71515880

KVM CPU(http://blog.csdn.net/dylloveyou/article/details/71169463)、

 KVM   內存(http://blog.csdn.net/dylloveyou/article/details/71338378)

第 1 章 簡介

1.1. KVM 概述

以下示意圖代表 KVM 構架:
KVM 構架

圖 1.1. KVM 構架

1.2. KVM 性能構架概述

以下幾點提供了 KVM 的簡要概述,它適用於系統性能和進程/線程的管理:
  • 使用 KVM 時,客機作為一個 Linux 的進程在主機上運行。
  • 虛擬 CPU(vCPU)作為正常線程執行,由 Linux 調度器執行。
  • 客機會繼承諸如內核中的 NUMA 和大頁面一類的功能。
  • 主機中的磁盤和網絡 I/O 設置對性能有顯著影響。
  • 網絡流量通常通過基於軟件的網橋傳送。

1.3. 虛擬化性能特性和改進

Red Hat Enterprise Linux 7 中虛擬化性能的改進

以下功能改進了Red Hat Enterprise Linux 7 中的虛擬化性能:
自動化 NUMA 平衡
自動化 NUMA 平衡改進了 NUMA 硬件系統中運行應用的性能,且無需為 Red Hat Enterprise Linux 7 客機進行任何手動調試。自動化 NUMA 平衡把任務(任務可能是線程或進程)移到與它們需要訪問的內存更近的地方。
如需獲取關於自動化 NUMA 平衡的更多信息,請參照 第 8.3 節 “自動化 NUMA 平衡”
多隊列 virtio-net
聯網方法使數據包發送/接收處理與客機中可用的虛擬 CPU 數量相協調。
關於多隊列 virtio-net 的更多信息請參照 第 5.5.2 節 “多隊列 virtio-net”
橋接零復制傳輸
在客機網絡和外部網絡間傳輸大數據包中,零復制傳輸模式(Zero Copy Transmit)對主機 CPU 負荷的減少可以達到 15%,且對吞吐量沒有影響。Red Hat Enterprise Linux 7 虛擬機中全面支持橋接零復制傳輸(Bridge Zero Copy Transmit),但在默認情況下被禁用。
關於零復制傳輸的更多信息請參照 第 5.5.1 節 “橋接零復制傳輸”
APIC 虛擬化
更新的 Intel 處理器提供高級可編程中斷控制器的硬件虛擬化(APICv,Advanced Programmable Interrupt Controller)。APIC 虛擬化將通過允許客機直接訪問 APIC 改善虛擬化 x86_64 客機性能,大幅減少中斷等待時間和高級可編程中斷控制器造成的虛擬機退出數量。更新的 Intel 處理器中默認使用此功能,並可改善 I/O 性能。
EOI 加速
對在那些較舊的、沒有虛擬 APIC 功能的芯片組上的高帶寬 I/O 進行 EOI 加速處理。
多隊列 virtio-scsi
改進的存儲性能和 virtio-scsi 驅動中多隊列支持提供的可擴展性。這個命令使每個虛擬 CPU 都可以使用獨立的隊列和中斷,從而不會影響到其他虛擬 CPU。
關於多隊列 virtio-scsi 的更多信息請參照 第 6.5.2 節 “多隊列 virtio-scsi”
半虛擬化 ticketlocks
半虛擬化 ticketlocks(pvticketlocks)將改善包括過度訂閱 CPU 在內的 Red Hat Enterprise Linux 主機中運行的 Red Hat Enterprise Linux 7 客戶虛擬機的性能。
半虛擬化頁面錯誤
半虛擬化頁面錯誤在嘗試訪問主機置換頁面時將被加入到客機。這一功能改善了主機內存過載和客機內存被置換時 KVM 的客機性能。
半虛擬化時間 vsyscall 優化
gettimeofday 和  clock_gettime 系統調用將通過  vsyscall 機制在用戶空間執行。在此之前,調用這類系統觸發需要系統切換到 kernel 模式,之后退回到用戶空間。這一操作將極大改善部分應用的性能。

Red Hat Enterprise Linux 中的虛擬化性能特性

  • CPU/Kernel
    • NUMA——非一致性內存訪問。關於 NUMA 的詳細信息請參照 第 8 章 NUMA
    • CFS——完全公平調度程序。一種新的、使用類(class)的調度程序。
    • RCU——讀取復制更新。更好地處理共享線程數據。
    • 多達 160 種虛擬 CPU(vCPU)。
  • 內存
    • 大頁面和其他內存密集型環境下的優化。詳細信息請參照 第 7 章 內存
  • 聯網
    • vhost-net——一種基於內核的 VirtIO 快速解決方案。
    • SR-IOV——使聯網性能級別接近本機。
  • 塊 I/O
    • AIO——支持線程和其他 I/O 操作重疊。
    • MSI - PCI 總線設備中斷生成。
    • 磁盤 I/O 節流——客機磁盤 I/O 的控制要求避免過度使用主機資源。詳細信息請參照 第 6.5.1 節 “磁盤 I/O 節流”

注意

關於虛擬化支持、限制和功能的更多詳細信息,請參照《  Red Hat Enterprise Linux 7 虛擬化入門指南 》和以下網址:

第 2 章 性能監控工具

2.1. 簡介

本章節描述用於監控客戶虛擬機環境的工具。

2.2. perf kvm

您可以使用帶有  kvm 選項的  perf 命令,從主機收集客機運行系統的統計數據。
在 Red Hat Enterprise Linux 中,  perf 軟件包提供 perf 命令。運行 rpm -q perf 檢查 perf軟件包是否已安裝。如果沒有安裝且您想安裝該軟件包來收集分析客機運行系統統計數據,請以 root 用戶運行以下命令:
# yum install perf
為了在主機中使用  perf kvm,您需要從客戶端獲取  /proc/modules 和  /proc/kallsyms 文件。有兩種可實現的方法。參考以下程序,用 過程 2.1, “從客戶端向主機復制 proc 文件” 將文件轉換逐級並在文件中運行報告。或者參照 過程 2.2, “備選:使用 sshfs 直接訪問文件” 直接安裝客戶端來獲取文件。

過程 2.1. 從客戶端向主機復制 proc 文件

重要

如果您直接復制必需文件(例如通過  scp 命令),您只會復制零長度的文件。此處描述了首先將客戶端中的文件復制到臨時位置(通過 cat 命令),然后通過  perf kvm 命令將它們復制到主機使用的過程。
  1. 登錄客戶端並保存文件

    登錄客戶端並將  /proc/modules 和  /proc/kallsyms 保存到臨時位置,文件名為 /tmp
    # cat /proc/modules > /tmp/modules
    # cat /proc/kallsyms > /tmp/kallsyms
  2. 將臨時文件復制到主機

    在您退出客戶端之后,運行以下  scp 命令,將已保存的文件復制到主機。如果 TCP 端口和主機名稱不符,應替換主機名稱:
    # scp root@GuestMachine:/tmp/kallsyms guest-kallsyms
    # scp root@GuestMachine:/tmp/modules guest-modules
    現在您在主機上擁有了兩個客戶端的文件( guest-kallsyms 和  guest-modules),准備就緒通過  perf kvm 命令進行使用。
  3. 通過 perf kvm 對事件進行記錄和報告

    使用前一步驟中獲取的文件,並紀錄和報告客戶端或(與)主機中的事件現在是可行的。
    運行以下示例命令:
    # perf kvm --host --guest --guestkallsyms=guest-kallsyms \
    --guestmodules=guest-modules record -a -o perf.data

    注意

    如果  --host 和 --guest 均在命令中使用,輸出將被儲存在 perf.data.kvm中。如果只有 --host 被使用,文件將被命名為 perf.data.host。同樣地,如果僅有 --guest 被使用,文件將被命名為 perf.data.guest
    請按 Ctrl-C 停止紀錄。
  4. 報告事件

    以下示例命令使用紀錄過程中獲取的文件,並將輸出重新定向到一個新文件: analyze
    perf kvm --host --guest --guestmodules=guest-modules report -i perf.data.kvm \
    --force > analyze
    查看並分析  analyze 文件內容,檢測紀錄的事件:
    # cat analyze
    
    
    # Events: 7K cycles 
    # 
    # Overhead       Command  Shared Object      Symbol 
    # ........  ............  .................  .........................
    # 
        95.06%            vi  vi                 [.] 0x48287         
         0.61%          init  [kernel.kallsyms]  [k] intel_idle 
         0.36%            vi  libc-2.12.so       [.] _wordcopy_fwd_aligned 
         0.32%            vi  libc-2.12.so       [.] __strlen_sse42 
         0.14%       swapper  [kernel.kallsyms]  [k] intel_idle 
         0.13%          init  [kernel.kallsyms]  [k] uhci_irq 
         0.11%          perf  [kernel.kallsyms]  [k] generic_exec_single 
         0.11%          init  [kernel.kallsyms]  [k] tg_shares_up 
         0.10%      qemu-kvm  [kernel.kallsyms]  [k] tg_shares_up 
    
    [輸出刪節……]

過程 2.2. 備選:使用 sshfs 直接訪問文件

  • 重要

    這一步僅被作為一個提供的示例。您需要依據環境替換屬性值。
    # Get the PID of the qemu process for the guest:
    PID=`ps -eo pid,cmd | grep "qemu.*-name GuestMachine" \
    | grep -v grep | awk '{print $1}'`
    
    # Create mount point and mount guest
    mkdir -p /tmp/guestmount/$PID
    sshfs -o allow_other,direct_io GuestMachine:/ /tmp/guestmount/$PID
    
    # Begin recording
    perf kvm --host --guest --guestmount=/tmp/guestmount \
    record -a -o perf.data
    
    # Ctrl-C interrupts recording. Run report:
    perf kvm --host --guest --guestmount=/tmp/guestmount report \
    -i perf.data
    
    # Unmount sshfs to the guest once finished:
    fusermount -u /tmp/guestmount

2.3. 虛擬性能監控單位

虛擬性能監控單位(vPMU,virtual performance monitoring unit)顯示客戶虛擬機功能的數據。
虛擬性能監控單位允許用戶識別客戶虛擬機中可能出現的性能問題來源。虛擬性能監控單位基於 Intel 性能監控單位(Performance Monitoring Unit)並只能以 Intel 機器為基礎。
該特性只能支持運行 Red Hat Enterprise Linux 6 或 Red Hat Enterprise Linux 7 的客戶虛擬機,並且會被默認禁用。
要驗證系統是否支持虛擬 PMU 時,請運行以下命令檢查主機 CPU 中的  arch_perfmon 標識:
# cat /proc/cpuinfo|grep arch_perfmon
在運行虛擬 PMU 時,以  host-passthrough 在客戶虛擬機中指定  cpu mode
# virsh dumpxml guest_name |grep "cpu mode"
<cpu mode='host-passthrough'>
在虛擬 PMU 激活之后,通過運行客戶虛擬機的  perf 命令顯示虛擬機的性能數據。

第 3 章 virt-manager

3.1. 簡介

本章節包括了虛擬機管理器  virt-manager 中調試可用選項的性能,是一項用來管理客戶虛擬機的桌面工具。

3.2. 操作系統細節和設備

3.2.1. 客戶虛擬機細節詳述

virt-manager 工具會根據新的客戶虛擬機的操作系統類型和版本,提供不同的配置文件。創建客戶虛擬機時,您應該盡可能地提供詳細信息;這樣便可以通過啟用適用於特定客戶虛擬機類型的功能來提高性能。
請參照以下  virt-manager 工具的截屏示例。在建立新的客戶虛擬機時,請指定想使用的操作系統類型版本
提供操作系統類型和版本

圖 3.1. 提供操作系統類型和版本

3.2.2. 刪除不使用的設備

刪除不使用或不必要的設備可以提高性能。例如,被指派作為網絡服務器的客戶虛擬機不可能需要音頻或附加的平板設備。
請參照以下  virt-manager 工具的截屏示例。點擊 移除按鈕刪除不必要的設備:
移除不使用的設備

圖 3.2. 移除不使用的設備

3.3. CPU 性能選項

客戶虛擬機有若干 CPU 相關選項可用。正確配置后,這些選項會對性能產生極大影響。以下圖片顯示了客戶虛擬機可用的 CPU 選項。本章節還會對這些選項的影響進行說明和解釋。
CPU 性能選項

圖 3.3. CPU 性能選項

3.3.1. 選項:可用的 CPU

使用該選項來調節客戶虛擬機的可用虛擬 CPU(vCPU)的容量。如果您分配的超過了主機可用的數量( overcommitting),會顯示警告,如下圖中所示:
過度使用 CPU

圖 3.4. 過度使用 CPU

如果系統中所有的客機 vCPU 容量大於主機 CPU 總數,CPU 就會被過度使用。如果 vCPU 的總數大於主機 CPU 數量,您可能會使 CPU 被一個或多個客機過度使用。

重要

與內存過度使用相似,CPU 過度使用時,比如在客機負荷過重或無法預測時,可能會給性能造成負面影響。更多有關過度使用的細節請參照 《 Red Hat Enterprise Linux 虛擬化管理手冊  KVM 過度使用 》。

3.3.2. 選項:CPU 配置

根據所需的 CPU 型號,使用以上選項選擇 CPU 的配置類型。展開列表查看可用的選項,或點擊 復制主機 CPU 配置 按鈕來檢測和應用物理主機 CPU 型號或配置。一旦選擇了 CPU 配置,CPU 性能 列表中就會顯示並分別啟用/禁用可用的 CPU 特性/指令。以下示意圖顯示了這些選項:
CPU 配置選項

圖 3.5. CPU 配置選項

注意

建議在手動配置上復制主機 CPU 配置。

注意

作為替代,在主機上運行  virsh capabilities 命令,查看系統虛擬化功能,包括 CPU 類型和 NUMA 功能。

3.3.3. 選項:CPU 拓撲

使用該選項將特定 CPU 拓撲(接口、內核、線程)應用於客戶虛擬機中的虛擬 CPU。選項示例請參照以下示意圖:
CPU 拓撲選項

圖 3.6. CPU 拓撲選項

注意

盡管您的環境可能會指示其他要求,選擇任何所需的接口,但只有一個單一接口和單一線程時性能最佳。

3.3.4. 選項:CPU 釘選(pinning)

遵循系統特定 NUMA 拓撲可以獲得性能的大幅提升。使用該選項自動生成主機可用的釘選配置。
CPU 釘選

圖 3.7. CPU 釘選

警告

如果客機中的虛擬 CPU 多於單一 NUMA 節點,請勿使用此選項。
使用“釘選”選項會將客機虛擬 CPU 線程限制在單一 NUMA 節點;但線程能夠在該 NUMA 節點中移動。如果需要更嚴密的綁定能力,使用  lscpu 命令輸出,使用  virsh cpupin 在虛擬 CPU 綁定建立 1:1 物理 CPU。NUMA 和 CPU 釘選的更多信息請參照 第 8 章 NUMA

3.4. 虛擬磁盤性能選項

影響性能的安裝過程中,您的客戶虛擬機可使用若干虛擬磁盤相關選項。以下圖片顯示了客機中可用的虛擬磁盤選項。
在  virt-manager 的虛擬磁盤部分可以選擇緩存模式、IO 模式和 IO 調試。以上參數可在性能選項下的字段中設置。具體如下圖:
虛擬磁盤性能選項

圖 3.8. 虛擬磁盤性能選項

重要

在設置  virt-manager 中虛擬磁盤性能選項時,虛擬機被重啟后才能使設置生效。
編輯客機 XML 配置中設置的設定和指令的描述請參見 第 6.3 節 “緩存”第 6.4 節 “I/O 模式”

第 4 章 tuned

4.1. 簡介

本章節的內容涵蓋了在虛擬環境中使用  tuned 守護進程調整系統設置。

4.2. tuned 和 tuned-adm

tuned 是一項配置文件調整機制,使 Red Hat Enterprise Linux 適應特定負載特性,例如 CPU 密集型任務要求,或存儲/網絡吞吐量的響應能力。
伴隨它的工具  ktune 結合了 tuned-adm 工具,提供大量預先配置的調整分析,以便在大量具體使用案例中提高性能並降低能耗。編輯這些配置或者創建新配置可生成為系統定制的性能解決方案。
提供作為  tuned-adm 中一部分的虛擬化相關文件包括:
virtual-guest
基於  throughput-performance 文件, virtual-guest 同樣會降低虛擬內存的 swappiness。
在創建 Red Hat Enterprise Linux 7 客戶虛擬機時, virtual-guest 文件將被自動選擇。建議虛擬機使用該文件。
本文件在 Red Hat Enterprise Linux 6.3 和之后可用,但在安裝虛擬機時須手動選擇。
virtual-host
基於  throughput-performance 文件, virtual-host 也會降低虛擬內存的 swappiness,並啟用更積極的臟頁(dirty page)回寫。建議虛擬化主機使用本文件,包括 KVM 和 Red Hat Enterprise Virtualization 主機。
在 Red Hat Enterprise Linux 7 安裝的默認情況下,將安裝  tuned 軟件包,並啟用 tuned 服務。
要列出所有可用配置文件並識別目前激活的配置文件,請運行:
# tuned-adm list
Available profiles:
- balanced
- desktop
- latency-performance
- network-latency
- network-throughput
- powersave
- sap
- throughput-performance
- virtual-guest
- virtual-host
Current active profile: throughput-performance
也可創建自定義  tuned 文件對一組調整參數進行封裝。創建自定義 tuned 文件的使用說明,請參考 tuned.conf 手冊頁。
要只顯示當前激活的配置文件請運行:
tuned-adm active
要切換到某個可用的配置文件請運行:
tuned-adm profile profile_name
例如,切換到  virtual-host 文件,請運行:
tuned-adm profile virtual-host

重要

設置 Red Hat Enterprise Linux 7.1 中的 tuned 配置文件和以上命令后,需重啟  tuned 服務,且系統必須被重啟使其持續應用修改。更多信息請查看《Red Hat Enterprise Linux 7 性能調試指南》。
在某些情況下,更優的選擇是禁用  tuned 並使用手動設定的參數。禁用一切調試請運行:
tuned-adm off

注意

有關  tunedtuned-adm 和 ktune 的更多信息,請參照《Red Hat Enterprise Linux 7 電源管理指南 》,可由 https://access.redhat.com/documentation/en-US/ 獲取。

第 5 章 聯網

5.1. 簡介

本章節包括虛擬化環境中的聯網優化主題。

5.2. 聯網調試須知

  • 使用多個網絡以避免單一網絡過載。例如用專用網絡進行管理、備份及/或實時遷移。
  • 通常,在所有組件中可以滿足匹配最大傳輸單元(1,500字節)。如果需要更大的消息,提高最大傳輸單元值可以減少碎片。如果改變了最大傳輸單元,路徑中所有的設備都應該有一個匹配的最大傳輸單元值。
  • 使用  arp_filter 阻止 ARP Flux,這種不良情況可能會在主機和客機中發生,造成這一現象的原因是機器從一個以上網絡界面響應 ARP請求:運行  echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter 或編輯  /etc/sysctl.conf 讓重啟后這設置得以持續。

注意

關於 ARP Flux 的更多信息請參照以下網址: http://linux-ip.net/html/ether-arp.html#ether-arp-flux

5.3. Virtio 和 vhost_net

以下示意圖將演示 Virtio 和 vhost_net 構架中,kernel 的作用。
Virtio 和 vhost_net 構架

圖 5.1. Virtio 和 vhost_net 構架

vhost_net 將部分 Virtio 驅動從用戶空間移至 kernel。這將減少復制操作、降低延遲和 CPU 占用量。

5.4. 設備分配和 SR-IOV

以下示意圖將演示設備分配和 SR-IOV 構架中 kernel 的作用。
設備分配和 SR-IOV

圖 5.2. 設備分配和 SR-IOV

設備分配使整個設備在客機中可用。SR-IOV 需要驅動和硬件中的支持,包括 NIC 和系統板,並允許創建多個虛擬設備並進入不同的客機。客機中需要針對供應商的驅動,但 SR-IOV 提供一切網絡選項中的最低延遲。

5.5. 網絡調試技巧

這一部分描述了虛擬化環境中網絡性能調試的技術。

5.5.1. 橋接零復制傳輸

零復制傳輸(Bridge Zero Copy Transmit)模式對於大尺寸的數據包較為有效。通常在客機網絡和外部網絡間的大數據包傳輸中,它對主機 CPU 負荷的減少可達到 15%,對吞吐量沒有影響。
它不對客機到客機、客機到主機或小數據包負載造成影響。
Red Hat Enterprise Linux 7 虛擬機完全支持橋接零復制傳輸,但是被默認禁用。若需要啟動零復制傳輸模式,請將 vhost_net 模塊的  experimental_zcopytx kernel 模塊參數設置到 1。

注意

由於針對限制服務和信息的威脅防御技術泄露攻擊,在傳輸中通常會創建一個額外的數據復制。啟動零復制傳輸將禁用這一威脅防御技術。
如果有性能回歸限向,或如果無需擔心主機 CPU 的使用,零復制傳輸模式可以通過將  experimental_zcopytx 設置到 0 被禁用。

5.5.2. 多隊列 virtio-net

多隊列 virtio-net 提供了隨着虛擬 CPU 數量增加而改變網絡性能的方法,即允許每一次通過一組以上的 virtqueue 傳輸數據包。
今天的高端服務器擁有更多處理器,其中所運行客機的虛擬 CPU 數量往往也在增加。在單一隊列的 virtio-net 中,客機中協議堆疊的縮放收到限制,因為網絡性能不隨虛擬 CPU 數量的增加而改變。鑒於 virtio-net 只有一組 TX 和 RX 隊列,客機不能並行傳輸或檢索數據包。
多隊列支持通過允許並行的數據包處理移除這些瓶頸。
多隊列 virtio-net 在這些時候可以提供最佳性能:
  • 流量數據包相對較大。
  • 客機同時在各種連接中活躍,流量從客機、客機到主機或客戶端運行到外部系統。
  • 隊列數量與虛擬 CPU 相同。因為多隊列支持可以優化 RX 中斷關聯和 TX 隊列選擇,實現特定隊列對於特定虛擬 CPU 的私有化。

注意

多隊列 virtio-net 在輸入流量中運行良好,但在少數情況下可能會影響輸出流量的性能。啟用多隊列 virtio-net 提高總體吞吐量,同時提高 CPU 可用量。

5.5.2.1. 配置多隊列 virtio-net

使用多隊列 virtio-net 時,通過向客機 XML 配置( N 的值為 1 到 8,即 kernel 最多可支持一組多隊列 tap 設備中的 8 個隊列)添加以下命令:
<interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
      <driver name='vhost' queues='N'/>
</interface>
與客機中的  N virtio-net 隊列一同運行虛擬機時,執行以下命令( M 的值為 1 到  N)時允許多隊列支持:
# ethtool -L eth0 combined M

第 6 章 塊 I/O

6.1. 簡介

本章節包括虛擬環境中的優化 I/O 設置。

6.2. 塊 I/O 調試

virsh blkiotune 命令允許管理員在客機 XML 配置的  <blkio> 元素中,手動設置或顯示客戶虛擬機的塊 I/O 參數。
為虛擬機顯示當前的  <blkio> 參數:
# virsh blkiotune virtual_machine
設置虛擬機的  <blkio> 參數,請參照以下命令並依據環境替換屬性值:
# virsh blkiotune virtual_machine [--weight number] [--device-weights string] [--config] [--live] [--current]
參數包括:
weight
I/O 的權重范圍在 100 到 1,000 之間。
device-weights
列出一個或多個設備/權值組群的單獨字符串,以  /path/to/device,weight,/path/to/device,weight 為格式。每一個權值必須在 100-1,000 范圍內,或者 0 值從每一個設備列表刪除該設備。只修改字符串中列出的設備;任何現有的其它設備的權值保持不改變。
config
添加  --config 選項,使更改在下次啟動時生效。
live
添加  --live 選項,在運行的虛擬機中應用這些更改。

注意

--live 選項要求監控程序支持這一行為。並非所有監控程序都允許最大內存限制的實時更改。
current
添加  --current 選項,在當前的虛擬機中應用這些更改。

注意

關於  virsh blkiotune 命令使用的更多信息,請參照  # virsh help blkiotune

6.3. 緩存

緩存選項可以在客機安裝期間用  virt-manager 進行配置,或通過編輯客機 XML 配置在現存的客戶虛擬機中配置。

表 6.1. 緩存選項

緩存選項 描述
Cache=none 客機中的 I/O 不能在主機上緩存,但可以保留在回寫磁盤緩存中。在客機中使用此選項來應對較大的需求。此選項通常是支持遷移的最佳和唯一選項。
Cache=writethrough 客機中的 I/O 在主機上緩存,但在物理媒介中直寫。該模式較慢且更易造成縮放問題。最好是在客機數量較小且 I/O 需求較低的情況下使用。推薦的應用對象是無需遷移、不支持回寫緩存的客機(如 Red Hat Enterprise Linux 5.5 或更早的版本)。
Cache=writeback 客機中的 I/O 在主機上緩存。
Cache=directsync 與 writethrough 相似,但客機中的 I/O 將忽略主機頁面緩存。
Cache=unsafe 主機可能會緩存所有的 I/O 磁盤,客機的同步要求將被忽略。
Cache=default 如果沒有指定緩存模式,將會選擇系統默認設置。
在  virt-manager 中,緩存模式可以在 Virtual Disk 下被指定。關於使用 virt-manager 以更改緩存模式的信息,請參照第 3.4 節 “虛擬磁盤性能選項”
在客機 XML 中配置緩存模式,請編輯設置在  driver 標簽內部的  cache,指定一個緩存選項。例如,將緩存設置為  writeback
<disk type='file' device='disk'>  
          <driver name='qemu' type='raw' cache='writeback'/>

6.4. I/O 模式

I/O 模式選項可以在客機安裝期間用  virt-manager 進行配置,或通過編輯客機 XML 配置在現存的客戶虛擬機中配置。

表 6.2. IO 模式選項

IO 模式選項 描述
IO=native Red Hat Enterprise Virtualization 環境的默認值。該模式適用於直接 I/O 選項的 kernel 非同步 I/O。
IO=threads 默認為基於主機用戶模式的線程。
IO=default Red Hat Enterprise Linux 7 默認為線程模式。
在  virt-manager 中,虛擬硬盤下可以指定 I/O 模式。關於使用 virt-manager 以改變 I/O 模式的信息,請參照第 3.4 節 “虛擬磁盤性能選項”
對客戶虛擬機 XML 中的 I/O 模式進行配置時,編輯  driver 標簽中的  io 設置,指定  nativethreads 或  default。例如,將 I/O 模式設置為  threads
<disk type='file' device='disk'>  
          <driver name='qemu' type='raw' io='threads'/>

6.5. 塊 I/O 調試技術

這一部分描述了更多關於虛擬化環境中塊 I/O 性能調試的技術。

6.5.1. 磁盤 I/O 節流

當若干虛擬機同時運行時,它們有可能因過度使用磁盤 I/O 而干擾系統性能。KVM 中的磁盤 I/O 節流可以為虛擬機發往主機的磁盤 I/O 請求設定限制。這樣可以避免虛擬機過度使用共享資源,並防止影響其他虛擬機的性能。
磁盤 I/O 節流可以在各種情況下使用,例如當不同客戶的客戶虛擬機在同一台主機中運行時,或不同的客戶虛擬機需要服務質量保證時。磁盤 I/O 節流還可以用於模擬更慢的磁盤。
I/O 節流可以在客機附加的每個塊設備中獨立應用,並支持吞吐量和 I/O 操作中的限制。請使用  virsh blkdeviotune 命令為虛擬機設置 I/O 限制。請參照以下示例:
# virsh blkdeviotune virtual_machine device --parameter limit
Device 為虛擬機附加的其中一個磁盤設備指定了獨特的目標名稱( <target dev='name'/>)或來源文件( <source file='name'/>)。使用  virsh domblklist 命令獲取磁盤設備名稱列表。
可選的參數包括:
total-bytes-sec
字節每秒的總吞吐量限制。
read-bytes-sec
字節每秒的讀取吞吐量限制。
write-bytes-sec
字節每秒的寫入吞吐量限制。
total-iops-sec
每秒的 I/O 操作總量限制。
read-iops-sec
每秒的讀取 I/O 操作限制。
write-iops-sec
每秒的寫入 I/O 操作限制。
例如,如需將  virtual_machine 虛擬機中的  vda 節流至 I/O 每秒 1000、吞吐量為每秒 50 MB,請運行以下命令:
# virsh blkdeviotune virtual_machine vda --total-iops-sec 1000 --total-bytes-sec 52428800

6.5.2. 多隊列 virtio-scsi

多隊列 virtio-scsi 提供了改進的存儲性能和 virtio-scsi 驅動中的可擴展性。該命令使每個虛擬 CPU 可以使用獨立隊列和中斷,從而不會影響到其他虛擬 CPU。

6.5.2.1. 配置多隊列 virtio-scsi

Red Hat Enterprise Linux 7 中默認禁用多隊列 virtio-scsi。
如需啟用客機中的多隊列 virtio-scsi 支持,在客機 XML 配置中添加以下命令,其中  N 為虛擬 CPU 隊列的總數:
   <controller type='scsi' index='0' model='virtio-scsi'>
   <driver queues='N' />
    </controller>

第 7 章 內存

7.1. 簡介

本章節包括虛擬環境的內存優化選項。

7.2. 內存調試須知

在虛擬環境中優化內存性能,需考慮以下幾點:
  • 請勿為客機分配超過所需的其它資源。
  • 在可能的情況下,如果 NUMA 節點中有足夠的資源,將一台客機分配到一個單一 NUMA 節點。關於 NUMA 使用的更多信息,請參照 第 8 章 NUMA

7.3. 虛擬機內存調試

7.3.1. 內存監控工具

在裸機環境中使用的監控內存的工具也可以在虛擬機中使用。以下工具可以被用來監控內存的使用情況,以及診斷與內存相關的問題:
  • top
  • vmstat
  • numastat
  • /proc/

注意

關於使用以上性能工具的詳細信息,請參照《 Red Hat Enterprise Linux 7 性能調節指南 》和上述命令的手冊頁。

7.3.2. 使用 virsh 調試內存

客機 XML 配置中可選的  <memtune> 元素允許管理員手動配置客戶虛擬機內存設置。如果省略  <memtune>,內存設置將被默認應用。
通過  virsh memtune 命令顯示或設置虛擬機  <memtune> 元素中的內存參數,依據環境替換屬性值:
# virsh memtune virtual_machine --parameter size
可選的參數包括:
hard_limit
虛擬機可以使用的最大內存,單位是千字節(1,024 字節塊)

警告

該限制設置過低可導致虛擬機被內核終止。
soft_limit
發生內存爭用時,內存限制使用的單位是千字節(1,024字節塊)。
swap_hard_limit
虛擬機加上轉化可使用的最大內存,單位是千字節(1,024 字節塊)。 swap_hard_limit 參數值必須大於  hard_limit 參數值。
min_guarantee
保證分配給虛擬機可以使用的最小內存,單位是千字節(1,024 字節塊)。

注意

使用  virsh memtune 命令的更多信息請參照  # virsh help memtune
可選的  <memoryBacking> 元素可能包含若干影響主頁存儲備份虛擬內存頁面的元素。
設置  locked 會阻止主機交換屬於客機的內存頁面。向客機 XML 添加以下命令,鎖定主機內存中的虛擬內存頁面:
<memoryBacking>
        <locked/>
</memoryBacking>

重要

設置  locked 時,必須在  <memtune> 元素中設置  hard_limit,使其達到客機配置的最大內存,以及該進程本身所消耗的內存。
設置  nosharepages 阻止主機合並在客機間使用的相同內存。通過向客機的 XML 添加以下命令,指示虛擬機監控程序禁用與客機的共享頁面:
<memoryBacking>
         <nosharepages/>
</memoryBacking>

7.3.3. 大頁面和透明大頁面(THP)

x86 CPU 通常會在 4kB 頁面中處理內存,但可以使用更大的 2MB 或 1GB 頁面,即  huge page(大頁面)。大頁面內存可以支持 KVM 客機部署,通過增加點擊轉換后備緩沖器(TLB)的 CPU 緩存以改善性能。
kernel 功能將在 Red Hat Enterprise Linux 7 中默認啟用,大頁面可以大幅提高性能,尤其是對於較大的內存和內存密集型的負載。Red Hat Enterprise Linux 7 可以通過使用大頁面增加頁面大小,以便有效管理大量內存。

過程 7.1. 為客機啟用 1GB 大頁面

  1. Red Hat Enterprise Linux 7.1 系統支持 2MB 或 1GB 大頁面,分配將在啟動或運行時進行。頁面大小均可以在運行時被釋放。例如,在啟動時分配 4 個 1GB 的大頁面和 1,024 個 2MB 的大頁面,請使用以下命令行:
    'default_hugepagesz=1G hugepagesz=1G hugepages=4 hugepagesz=2M hugepages=1024'
    此外,大頁面還可以在運行時分配。運行時分配允許系統管理員選擇從何種 NUMA 模式分配頁面。然而由於內存碎片的存在,運行時的頁面分配會比啟動時分配更容易造成分配失敗。以下運行時的分配示例顯示了從  node1 分配 4 個 1GB 的大頁面以及從  node3分配 1,024 個 2MB 的大頁面:
    # echo 4 > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages
    # echo 1024 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages
  2. 接下來,將 2MB 和 1GB 的大頁面掛載到主機:
    # mkdir /dev/hugepages1G
    # mount -t hugetlbfs -o pagesize=1G none /dev/hugepages1G
    # mkdir /dev/hugepages2M
    # mount -t hugetlbfs -o pagesize=2M none /dev/hugepages2M
  3. 重啟 libvirtd,使 1GB 大頁面可以在客機上啟用:
    # systemctl restart libvirtd
1GB 大頁面現在對客機不可用。配置 NUMA 節點特定大頁面,請參照 第 8.4.9 節 “向多個客機 NUMA 節點指定主機大頁面”

7.3.3.1. 透明大頁面配置

透明大頁面(THP,transparent huge page)將為性能自動優化系統設置。通過允許所有的空余內存被用作緩存以提高性能。
一旦  /sys/kernel/mm/transparent_hugepage/enabled 被設置為  always,透明大頁面將被默認使用。運行以下命令禁用透明大頁面:
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
透明大頁面支持不能阻止 hugetlbfs 的使用。但在 hugetlbfs 未使用時,KVM 將使用透明大頁面來替代常規的 4KB 頁面大小。

7.3.3.2. 靜態大頁面配置

在某些情況下,更優的選擇是增加對大頁面的控制。在客機中使用靜態大頁面,使用  virsh edit 向客機 XML 配置添加以下命令:
<memoryBacking>
        <hugepages/>
</memoryBacking>
以上命令使主機使用大頁面向客機分配內存,以替代使用默認的頁面大小。
在 Red Hat Enterprise Linux 7.1 中,主機中的大頁面可以被分配到客機的 NUMA 節點。在客機 XML 的  <memoryBacking> 元素中指定大頁面的大小、單位和客機的 NUMA 節點集。關於配置的更多信息和具體示例,請參照 第 8.4.9 節 “向多個客機 NUMA 節點指定主機大頁面”
查看當前的大頁面值,請運行以下命令:
cat /proc/sys/vm/nr_hugepages

過程 7.2. 大頁面設置

以下程序示例顯示了大頁面設置的命令。
  1. 查看當前的大頁面值:
    # cat /proc/meminfo | grep Huge
    AnonHugePages:      2048 kB
    HugePages_Total:       0
    HugePages_Free:        0
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
  2. 大頁面將以 2MB 為增量進行設置。將大頁面的數量設置到 25,000,請運行以下命令:
    echo 25000 > /proc/sys/vm/nr_hugepages

    注意

    此外,如需進行永久設置,請使用  # sysctl -w vm.nr_hugepages=N 命令和顯示為大頁面數量的  N
  3. 大頁面掛載:
    # mount -t hugetlbfs hugetlbfs /dev/hugepages
  4. 重啟  libvirtd,之后再運行以下命令重啟虛擬機:
    # systemctl start libvirtd
    # virsh start virtual_machine
  5. 驗證  /proc/meminfo 中的更改:
    # cat /proc/meminfo | grep Huge
    AnonHugePages:         0 kB
    HugePages_Total:   25000
    HugePages_Free:    23425
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       2048 kB
大頁面不僅可以使主機受益,也可以使客機受益。但它們的大頁面值總量必須小於主機中的可用值。

第 8 章 NUMA

8.1. 簡介

過去,x86 系統中的所有內存都可以通過 CPU 進行同等訪問。無論任何 CPU 執行操作,訪問時間都相等,這也被稱為“統一內存訪問”(UMA,Uniform Memory Access)。
最近使用的 x86 處理器已經不再采取這一行為。在非統一內存訪問(NUMA,Non-Uniform Memory Access)中,系統內存被划分到 NUMA  節點(node),並且與 socket 相對應,或與特定某一組與本地系統內存子集具有相同訪問延遲的 CPU 相對應。
本章節描述了虛擬環境中的內存分配和 NUMA 調試配置。

8.2. NUMA 內存分配策略

以下三種策略定義了系統中節點對內存的分配:
Strict
目標節點中不能分配內存時,分配將被默認操作轉進至其他節點。嚴格的策略意味着,當目標節點中不能分配內存時,分配將會失效。
Interleave
內存頁面將被分配至一項節點掩碼指定的節點,但將以輪循機制的方式分布。
Preferred
內存將從單一最優內存節點分配。如果內存並不充足,內存可以從其他節點分配。
XML 配置啟用所需策略:
<numatune>
        <memory mode='preferred' nodeset='0'>
</numatune>

8.3. 自動化 NUMA 平衡

自動化 NUMA 平衡改進了 NUMA 硬件系統中運行應用的性能。它在 Red Hat Enterprise Linux 7 系統中被默認啟用。
通常,應用程式在其程序的線程訪問 NUMA 節點上的內存、且此節點位置與線程排程時的位置相同的時候,性能最佳。自動化 NUMA 平衡會把任務(任務可能是線程或進程)移到與它們需要訪問的內存更近的地方,同時也會移動內存應用程序數據,使其更靠近參考這一數據的任務。以上均在自動化 NUMA 平衡啟用時由內核自動完成。
自動化 NUMA 平衡使用若干算法和數據結構,它們只有在系統中自動化 NUMA 平衡活躍時才能被啟用和分配。
  • 進程內存的周期性 NUMA 取消對應
  • NUMA hinting 故障
  • 故障遷移(MoF,Migrate-on-Fault)——將內存移動至需要運行的程序
  • task_numa_placement ——移動運行的程序,使接近其內存

8.3.1. 配置自動化 NUMA 平衡

自動化 NUMA 平衡在 Red Hat Enterprise Linux 7 中默認啟用,並在 NUMA 屬性硬件中引導時自動激活。
自動化 NUMA 平衡啟用時需滿足以下兩個條件:
  • # numactl --hardware 顯示多個節點,以及
  • # cat /sys/kernel/debug/sched_features 在標識中顯示  NUMA
應用程序的手動 NUMA 調試將會重載自動化 NUMA 平衡,並禁用周期性的內存空白、NUMA 錯誤、遷移和以上應用程序的自動化 NUMA 放置。
在某些情況下,首選系統范圍內的手動 NUMA 調試。
要禁用自動化 NUMA 平衡,請使用以下命令:
# echo 0 > /proc/sys/kernel/numa_balancing
要啟用自動化 NUMA 平衡,請使用以下命令:
# echo 1 > /proc/sys/kernel/numa_balancing

8.4. libvirt NUMA 調試

通常,NUMA 系統通過將客機大小限制在單一 NUMA 節點的資源數量實現最佳性能。應當避免 NUMA 節點中不必要的分散資源。
使用  numastat 工具對進程和操作系統的每個 NUMA 節點內存統計進行查看。
在以下示范中, numastat 工具顯示了 NUMA 節點中的四種非優化內存排列的虛擬機:
# numastat -c qemu-kvm

Per-node process memory usage (in MBs)
PID              Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total
---------------  ------ ------ ------ ------ ------ ------ ------ ------ -----
51722 (qemu-kvm)     68     16    357   6936      2      3    147    598  8128
51747 (qemu-kvm)    245     11      5     18   5172   2532      1     92  8076
53736 (qemu-kvm)     62    432   1661    506   4851    136     22    445  8116
53773 (qemu-kvm)   1393      3      1      2     12      0      0   6702  8114
---------------  ------ ------ ------ ------ ------ ------ ------ ------ -----
Total              1769    463   2024   7462  10037   2672    169   7837 32434
運行  numad,使客機 CPU 和內存資源自動對齊。
接下來再次運行  numastat -c qemu-kvm,以查看  numad 的運行結果。以下輸出顯示了資源已對齊:
# numastat -c qemu-kvm

Per-node process memory usage (in MBs)
PID              Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total
---------------  ------ ------ ------ ------ ------ ------ ------ ------ -----
51747 (qemu-kvm)      0      0      7      0   8072      0      1      0  8080
53736 (qemu-kvm)      0      0      7      0      0      0   8113      0  8120
53773 (qemu-kvm)      0      0      7      0      0      0      1   8110  8118
59065 (qemu-kvm)      0      0   8050      0      0      0      0      0  8051
---------------  ------ ------ ------ ------ ------ ------ ------ ------ -----
Total                 0      0   8072      0   8072      0   8114   8110 32368

注意

同時運行  numastat 和  -c 可提供簡潔的輸出;添加  -m 可將每個節點上系統范圍內的內存信息添加到輸出。更多信息請參見  numastat 手冊頁。

8.4.1. NUMA 虛擬 CPU 釘選

虛擬 CPU 釘選為裸機系統中的任務釘選提供了相似的優點。由於虛擬 CPU 在主機操作系統中作為用戶空間任務運行,釘選將提高緩存效率。例如,當所有虛擬 CPU 線程都在同一個物理 socket 中運行時,將會共享 L3 緩存域。
合並虛擬 CPU 釘選和  numatune 可以避免 NUMA 缺失。NUMA 缺失會對性能帶來顯著影響,通常會有至少 10% 或更多的性能損失。虛擬 CPU 釘選和  numatune 應該同時配置。
當虛擬機在執行存儲或網絡 I/O 任務時,最好將所有的虛擬 CPU 和內存固定至同一個連接到 I/O 適配器的物理 socket。

注意

lstopo 工具可以被用作使 NUMA 拓撲可視化。同時還可以用作驗證虛擬 CPU 在同一個物理插槽中的內核綁定。更多信息請參照知識庫文章,鏈接如下:lstopohttps://access.redhat.com/site/solutions/62879

重要

在虛擬 CPU 的數量遠多於物理內核時,釘選將導致復雜性增加。
以下示例 XML 配置具有固定在物理 CPU 0-7 上的域過程。虛擬線程固定在其自身的 cpuset 上。例如,虛擬 CPU0 被固定在 物理 CPU 0 上,虛擬 CPU1 被固定在物理 CPU 1 上等等:
<vcpu cpuset='0-7'>8</vcpu>
        <cputune>
                <vcpupin vcpu='0' cpuset='0'/>
                <vcpupin vcpu='1' cpuset='1'/>
                <vcpupin vcpu='2' cpuset='2'/>
                <vcpupin vcpu='3' cpuset='3'/>
                <vcpupin vcpu='4' cpuset='4'/>
                <vcpupin vcpu='5' cpuset='5'/>
                <vcpupin vcpu='6' cpuset='6'/>
                <vcpupin vcpu='7' cpuset='7'/>
        </cputune>
虛擬 CPU 與 vcpupin 標簽之間有直接的聯系。如果 vcpupin 選項不是確定的,那么屬性值會被自動指定並會從上一級虛擬 CPU 標簽選項中繼承。以下配置顯示了因為  vcpu 5 丟失的 <vcpupin> 。進而,vCPU5 將會被固定在物理 CPU 0-7 上,正如上一級標簽 <vcpu> 中指定的那樣:
<vcpu cpuset='0-7'>8</vcpu>
        <cputune>
                <vcpupin vcpu='0' cpuset='0'/>
                <vcpupin vcpu='1' cpuset='1'/>
                <vcpupin vcpu='2' cpuset='2'/>
                <vcpupin vcpu='3' cpuset='3'/>
                <vcpupin vcpu='4' cpuset='4'/>
                <vcpupin vcpu='6' cpuset='6'/>
                <vcpupin vcpu='7' cpuset='7'/>
        </cputune>

重要

<vcpupin><numatune> 以及  <emulatorpin> 應該被一同配置,從而實現優化、確定的性能。更多關於  <numatune> 標簽的信息,請查看 第 8.4.2 節 “域進程”。更多關於  <emulatorpin> 標簽的信息,請參照 第 8.4.4 節 “使用 emulatorpin”

8.4.2. 域進程

如 Red Hat Enterprise Linux 所提供的那樣,libvirt 使用 libnuma 來為域進程設定內存綁定政策。這些政策的節點集可以作為  static(在域 XML 中指定),或 auto (通過詢問 numad 進行配置)進行配置。關於如何配置這些 <numatune> 標簽內部的示例,請參考以下 XML 配置:
<numatune>
        <memory mode='strict' placement='auto'/>
</numatune>
<numatune>
        <memory mode='strict' nodeset='0,2-3'/>
</numatune>
libvirt 使用  sched_setaffinity(2) 來為域進程設定 CPU 綁定政策。cpuset 選項既可以是 static(靜態;在域 XML 中指定),也可以是 auto (自動;通過詢問 numad 進行配置)。關於如何配置這些 <vcpu> 標簽內部的示例,請參考以下 XML 配置:
<vcpu placement='auto'>8</vcpu>
<vcpu placement='static' cpuset='0-10,ˆ5'>8</vcpu>
在  <vcpu> 所使用的放置模式和  <numatune> 之間有隱式的繼承規則:
  • <numatune> 的放置模式默認為與  <vcpu> 相同的放置模式,當  <nodeset> 被指定時,則被默認為  static
  • 同樣, <vcpu> 的放置模式默認為與  <numatune> 相同的放置模式,當  <cpuset> 被指定時,則被默認為  static
這意味着為了域進程而進行的 CPU 調試和內存調試可以被單獨指定和定義,但是它們也可以在依賴其他放置模式的情況下進行配置。
也有一種可能,即通過 numad 來配置您的系統,可以啟動選定數量的虛擬 CPU,並且在啟動時不需要固定到所有的虛擬 CPU。
例如,通過 32 個虛擬 CPU 使僅有的 8 個虛擬 CPU 在一個系統中啟動,配置 XML 方式與如下方式類似:
<vcpu placement='auto' current='8'>32</vcpu>

注意

更多關於虛擬 CPU 和 numatune 的信息請參照以下網址:  http://libvirt.org/formatdomain.html#elementsCPUAllocation 和  http://libvirt.org/formatdomain.html#elementsNUMATuning

8.4.3. 域虛擬 CPU 線程

除了調試域進程,libvirt 還允許 XML 配置中每個虛擬 CPU 線程的釘選策略設置。設置  <cputune> 標簽內部每個虛擬 CPU 線程的釘選策略:
<cputune>
        <vcpupin vcpu="0" cpuset="1-4,ˆ2"/>
        <vcpupin vcpu="1" cpuset="0,1"/>
        <vcpupin vcpu="2" cpuset="2,3"/>
        <vcpupin vcpu="3" cpuset="0,4"/>
</cputune>
在這個標簽中,libvirt 可以使用 cgroup 或  sched_setaffinity(2),使虛擬 CPU 線程固定在指定的 cpuset 中。

注意

更多關於  <cputune> 的信息,請參照以下網址:  http://libvirt.org/formatdomain.html#elementsCPUTuning

8.4.4. 使用 emulatorpin

調試域進程釘選策略的另一個方法是使用  <cputune> 中的  <emulatorpin> 標簽。
<emulatorpin> 標簽指定了  emulator(一個域的子集,不包括虛擬 CPU)將被固定的主機物理 CPU。<emulatorpin> 標簽提供了一個將精確關聯設定成仿真線程進程的方法。因此,vhost 線程在同一個物理 CPU 和內存子集中運行,從而可以從緩存位置獲益。例如:
<cputune>
        <emulatorpin cpuset="1-3"/>
</cputune>

注意

在 Red Hat Enterprise Linux 7 中,默認啟用自動化 NUMA 平衡。隨着 vhost-net 仿真線程能夠更加可靠地跟隨虛擬 CPU 任務,自動化 NUMA 平衡減少了手動調試  <emulatorpin> 的需要。關於自動化 NUMA 平衡的更多信息,請參照 第 8.3 節 “自動化 NUMA 平衡”

8.4.5. 用 virsh 調試 vcpu CPU 釘選

重要

這些只是示例命令。您需要依據環境替換屬性值。
以下示例  virsh 命令會將 ID 為 1 的虛擬 CPU 線程( rhel7)固定到物理 CPU 2。
% virsh vcpupin rhel7 1 2
您也可以通過  virsh 命令獲得當前虛擬 CPU 的釘選配置。例如:
% virsh vcpupin rhel7

8.4.6. 用 virsh 調試域進程 CPU 釘選

重要

這些只是示例命令。您需要依據環境替換屬性值。
emulatorpin 選項將 CPU 關聯設置應用到與每個域進程關聯的線程。為了完全固定,您必須給每個客機同時使用  virsh vcpupin(如之前所展示的)和  virsh emulatorpin。例如:
% virsh emulatorpin rhel7 3-4

8.4.7. 用 virsh 調試域進程內存策略

域進程內存可以動態調試。請參考以下示例指令:
% virsh numatune rhel7 --nodeset 0-10
關於這些指令的更多示例,請參見  virsh 手冊頁。

8.4.8. 客機 NUMA 拓撲

客機 NUMA 拓撲可以通過使用  <cpu> 標簽中的  <numa> 標簽在客機虛擬機的 XML 中進行指定。請參照以下示例,並替換相應的屬性值:
<cpu>
        ...
    <numa>
      <cell cpus='0-3' memory='512000'/>
      <cell cpus='4-7' memory='512000'/>
    </numa>
    ...
</cpu>
每個  <cell> 元素指定一個 NUMA cell 或者 NUMA 節點。 cpus 指定了 CPU 或者部分節點的系列 CPU, memory 以千位字節(1,024字節一塊)指定了節點內存。從 0 開始, cellid 或  nodeid 以遞增的次序被指定到每個 cell 或節點。

8.4.9. 向多個客機 NUMA 節點指定主機大頁面

在 Red Hat Enterprise Linux 7.1 中,主機中的大頁面可以被分配到多個客機的 NUMA 節點。這一過程可以優化內存性能,因為客機 NUMA 節點可以被移動到主機 NUMA 節點需要的位置上,同時客機可以繼續使用主機指定的大頁面。
在配置客機 NUMA 節點拓撲后(詳情參考 第 8.4.8 節 “客機 NUMA 拓撲”),在客機 XML 的  <memoryBacking> 元素中指定大頁面的大小和客機 NUMA 節點集。 page size 和  unit 代表主機大頁面的大小。 nodeset 指定了大頁面被分配的客機 NUMA 節點(或若干節點)。
在以下示例中,客機 NUMA 節點 0-5(不包括 NUMA 節點 4)將會使用 1 GB 的大頁面,客機 NUMA 節點 4 將使用 2 MB 的大頁面,無論客機 NUMA 節點在主機的任何位置。為了在客機中使用 1 GB 的大頁面,主機必須先啟動 1 GB 大頁面;啟動 1 GB 大頁面的方法請參考 第 7.3.3 節 “大頁面和透明大頁面(THP)”
<memoryBacking>
        <hugepages/>
          <page size="1" unit="G" nodeset="0-3,5"/>
          <page size="2" unit="M" nodeset="4"/>
        </hugepages>
</memoryBacking>
當一些客機 NUMA 節點和單獨主機 NUMA 節點進行合並起作用時,將允許對大頁面控制的增強,但繼續使用不同的大頁面尺寸。例如,即使客機 NUMA 節點 4 和 5 被移動到了主機的 NUMA 節點 1 上,它們也將繼續使用不同大小的大頁面。

注意

當使用  strict 內存模式時,在 NUMA 節點上不具有足夠可用的大頁面的情況下,客機將無法啟用。關於  <numatune> 標簽中  strict 內存模式選項的配置示例,請參照 第 8.4.2 節 “域進程”

8.4.10. PCI 設備的 NUMA 節點位置

當啟動一個新的虛擬機時,了解主機 NUMA 拓撲和 NUMA 節點中的 PCI 設備歸屬是重要的一點,以便在請求 PCI 傳遞時,客機可以被固定在正確的 NUMA 節點以優化其內存性能。
例如,如果客機被固定在 NUMA 節點 0-1 上,但是其 PCI 設備中的一個隸屬於節點 2,那么節點之間的數據傳輸將花費一段時間。
在 Red Hat Enterprise Linux 7.1 中,libvirt 在客機 XML 中為 PCI 設備報道了 NUMA 節點位置,使管理應用程序完成更好的性能決策。
該信息在  /sys/devices/pci*/*/numa_node 的  sysfs 文件中可見。使用  lstopo 工具來回報 sysfs 數據,可以作為驗證這些設置的一種方法。
# lstopo-no-graphics 
Machine (126GB)
  NUMANode L#0 (P#0 63GB)
    Socket L#0 + L3 L#0 (20MB)
      L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 + PU L#0 (P#0)
      L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 + PU L#1 (P#2)
      L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 + PU L#2 (P#4)
      L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 + PU L#3 (P#6)
      L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 + PU L#4 (P#8)
      L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 + PU L#5 (P#10)
      L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6 + PU L#6 (P#12)
      L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7 + PU L#7 (P#14)
    HostBridge L#0
      PCIBridge
        PCI 8086:1521
          Net L#0 "em1"
        PCI 8086:1521
          Net L#1 "em2"
        PCI 8086:1521
          Net L#2 "em3"
        PCI 8086:1521
          Net L#3 "em4"
      PCIBridge
        PCI 1000:005b
          Block L#4 "sda"
          Block L#5 "sdb"
          Block L#6 "sdc"
          Block L#7 "sdd"
      PCIBridge
        PCI 8086:154d
          Net L#8 "p3p1"
        PCI 8086:154d
          Net L#9 "p3p2"
      PCIBridge
        PCIBridge
          PCIBridge
            PCIBridge
              PCI 102b:0534
                GPU L#10 "card0"
                GPU L#11 "controlD64"
      PCI 8086:1d02
  NUMANode L#1 (P#1 63GB)
    Socket L#1 + L3 L#1 (20MB)
      L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8 + PU L#8 (P#1)
      L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9 + PU L#9 (P#3)
      L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10 + PU L#10 (P#5)
      L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11 + PU L#11 (P#7)
      L2 L#12 (256KB) + L1d L#12 (32KB) + L1i L#12 (32KB) + Core L#12 + PU L#12 (P#9)
      L2 L#13 (256KB) + L1d L#13 (32KB) + L1i L#13 (32KB) + Core L#13 + PU L#13 (P#11)
      L2 L#14 (256KB) + L1d L#14 (32KB) + L1i L#14 (32KB) + Core L#14 + PU L#14 (P#13)
      L2 L#15 (256KB) + L1d L#15 (32KB) + L1i L#15 (32KB) + Core L#15 + PU L#15 (P#15)
    HostBridge L#8
      PCIBridge
        PCI 1924:0903
          Net L#12 "p1p1"
        PCI 1924:0903
          Net L#13 "p1p2"
      PCIBridge
        PCI 15b3:1003
          Net L#14 "ib0"
          Net L#15 "ib1"
          OpenFabrics L#16 "mlx4_0"
此結果表明:
  • NIC  em* 與磁盤  sd* 是與 NUMA 節點 0 和 cores 0、2、4、6、8、10、12、14 連接的。
  • NIC  p1* 與  ib* 是與 NUMA 節點 1 和 cores 1、3、5、7、9、11、13、15 連接的。

8.5. NUMA-Aware 內核同頁合並

內核同頁合並(KSM,Kernel SamePage Merging)允許虛擬機共享相同的內存頁。KSM 可以探測出正在使用 NUMA 內存的系統並控制不同 NUMA 節點中的頁面合並。
使用  sysfs /sys/kernel/mm/ksm/merge_across_nodes 參數來控制不同 NUMA 節點中的頁面合並。在默認情況下,所有節點的頁面都可以進行合並。當該參數被設置為 0 時,只有來自同一個節點的頁面可以合並。
通常,除了系統內存過量的情況下,禁用 KSM 共享可以帶來更好的運行性能。

重要

當 KSM 通過多個客機虛擬機在 NUMA 主機上的節點進行合並時,遠端節點的客機和 CPU 在合並 KSM 頁面的訪問延遲將顯著增加。
通過向客機 XML 添加以下命令,對虛擬機監控程序和客機共享頁面的禁用進行指示:
<memoryBacking>
         <nosharepages/>
</memoryBacking>
#
更多關於使用  <memoryBacking> 元素調試內存設置的信息,請參照 第 7.3.2 節 “使用 virsh 調試內存”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM