php7hugepage,HugePage简介和KVM中使用HugePage
在KVM的測試中,有一項是要測試huge page的使用,所以對Huge Page(巨頁)做了一些了解,結(jié)合網(wǎng)上的一些資料進(jìn)行總結(jié)一下。
現(xiàn)在,有許多的處理器架構(gòu)都支持多種的內(nèi)存頁大小,其中就包括比一般的page size大很多的huge page。就目前來說,盡管在個人電腦中基本都實現(xiàn)了對huge page的支持,然而,huge page的使用主要還是在一些大型服務(wù)器和計算機集群中使用。
1.查看huge page的size是多大? Linux中,可以通過 cat /pro/meminfo | grep Hugepagesize 來查看。
通常情況下,是2048kB即2MB (不同的處理器架構(gòu),可能不一樣) 注:較新的硬件平臺已經(jīng)支持1GB page了。
另外,一般的內(nèi)存頁大小為4kB,可以通過命令:getconf PAGE_SIZE 來查看,一般是4096Byte
也可以通過C程序調(diào)用sysconf()函數(shù)來查詢,示例代碼如下
C
#include
#include /* sysconf(3) */
int main(void) {
printf("The page size for this system is %ld bytes.\n",
sysconf(_SC_PAGESIZE)); /* _SC_PAGE_SIZE is OK too. */
return 0;
}
1
2
3
4
5
6
7
8
9
#include
#include /* sysconf(3) */
intmain(void){
printf("The page size for this system is %ld bytes.\n",
sysconf(_SC_PAGESIZE));/* _SC_PAGE_SIZE is OK too. */
return0;
}
2.huge page的相關(guān)信息:
Shell
cat /proc/meminfo | grep Huge
HugePages_Total: 1024
HugePages_Free: 1024
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
1
2
3
4
5
6
cat/proc/meminfo|grepHuge
HugePages_Total:1024
HugePages_Free:1024
HugePages_Rsvd:0
HugePages_Surp:0
Hugepagesize:2048kB
解釋一下顯示輸出中的幾個參數(shù)的意義吧。
HugePages_Total: Hugepage的頁面數(shù)量
HugePages_Free: 剩余的頁面數(shù)量
HugePages_Rsvd: 被分配預(yù)留但是還沒有使用的page數(shù)目
HugePages_Surp:HugePages_Total減去/proc/sys/vm/nr_hugepages中的值(我對這個理解也不很清楚)。
Hugepagesize: 每單位數(shù)量大小
3.設(shè)置了多少的huge page,free內(nèi)存就會被使用多少。
比如:我使用sysctl vm.nr_hugepages=1024 之后,free命令可以看到free的內(nèi)存會減少2048MB。(這也和Hugepagesize的大小有關(guān))
4.使用Hugepages的內(nèi)存頁是不會被交換出去到磁盤的,永遠(yuǎn)常駐在內(nèi)存中,所以也減少了內(nèi)存頁交換的額外開銷。使用hurgepage的內(nèi)存不能被其他的進(jìn)程使用,所以,一定要合理設(shè)置這個值,避免造成浪費。使用超過8G物理內(nèi)存的系統(tǒng),有人推薦使用HugePage。
HugePages_Free - HugePages_Rsvd部分的內(nèi)存是浪費的,且不能被其他程序使用。在實際應(yīng)用中,盡可能讓HugePages_Free - HugePages_Rsvd=0
5.HugePage的好處:
大大提高了CPU cache中存放的page table所覆蓋的內(nèi)存大小,從而提高了TLB命中率。進(jìn)程的虛擬內(nèi)存地址段先連接到page tables然后再連接到物理內(nèi)存。所以在訪問內(nèi)存時需要先訪問page tables得到虛擬內(nèi)存和物理內(nèi)存的映射關(guān)系,然后再訪問物理內(nèi)存。CPU cache中有一部分TLB(Translation Lookaside Buffer)用來存放部分page table以提高這種裝換的速度。因為page size變大了,所以同樣大小的TLB,所覆蓋的內(nèi)存大小也變大了。提高了TBL命中率,也就是提高了地址轉(zhuǎn)換的速度。
系統(tǒng)進(jìn)程是通過虛擬地址訪問內(nèi)存,但是CPU必須把它轉(zhuǎn)換程物理內(nèi)存地址才能真正訪問內(nèi)存。為了提高這個轉(zhuǎn)換效率,CPU會緩存最近的虛擬內(nèi)存地址和物理內(nèi)存地址的映射關(guān)系,并保存在一個由CPU維護(hù)的映射表中。為了盡量提高內(nèi)存的訪問速度,需要在映射表中保存盡量多的映射關(guān)系。
6.Linux kernel 2.6.X 通過hugetlbfs文件系統(tǒng)對Huge pages進(jìn)行了支持。當(dāng)然Windows也有相應(yīng)的支持,此處暫不詳述。
7.如何設(shè)置huge pages?
首先mount一個hugetlbfs文件系統(tǒng): mount -t hugetlbfs hugetlbfs /dev/hugepages
然后為huge pages保留一定數(shù)量的內(nèi)存:sysctl vm.nr_hugepages=1024
(另一個操作方法,在/etc/sysctl.conf加入如下配置就可以:vm.nr_hugepages=1024 修改后,用命令sysctl -p 使得設(shè)置生效)
(或者,改動linux啟動的grub參數(shù)也是可以的,加上 hugepages=1024 這樣的參數(shù))
8.KVM如何讓guest使用huge pages ?
首先,讓host開啟huge pages(像上面那樣設(shè)置)
在qemu啟動時加上參數(shù),示例:qemu-system-x86_64 -m 2048 -hda /mnt/rhel6.img -mem-path /dev/hugepages
如果是用libvirt來啟動KVM的,那么需要在啟動guest的XML配置文件中添加如下的參數(shù):
XHTML
1
2
3
(啟動guest后,可以發(fā)現(xiàn),在host中的cat /pro/meminfo看到的HugePages_Free數(shù)量有所減少)
9.很多Oracle DBA對hugepages比較關(guān)心的,他們也寫了些關(guān)于huge pages的東西,可以看看后面的參考資料,有DBA建議將huge pages的大小設(shè)置為SGA的大小。關(guān)于Oracle的SGA這些細(xì)節(jié),我也不甚了解:TheSGA(System Global Area) is an area of memory (RAM) allocated when an Oracle Instance starts up. The SGA's size and function are controlled by initialization (INIT.ORA or SPFILE) parameters.
一些參考資料:
http://en.wikipedia.org/wiki/Huge_pages
http://www.mjmwired.net/kernel/Documentation/vm/hugetlbpage.txt
http://space.itpub.net/231499/viewspace-366360
http://space.itpub.net/23650854/viewspace-689545
http://fedoraproject.org/wiki/Features/KVM_Huge_Page_Backed_Memory
總結(jié)
以上是生活随笔為你收集整理的php7hugepage,HugePage简介和KVM中使用HugePage的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做前端网页需要用网页框架吗
- 下一篇: openwrt U盘安装php,db12