第一章 大頁內(nèi)存與小頁內(nèi)存
1.1 小頁內(nèi)存
在Linux系統(tǒng)中,默認(rèn)情況下,內(nèi)存管理器將物理內(nèi)存劃分為小頁(4KB)或大頁(2MB或1GB)的大小。Linux內(nèi)核會根據(jù)需要分配和釋放內(nèi)存,以確保系統(tǒng)的穩(wěn)定性和性能。
在默認(rèn)情況下,Linux系統(tǒng)會使用小頁內(nèi)存。小頁內(nèi)存管理器能夠更好地處理內(nèi)存碎片,但是在處理大量內(nèi)存時,可能會導(dǎo)致性能下降。
1.2 大頁內(nèi)存
大頁內(nèi)存是一種更高效的內(nèi)存分配方式,它將物理內(nèi)存劃分為更大的內(nèi)存頁,通常是2MB或1GB。相比之下,小頁內(nèi)存通常是4KB。
大頁內(nèi)存可以提高系統(tǒng)的性能,因為它減少了內(nèi)存管理器的負(fù)擔(dān)。大頁內(nèi)存還可以減少缺頁中斷的數(shù)量,從而提高系統(tǒng)的響應(yīng)速度。
但是,使用大頁內(nèi)存需要更多的物理內(nèi)存,并且在處理小量的內(nèi)存時可能會浪費內(nèi)存。此外,大頁內(nèi)存的分配和釋放需要更長的時間,因為它們的大小更大。
1.3 舉個栗子
舉個例子,假設(shè)系統(tǒng)需要為一個應(yīng)用程序分配1GB內(nèi)存,如果使用小頁內(nèi)存,系統(tǒng)將需要分配262144個4KB頁。在這種情況下,內(nèi)存管理器將需要處理262144個頁表,這會導(dǎo)致CPU的負(fù)載增加,并且可能會導(dǎo)致較高的延遲。
相比之下,使用大頁內(nèi)存可以減少系統(tǒng)的頁表數(shù)量,從而降低內(nèi)存管理器的負(fù)擔(dān)。例如,如果使用2MB的大頁內(nèi)存,系統(tǒng)將只需要分配512個頁表,這將顯著減少CPU的負(fù)載和響應(yīng)時間。
另外,小頁內(nèi)存還可能會導(dǎo)致內(nèi)存碎片問題。當(dāng)系統(tǒng)分配和釋放大量小頁內(nèi)存時,可能會產(chǎn)生很多碎片,這會使內(nèi)存管理器更難以找到連續(xù)的可用內(nèi)存塊,從而降低性能。
因此,在大量使用內(nèi)存時,使用大頁內(nèi)存可以提高系統(tǒng)的性能和響應(yīng)速度。
第二章 如何配置虛擬機(jī)使用大頁內(nèi)存
2.1 Fusionsphere OpenStack中配置
1、如果想在Fusionsphere中使用大頁內(nèi)存,需要在CPS中進(jìn)行配置(https://方向代理地址:8890)2、選擇“配置 > 內(nèi)核參數(shù)”,在配置內(nèi)核參數(shù)頁面開啟自動大頁內(nèi)存并設(shè)置大頁內(nèi)存的大小即可(一般會設(shè)置為1024M即1G),開啟后需要重啟主機(jī)生效。

重啟后可查看內(nèi)核參數(shù)主機(jī)組的生效情況,也可以登陸某臺主機(jī),使用以下方式查看:
查看/proc/meminfo文件:
cat?/proc/meminfo- 在輸出中查找“HugePages_Total”和“Hugepagesize”字段。如果這些字段存在,則表示系統(tǒng)開啟了大頁內(nèi)存,并且“Hugepagesize”字段將顯示大頁的大小。
- 例如,以下是包含“HugePages_Total”和“Hugepagesize”字段的示例輸出:
MemTotal:???????131881008?kB
MemFree:????????115646736?kB
MemAvailable:???124197000?kB
Buffers:???????????32000?kB
Cached:??????????8918052?kB
SwapCached:????????????0?kB
Active:??????????9229648?kB
Inactive:????????4845996?kB
Active(anon):????4443312?kB
Inactive(anon):??1104812?kB
Active(file):????4786336?kB
Inactive(file):??3741184?kB
Unevictable:???????????0?kB
Mlocked:???????????????0?kB
SwapTotal:???????8388604?kB
SwapFree:????????8388604?kB
Dirty:???????????????496?kB
Writeback:?????????????0?kB
AnonPages:???????5395160?kB
Mapped:??????????1392456?kB
Shmem:???????????1182520?kB
KReclaimable:????1077360?kB
Slab:????????????1306016?kB
SReclaimable:????1077360?kB
SUnreclaim:???????228656?kB
KernelStack:???????19296?kB
PageTables:????????47668?kB
NFS_Unstable:??????????0?kB
Bounce:????????????????0?kB
WritebackTmp:??????????0?kB
CommitLimit:????74977308?kB
Committed_AS:???10219164?kB
VmallocTotal:???34359738367?kB
VmallocUsed:??????726788?kB
VmallocChunk:???34358939728?kB
HardwareCorrupted:?????0?kB
AnonHugePages:???2064384?kB
ShmemHugePages:????????0?kB
ShmemPmdMapped:????????0?kB
HugePages_Total:????1024
HugePages_Free:??????1024
HugePages_Rsvd:?????????0
HugePages_Surp:?????????0
Hugepagesize:???????2048?kB
DirectMap4k:?????4112384?kB
DirectMap2M:???131072000?kB
DirectMap1G:?????????0?kB在這個示例中,輸出中包含“HugePages_Total”和“Hugepagesize”字段,表示系統(tǒng)開啟了大頁內(nèi)存,大頁大小為2048KB。
如果“HugePages_Total”字段為0,則表示系統(tǒng)未開啟大頁內(nèi)存。
總之,要查看系統(tǒng)是否開啟了大頁內(nèi)存以及大頁大小,可以查看/proc/meminfo文件并查找“HugePages_Total”和“Hugepagesize”字段。如果這些字段存在,則表示系統(tǒng)開啟了大頁內(nèi)存,并且“Hugepagesize”字段將顯示大頁的大小。
3、創(chuàng)建規(guī)格時,設(shè)置對應(yīng)的大頁內(nèi)存大小即可。

2.2 KVM虛擬機(jī)配置
要配置KVM虛擬機(jī)使用大頁內(nèi)存,需要執(zhí)行以下步驟:
- 確認(rèn)主機(jī)支持大頁內(nèi)存:運(yùn)行以下命令檢查主機(jī)是否支持大頁內(nèi)存:
grep?-E?'(vmx|svm)'?/proc/cpuinfo如果輸出中包含“vmx”或“svm”,則表示主機(jī)支持大頁內(nèi)存。
- 配置主機(jī)使用大頁內(nèi)存:運(yùn)行以下命令以啟用大頁內(nèi)存:
echo?1?>?/sys/kernel/mm/transparent_hugepage/enabled
echo?always?>?/sys/kernel/mm/transparent_hugepage/defrag這將啟用大頁內(nèi)存并啟用自動碎片整理。
- 配置KVM虛擬機(jī)使用大頁內(nèi)存:在創(chuàng)建虛擬機(jī)時,使用以下命令配置虛擬機(jī)使用大頁內(nèi)存:
virt-install?--name?myvm?--ram?4096?--memorybacking?hugepages=yes?--vcpus?2?--cdrom?/path/to/iso?--disk?path=/var/lib/libvirt/images/myvm.img,size=20?--network?default?--graphics?vnc這將創(chuàng)建一個名為“myvm”的虛擬機(jī),該虛擬機(jī)使用4GB RAM,2個CPU,20GB磁盤空間和默認(rèn)網(wǎng)絡(luò),同時啟用大頁內(nèi)存。
對于已存在的虛擬機(jī),可以修改其xml文件使其使用大頁內(nèi)存。要在XML文件中配置KVM虛擬機(jī)使用大頁內(nèi)存,需要將以下配置添加到XML文件中:
<memoryBacking>
??<hugepages/>
</memoryBacking>具體來說,可以使用以下步驟在XML文件中配置大頁內(nèi)存:
打開XML文件并定位到
<memory>元素。在元素內(nèi)部添加以下代碼:
<memoryBacking>
??<hugepages/>
</memoryBacking>- 保存XML文件并使用
virsh define命令重新定義虛擬機(jī)。
例如,以下是一個XML文件的示例,其中包含配置大頁內(nèi)存的代碼:
<domain?type='kvm'>
??<name>myvm</name>
??<memory?unit='KiB'>4194304</memory>
??<vcpu?placement='static'>2</vcpu>
??<os>
????<type?arch='x86_64'?machine='pc-i440fx-2.10'>hvm</type>
????<boot?dev='hd'/>
??</os>
??<devices>
????<disk?type='file'?device='disk'>
??????<driver?name='qemu'?type='qcow2'/>
??????<source?file='/var/lib/libvirt/images/myvm.img'/>
??????<target?dev='vda'?bus='virtio'/>
????</disk>
????<interface?type='network'>
??????<mac?address='52:54:00:2a:2c:6e'/>
??????<source?network='default'/>
??????<model?type='virtio'/>
????</interface>
??</devices>
??<memoryBacking>
????<hugepages/>
??</memoryBacking>
</domain>在這個示例中,<memoryBacking>元素包含<hugepages/>元素,表示該虛擬機(jī)將使用大頁內(nèi)存。
總之,要在XML文件中配置KVM虛擬機(jī)使用大頁內(nèi)存,只需要在<memoryBacking>元素中添加<hugepages/>元素即可。
2.3 Nova創(chuàng)建虛擬機(jī)時配置
nova?boot?--flavor?<flavor_id>?--image?<image_id>?--nic?net-id=<network_id>?--availability-zone?<availability_zone>?--key-name?<key_name>?--config-drive?true?--block-device-mapping?vda=<volume_id>:::0?--hints?large_page=true?<vm_name>其中,--hints large_page=true參數(shù)啟用大頁內(nèi)存。
第三章 總結(jié)
使用大頁內(nèi)存可以提高系統(tǒng)的性能,但需要更多的物理內(nèi)存。要配置KVM虛擬機(jī)使用大頁內(nèi)存,需要在主機(jī)上啟用大頁內(nèi)存,并在創(chuàng)建虛擬機(jī)時啟用大頁內(nèi)存。
如果您喜歡我的文章,歡迎關(guān)注我的同名公眾號哦~
本文使用 文章同步助手 同步