php7hugepage,HugePage简介和KVM中使用HugePage
在KVM的測試中,有一項是要測試huge page的使用,所以對Huge Page(巨頁)做了一些了解,結合網上的一些資料進行總結一下。
現在,有許多的處理器架構都支持多種的內存頁大小,其中就包括比一般的page size大很多的huge page。就目前來說,盡管在個人電腦中基本都實現了對huge page的支持,然而,huge page的使用主要還是在一些大型服務器和計算機集群中使用。
1.查看huge page的size是多大? Linux中,可以通過 cat /pro/meminfo | grep Hugepagesize 來查看。
通常情況下,是2048kB即2MB (不同的處理器架構,可能不一樣) 注:較新的硬件平臺已經支持1GB page了。
另外,一般的內存頁大小為4kB,可以通過命令:getconf PAGE_SIZE 來查看,一般是4096Byte
也可以通過C程序調用sysconf()函數來查詢,示例代碼如下
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的相關信息:
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
解釋一下顯示輸出中的幾個參數的意義吧。
HugePages_Total: Hugepage的頁面數量
HugePages_Free: 剩余的頁面數量
HugePages_Rsvd: 被分配預留但是還沒有使用的page數目
HugePages_Surp:HugePages_Total減去/proc/sys/vm/nr_hugepages中的值(我對這個理解也不很清楚)。
Hugepagesize: 每單位數量大小
3.設置了多少的huge page,free內存就會被使用多少。
比如:我使用sysctl vm.nr_hugepages=1024 之后,free命令可以看到free的內存會減少2048MB。(這也和Hugepagesize的大小有關)
4.使用Hugepages的內存頁是不會被交換出去到磁盤的,永遠常駐在內存中,所以也減少了內存頁交換的額外開銷。使用hurgepage的內存不能被其他的進程使用,所以,一定要合理設置這個值,避免造成浪費。使用超過8G物理內存的系統,有人推薦使用HugePage。
HugePages_Free - HugePages_Rsvd部分的內存是浪費的,且不能被其他程序使用。在實際應用中,盡可能讓HugePages_Free - HugePages_Rsvd=0
5.HugePage的好處:
大大提高了CPU cache中存放的page table所覆蓋的內存大小,從而提高了TLB命中率。進程的虛擬內存地址段先連接到page tables然后再連接到物理內存。所以在訪問內存時需要先訪問page tables得到虛擬內存和物理內存的映射關系,然后再訪問物理內存。CPU cache中有一部分TLB(Translation Lookaside Buffer)用來存放部分page table以提高這種裝換的速度。因為page size變大了,所以同樣大小的TLB,所覆蓋的內存大小也變大了。提高了TBL命中率,也就是提高了地址轉換的速度。
系統進程是通過虛擬地址訪問內存,但是CPU必須把它轉換程物理內存地址才能真正訪問內存。為了提高這個轉換效率,CPU會緩存最近的虛擬內存地址和物理內存地址的映射關系,并保存在一個由CPU維護的映射表中。為了盡量提高內存的訪問速度,需要在映射表中保存盡量多的映射關系。
6.Linux kernel 2.6.X 通過hugetlbfs文件系統對Huge pages進行了支持。當然Windows也有相應的支持,此處暫不詳述。
7.如何設置huge pages?
首先mount一個hugetlbfs文件系統: mount -t hugetlbfs hugetlbfs /dev/hugepages
然后為huge pages保留一定數量的內存:sysctl vm.nr_hugepages=1024
(另一個操作方法,在/etc/sysctl.conf加入如下配置就可以:vm.nr_hugepages=1024 修改后,用命令sysctl -p 使得設置生效)
(或者,改動linux啟動的grub參數也是可以的,加上 hugepages=1024 這樣的參數)
8.KVM如何讓guest使用huge pages ?
首先,讓host開啟huge pages(像上面那樣設置)
在qemu啟動時加上參數,示例:qemu-system-x86_64 -m 2048 -hda /mnt/rhel6.img -mem-path /dev/hugepages
如果是用libvirt來啟動KVM的,那么需要在啟動guest的XML配置文件中添加如下的參數:
XHTML
1
2
3
(啟動guest后,可以發現,在host中的cat /pro/meminfo看到的HugePages_Free數量有所減少)
9.很多Oracle DBA對hugepages比較關心的,他們也寫了些關于huge pages的東西,可以看看后面的參考資料,有DBA建議將huge pages的大小設置為SGA的大小。關于Oracle的SGA這些細節,我也不甚了解: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
總結
以上是生活随笔為你收集整理的php7hugepage,HugePage简介和KVM中使用HugePage的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做前端网页需要用网页框架吗
- 下一篇: openwrt U盘安装php,db12