原文: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 概述
 
            圖 1.1. KVM 構架
1.2. KVM 性能構架概述
-  
             使用 KVM 時,客機作為一個 Linux 的進程在主機上運行。
 -  
             虛擬 CPU(vCPU)作為正常線程執行,由 Linux 調度器執行。
 -  
             客機會繼承諸如內核中的 NUMA 和大頁面一類的功能。
 -  
             主機中的磁盤和網絡 I/O 設置對性能有顯著影響。
 -  
             網絡流量通常通過基於軟件的網橋傳送。
 
1.3. 虛擬化性能特性和改進
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 節流”。
 
 -  
                
 
注意
第 2 章 性能監控工具
2.1. 簡介
2.2. perf kvm
kvm 選項的  
           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 命令將它們復制到主機使用的過程。 
             -  
登錄客戶端並保存文件
登錄客戶端並將/proc/modules和/proc/kallsyms保存到臨時位置,文件名為/tmp:# cat /proc/modules > /tmp/modules # cat /proc/kallsyms > /tmp/kallsyms
 -  
將臨時文件復制到主機
在您退出客戶端之后,運行以下scp命令,將已保存的文件復制到主機。如果 TCP 端口和主機名稱不符,應替換主機名稱:# scp root@GuestMachine:/tmp/kallsyms guest-kallsyms # scp root@GuestMachine:/tmp/modules guest-modules
現在您在主機上擁有了兩個客戶端的文件(guest-kallsyms和guest-modules),准備就緒通過perf kvm命令進行使用。 -  
通過 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 停止紀錄。 -  
報告事件
以下示例命令使用紀錄過程中獲取的文件,並將輸出重新定向到一個新文件: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. 虛擬性能監控單位
arch_perfmon 標識: 
          # cat /proc/cpuinfo|grep arch_perfmon 
          host-passthrough 在客戶虛擬機中指定  
           cpu mode: 
          # virsh dumpxml guest_name |grep "cpu mode"
<cpu mode='host-passthrough'> 
          perf 命令顯示虛擬機的性能數據。 
          第 3 章 virt-manager
3.1. 簡介
3.2. 操作系統細節和設備
3.2.1. 客戶虛擬機細節詳述
 
              圖 3.1. 提供操作系統類型和版本
3.2.2. 刪除不使用的設備
 
              圖 3.2. 移除不使用的設備
3.3. CPU 性能選項
 
            圖 3.3. CPU 性能選項
3.3.1. 選項:可用的 CPU
 
              圖 3.4. 過度使用 CPU
重要
3.3.2. 選項:CPU 配置
 
              圖 3.5. CPU 配置選項
注意
注意
virsh capabilities 命令,查看系統虛擬化功能,包括 CPU 類型和 NUMA 功能。 
             3.3.3. 選項:CPU 拓撲
 
              圖 3.6. CPU 拓撲選項
注意
3.3.4. 選項:CPU 釘選(pinning)
 
              圖 3.7. CPU 釘選
警告
lscpu 命令輸出,使用  
            virsh cpupin 在虛擬 CPU 綁定建立 1:1 物理 CPU。NUMA 和 CPU 釘選的更多信息請參照 
            第 8 章 NUMA。 
           3.4. 虛擬磁盤性能選項
 
             圖 3.8. 虛擬磁盤性能選項
重要
第 4 章 tuned
4.1. 簡介
4.2. tuned 和 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 主機。 
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.conf 手冊頁。 
          tuned-adm active 
          tuned-adm profile profile_name 
          virtual-host 文件,請運行: 
          tuned-adm profile virtual-host 
          重要
tuned-adm off 
          注意
第 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讓重啟后這設置得以持續。 
注意
5.3. Virtio 和 vhost_net
 
            圖 5.1. Virtio 和 vhost_net 構架
5.4. 設備分配和 SR-IOV
 
            圖 5.2. 設備分配和 SR-IOV
5.5. 網絡調試技巧
5.5.1. 橋接零復制傳輸
experimental_zcopytx kernel 模塊參數設置到 1。 
           注意
