PostgreSQL hugepage 支持

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即可。

vi /usr/include/bits/mman.h

#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

时间: 2024-10-30 11:53:22

PostgreSQL hugepage 支持的相关文章

PostgreSQL 利用编译器extension 支持int128,提升聚合性能

标签 PostgreSQL , int128 , clang , gcc , icc 背景 PostgreSQL 9.4以及以前的版本,在INT,INT2,INT8的聚合计算中,为了保证数据不会溢出,中间结果使用numeric来存储. numeric是PostgreSQL自己实现的一种数值类型,可以存储非常大的数值(估计是做科学计算的需求),但是牺牲了一定的性能. 为了提高聚合,特别是大数据量的聚合时的性能,社区借用了编译器支持的int128类型,作为数据库int, int2, int8的中间计

PostgreSQL 10.0 preview 功能增强 - 逻辑复制支持并行COPY初始化数据

标签 PostgreSQL , 10.0 , 逻辑复制 , 初始数据COPY 背景 PostgreSQL 已支持逻辑复制,同时对逻辑复制增加了一个初始同步的增强功能,支持通过wal receiver协议跑COPY命令(已封装在逻辑复制的内核代码中),支持多表并行. 也就是说,你可以使用PostgreSQL的逻辑复制,快速的(流式.并行)将一个实例迁移到另一个实例. Logical replication support for initial data copy Add functionalit

PostgreSQL distinct 与 Greenplum distinct 的实现与优化

标签 PostgreSQL , distinct , 多distinct , groupagg , hashagg , sort , hyperloglog , 估值 背景 求distinct是业务的一个普遍需求,例如每天有多少用户,每个省份有多少用户,每天有多少类目的用户等. select date,count(dinstinct user) from tbl group by date; select date, province, count(distinct user) from tbl

评价:MySQL和PostgreSQL的优劣较量

这篇文章中,我们选用MySQL 4.0.2-alpha与PostgreSQL 7.2进行比较,因为MySQL 4.0.2-alpha开始支持事务的概念,因此这样的比较对于MySQL应该较为有利. 我们这样的比较不想仅仅成为一份性能测试报告,因为至少从我个人来看,对于一个数据库,稳定性和速度并不能代表一切.对于一个成熟的数据库,稳定性肯定会日益提供.而随着硬件性能的飞速提高,速度也不再是什么太大的问题. 一.两者的共同优势 这两个产品都属于开放源码的一员,性能和功能都在高速地提高和增强.MySQL

数据库支持选项

数据|数据库 PHP对许多数据库有内置的支持(也有ODBC) Adabas D --with-adabas=DIR 编译的时候加入对Adabas D 数据库的支持.这个参数是Adabas D的安装目录,缺省是/usr/local/adabasd. DBase --with-dbase 激活内置的Dbase数据库的支持,不需要外部的库. FilePro 激活内置的只读的filePro的支持,不需要外部的库. mSQL --with-msql=DIR 为了激活mSQL的支持,这个选项的参数是mSQL

MySQL和PostgreSQL两数据库的对决

在这篇文章中,我们选用MySQL 4.0.2-alpha与PostgreSQL 7.2进行比较,因为MySQL 4.0.2-alpha开始支持事务的概念,因此这样的比较对于MySQL应该较为有利.我们这样的比较不想仅仅成为一份性能测试报告,因为至少从我个人来看,对于一个数据库,稳定性和速度并不能代表一切.对于一个成熟的数据库,稳定性肯定会日益提供.而随着硬件性能的飞速提高,速度也不再是什么太大的问题. 一.前言 前一段时间,我曾经翻译过一篇 将你的网站从MySQL改为PostgreSQL ,其实

MySQL与PostgreSQL比较哪个数据库更好?

  如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与PostgreSQL之间犹豫不定.MySQL与PostgreSQL都是免费.开源.强大.且功能丰富的数据库.你主要的问题可能是:哪一个才是最好的开源数据库,MySQL还是PostgreSQL呢?该选择哪一个开源数据库呢? 在选择数据库时,你所做的是个长期的决策,因为后面如果再改变决定将是非常困难且代价高昂的.你希望一开始就选择正确.两个流行的开源数据库MySQL与PostgreSQL常常成为最后要选择的产品.对这两个开源数据

PostgreSQL MySQL 兼容性之 - 字符串类型

char MySQL [NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name] A fixed-length string that is always right-padded with spaces to the specified length when stored. M represents the column length in characters. The range of M is 0

MySQL与PostgreSQL:该选择哪个开源数据库?哪一个更好?

Naresh Kumar是一位软件工程师与热情的博主,对编程与新事物充满了激情和兴趣.近日,Naresh撰写了一篇博文,对开源世界最常见的两种数据库MySQL与PostgreSQL的特点进行了详尽的分析和比对. 如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与PostgreSQL之间犹豫不定.MySQL与PostgreSQL都是免费.开源.强大.且功能丰富的数据库.你主要的问题可能是:哪一个才是最好的开源数据库,MySQL还是PostgreSQL呢?该选择哪一个开源数据库呢?