PostgreSQL hugepage 支持

less than 1 minute read

背景

PostgreSQL启动大页支持很简单,只需要配置几个东西。

1. postgresql.conf

huge_pages = on  
shared_buffers = 8GB  # 使用8G内存  

2. 操作系统

配置grub.conf,加入如下,重启系统

numa=off  
transparent_hugepage=never  

在/etc/rc.local中加入下面的几行,然后重启操作系统:

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then  
   echo never > /sys/kernel/mm/transparent_hugepage/enabled  
fi  
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then  
   echo never > /sys/kernel/mm/transparent_hugepage/defrag  
fi  

3. 配置大页数量

cat /proc/meminfo |grep -i huge  
AnonHugePages:         0 kB  
HugePages_Total:       0  
HugePages_Free:        0  
HugePages_Rsvd:        0  
HugePages_Surp:        0  
Hugepagesize:       2048 kB  

每页2MB,一共需要8GB,所以配置为4096

vi /etc/sysctl.conf  
vm.nr_hugepages = 4096  

启动数据库,如果发现报这个错误,

huge TLB pages not supported on this platform  

说明系统编译时,检测到OS不支持大页,那么怎么解决呢?

src/backend/port/sysv_shmem.c  
src/backend/port/pg_shmem.c  
/*  
 * Creates an anonymous mmap()ed shared memory segment.  
 *  
 * Pass the requested size in *size.  This function will modify *size to the  
 * actual size of the allocation, if it ends up allocating a segment that is  
 * larger than requested.  
 */  
#ifndef EXEC_BACKEND  
static void *  
CreateAnonymousSegment(Size *size)  
{  
        Size            allocsize = *size;  
        void       *ptr = MAP_FAILED;  
        int                     mmap_errno = 0;  
  
#ifndef MAP_HUGETLB  
        if (huge_pages == HUGE_PAGES_ON)  
                ereport(ERROR,  
                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),  
                                 errmsg("huge TLB pages not supported on this platform")));  
#else  
......  

实际上MAP_HUGETLB是在系统的/usr/include/sys/mman.h 中定义的,如果没有定义,PG就不支持大页。

#include <bits/mman.h>  

在文件 /usr/include/bits/mman.h 中加入以下行,重新编译PostgreSQL即可。

# define MAP_HUGETLB    0x40000         /* Create huge page mapping.  */  

重新编译PostgreSQL后,重启数据库。

参考

1. http://www.postgresql.org/message-id/flat/54B9C41D.10109@jcvi.org#54B9C41D.10109@jcvi.org

2. http://terryebase.com/?p=161

Flag Counter

digoal’s 大量PostgreSQL文章入口