experimental_zcopytx 設置到 0 被禁用。 
           5.5.2. 多隊列 virtio-net
-  
              流量數據包相對較大。
 -  
              客機同時在各種連接中活躍,流量從客機、客機到主機或客戶端運行到外部系統。
 -  
              隊列數量與虛擬 CPU 相同。因為多隊列支持可以優化 RX 中斷關聯和 TX 隊列選擇,實現特定隊列對於特定虛擬 CPU 的私有化。
 
注意
5.5.2.1. 配置多隊列 virtio-net
<interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
      <driver name='vhost' queues='N'/>
</interface> 
            # ethtool -L eth0 combined M 
           第 6 章 塊 I/O
6.1. 簡介
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 -  
             列出一個或多個設備/權值組群的單獨字符串,以
為格式。每一個權值必須在 100-1,000 范圍內,或者 0 值從每一個設備列表刪除該設備。只修改字符串中列出的設備;任何現有的其它設備的權值保持不改變。/path/to/device,weight,/path/to/device,weight -  
             
config -  
             添加
選項,使更改在下次啟動時生效。--config -  
             
live -  
             添加
選項,在運行的虛擬機中應用這些更改。--live注意
選項要求監控程序支持這一行為。並非所有監控程序都允許最大內存限制的實時更改。--live -  
             
current -  
             添加
選項,在當前的虛擬機中應用這些更改。--current 
注意
virsh blkiotune 命令使用的更多信息,請參照  
             # virsh help blkiotune。 
            6.3. 緩存
表 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 | 如果沒有指定緩存模式,將會選擇系統默認設置。 | 
driver 標簽內部的  
           cache,指定一個緩存選項。例如,將緩存設置為  
           writeback: 
           <disk type='file' device='disk'>  
          <driver name='qemu' type='raw' cache='writeback'/> 
          6.4. I/O 模式
表 6.2. IO 模式選項
| IO 模式選項 | 描述 | 
|---|---|
| IO=native | Red Hat Enterprise Virtualization 環境的默認值。該模式適用於直接 I/O 選項的 kernel 非同步 I/O。 | 
| IO=threads | 默認為基於主機用戶模式的線程。 | 
| IO=default | Red Hat Enterprise Linux 7 默認為線程模式。 | 
driver 標簽中的  
           io 設置,指定  
           native、 
           threads 或  
           default。例如,將 I/O 模式設置為  
           threads: 
           <disk type='file' device='disk'>  
          <driver name='qemu' type='raw' io='threads'/> 
          6.5. 塊 I/O 調試技術
6.5.1. 磁盤 I/O 節流
virsh blkdeviotune 命令為虛擬機設置 I/O 限制。請參照以下示例: 
           # virsh blkdeviotune virtual_machine device --parameter limit
<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
6.5.2.1. 配置多隊列 virtio-scsi
   <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/ 
注意
7.3.2. 使用 virsh 調試內存
<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)
過程 7.1. 為客機啟用 1GB 大頁面
-  
              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
 -  
              接下來,將 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
 -  
              重啟 libvirtd,使 1GB 大頁面可以在客機上啟用:
# systemctl restart libvirtd
 
7.3.3.1. 透明大頁面配置
/sys/kernel/mm/transparent_hugepage/enabled 被設置為  
             always,透明大頁面將被默認使用。運行以下命令禁用透明大頁面: 
            # echo never > /sys/kernel/mm/transparent_hugepage/enabled 
            7.3.3.2. 靜態大頁面配置
virsh edit 向客機 XML 配置添加以下命令: 
            <memoryBacking>
        <hugepages/>
</memoryBacking> 
            <memoryBacking> 元素中指定大頁面的大小、單位和客機的 NUMA 節點集。關於配置的更多信息和具體示例,請參照 
             第 8.4.9 節 “向多個客機 NUMA 節點指定主機大頁面”。 
            cat /proc/sys/vm/nr_hugepages 
            過程 7.2. 大頁面設置
-  
               查看當前的大頁面值:
# cat /proc/meminfo | grep HugeAnonHugePages: 2048 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB -  
               大頁面將以 2MB 為增量進行設置。將大頁面的數量設置到 25,000,請運行以下命令:
