|
LINBIT Open Source Software - hugetlb |
|
Download: hugetlb.tar.gz more LINBIT OSS .. |
HugeTLB (HugeTables) for PostgreSQL
===================================
Huge tables
-----------
In order to reduce the TLB misses modern CPUs offer so called huge pages, or
huge page TLB entries. The usual page size on x86 machines is today 4kB. On
PostgreSQL instances that are used for web applications it became common to
have shared memory segments which are many GByte in size.
Mapping such a big virtual memory area through normal page table entries is
quite inefficient, and causes a rather low hit ratio in the TLB.
The Linux kernel offers support for huge pages since some time, and I
believe this was fostered by Oracle. What is good for Oracle is good for
PostgreSQL as well. But unfortunately PostgreSQL does not use huge pages
as it of today (PostgreSQL 8.2).
To make PostgreSQL (or other applications to use huge pages) to use huge
tables here is a small LD_PRELOAD_LIBRARY that does this.
How to Install
--------------
1) Make sure your kernel support huge pages
grep HUGETLB /boot/config-2.6.18-6-amd64 or
zgrep HUGETLB /proc/config.gz
it should say:
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
2) Compile hugetlb.c to hugetlb.so by calling make. Install the library
somewhere on your machine, e.g. /usr/local/lib/hugetlb.so
3) Tune your kernel to provide some huge pages:
echo 2700 > /proc/sys/vm/nr_hugepages
Make sure the right amount of huge pages is available:
cat /proc/meminfo
In case not, do
echo 3 > /proc/sys/vm/drop_caches
and retry to set the nr_hugepages.
Tune your kernel to allow the postgres' group to use huge tables
id postgres
uid=31(postgres) gid=32(postgres) groups=32(postgres),107(ssl-cert)
echo 32 > /proc/sys/vm/hugetlb_shm_group
4) Make sure that PostgreSQL gets the library preloaded. On debian etch I do
this with:
cat <<EOF > /etc/postgresql/8.2/main/environment
LD_PRELOAD='/usr/local/lib/hugetlb.so'
EOF
5) Start PostgreSQL.
Experienced Benefits
--------------------
The average we got on our production systems was an reduction of Query times
by 13%, a reduction of CPU usage by about 15%.
|