echo 25000 > /proc/sys/vm/nr_hugepages注意
此外,如需進行永久設置,請使用# sysctl -w vm.nr_hugepages=N命令和顯示為大頁面數量的 N。 -  
               大頁面掛載:
# mount -t hugetlbfs hugetlbfs /dev/hugepages -  
               重啟 libvirtd,之后再運行以下命令重啟虛擬機:
# systemctl start libvirtd# virsh start virtual_machine -  
               驗證
/proc/meminfo中的更改:# cat /proc/meminfo | grep HugeAnonHugePages: 0 kB HugePages_Total: 25000 HugePages_Free: 23425 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB 
第 8 章 NUMA
8.1. 簡介
8.2. NUMA 內存分配策略
-  
             
Strict -  
             目標節點中不能分配內存時,分配將被默認操作轉進至其他節點。嚴格的策略意味着,當目標節點中不能分配內存時,分配將會失效。
 -  
             
Interleave -  
             內存頁面將被分配至一項節點掩碼指定的節點,但將以輪循機制的方式分布。
 -  
             
Preferred -  
             內存將從單一最優內存節點分配。如果內存並不充足,內存可以從其他節點分配。
 
<numatune>
        <memory mode='preferred' nodeset='0'>
</numatune> 
         8.3. 自動化 NUMA 平衡
-  
             進程內存的周期性 NUMA 取消對應
 -  
             NUMA hinting 故障
 -  
             故障遷移(MoF,Migrate-on-Fault)——將內存移動至需要運行的程序
 -  
             task_numa_placement ——移動運行的程序,使接近其內存
 
8.3.1. 配置自動化 NUMA 平衡
-  
              
# numactl --hardware顯示多個節點,以及 -  
              
# cat /sys/kernel/debug/sched_features在標識中顯示NUMA 
# echo 0 > /proc/sys/kernel/numa_balancing 
           # echo 1 > /proc/sys/kernel/numa_balancing 
          8.4. libvirt 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 釘選
numatune 可以避免 NUMA 缺失。NUMA 缺失會對性能帶來顯著影響,通常會有至少 10% 或更多的性能損失。虛擬 CPU 釘選和  
            numatune 應該同時配置。 
           注意
重要
<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> 
           <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. 域進程
<numatune> 標簽內部的示例,請參考以下 XML 配置: 
           <numatune>
        <memory mode='strict' placement='auto'/>
</numatune> 
           <numatune>
        <memory mode='strict' nodeset='0,2-3'/>
</numatune> 
           <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。 
<vcpu placement='auto' current='8'>32</vcpu>
注意
8.4.3. 域虛擬 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> 
           注意
<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> 
           注意
<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 拓撲
<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 節點指定主機大頁面
<memoryBacking> 元素中指定大頁面的大小和客機 NUMA 節點集。 
            page size 和  
            unit 代表主機大頁面的大小。 
            nodeset 指定了大頁面被分配的客機 NUMA 節點(或若干節點)。 
           <memoryBacking>
        <hugepages/>
          <page size="1" unit="G" nodeset="0-3,5"/>
          <page size="2" unit="M" nodeset="4"/>
        </hugepages>
</memoryBacking> 
           注意
strict 內存模式時,在 NUMA 節點上不具有足夠可用的大頁面的情況下,客機將無法啟用。關於  
              <numatune> 標簽中  
              strict 內存模式選項的配置示例,請參照 
              第 8.4.2 節 “域進程”。 
             8.4.10. 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 內核同頁合並
sysfs /sys/kernel/mm/ksm/merge_across_nodes 參數來控制不同 NUMA 節點中的頁面合並。在默認情況下,所有節點的頁面都可以進行合並。當該參數被設置為 0 時,只有來自同一個節點的頁面可以合並。 
          重要
<memoryBacking>
         <nosharepages/>
</memoryBacking>
# 
          <memoryBacking> 元素調試內存設置的信息,請參照 
           第 7.3.2 節 “使用 virsh 調試內存”。 
          