源码编译配置:
1、进入依赖库目录,拉取代码并编译:
cd gpdir/depends/
./configure
make
2、编译代码:
ubuntu:
sudo apt-get install libperl-dev libcurl4-openssl-dev
centos:
yum install gcc gcc-c++ flex bison readline-devel bzip2 zlib zlib-devel make cmake git libzstd libzstd-devel openssl openssl-devel \
apr-devel apr-util-devel libevent-devel libevent perl-ExtUtils-Embed\
perl python2 python2-devel libxml2-devel perl-devel libcurl-devel bzip2-devel -y && ln -s /usr/bin/python2 /usr/bin/python
LD_LIBRARY_PATH=/gpdb-6.0.0/depends/build/lib ./configure --with-perl --with-python --with-libxml --enable-debug --enable-cassert --disable-gpcloud --disable-gpfdist --with-libraries=/gpdb-6.0.0/depends/build/lib --with-includes=/gpdb-6.0.0/depends/build/include --without-libbz2 --disable-orca --with-openssl CFLAGS='-g -O3 -march=native' CXXFLAGS='-g -O3 -march=native'
静态编译orca:
修改src/Makfile.global中#Linking LIBS,增加以下选项:
(-Wl,--start-group -Wl,-Bstatic -lgpopt -lnaucrates -lgpos -lgpcost -Wl,--end-group -Wl,-Bdynamic )
icu编码库依赖: -licutu -licuuc -licudata
with-libz2依赖: yum install bzip2-delvel libzstd libzstd-devel
修复errrorcode错误:
perl src/backend/utils/generate-errcodes.pl src/backend/utils/errcodes.txt > src/backend/utils/errcodes.h perl src/pl/plpython/generate-spiexceptions.pl src/backend/utils/errcodes.txt > src/pl/plpython/spiexceptions.h perl src/pl/plpgsql/src/generate-plerrcodes.pl src/backend/utils/errcodes.txt > src/pl/plpgsql/src/plerrcodes.h
debug: CFLAG添加:-fsanitize=leak -fsanitize=address -static-libasan
(调试时设置export ASAN_OPTIONS=halt_on_error=0)
update xerces及orca:
#xerces
./configure
make DESTDIR=/xerces install
#gporca
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/gporca \
-D XERCES_INCLUDE_DIR=/xerces/include \
-D XERCES_LIBRARY=/xerces/lib/libxerces-c.so ../
make -j 32
make install
备注:
arm下编译gporca时修改代码:src/backend/gporca/libgpos/include/gpos/utils.h
替换:
#define GPOS_ASMFP asm volatile("movq %%rbp, %0" : "=g"(ulp));
#define GPOS_ASMSP asm volatile("movq %%rsp, %0" : "=g"(ulp));
为:
#if (GPOS_i386 || GPOS_i686 || GPOS_x86_64) && (GPOS_32BIT)
#define GPOS_ASMFP asm volatile("movl %%ebp, %0" : "=g"(ulp));
#define GPOS_ASMSP asm volatile("movl %%esp, %0" : "=g"(ulp));
#elif (GPOS_i386 || GPOS_i686 || GPOS_x86_64) && (GPOS_64BIT)
#define GPOS_ASMFP asm volatile("movq %%rbp, %0" : "=g"(ulp));
#define GPOS_ASMSP asm volatile("movq %%rsp, %0" : "=g"(ulp));
#elif (GPOS_aarch64) && (GPOS_64BIT)
#define GPOS_ASMFP asm volatile("mov %0, fp" : "=g"(ulp));
#define GPOS_ASMSP asm volatile("mov %0, sp" : "=g"(ulp));
#elif (GPOS_sparc) && (GPOS_32BIT)
#define GPOS_ASMFP asm volatile("st %%fp, %0" : "=g"(ulp));
#define GPOS_ASMSP asm volatile("st %%sp, %0" : "=g"(ulp));
#elif (GPOS_sparc) && (GPOS_64BIT)
#define GPOS_ASMFP asm volatile("stx %%fp, %0" : "=g"(ulp));
#define GPOS_ASMSP asm volatile("stx %%sp, %0" : "=g"(ulp));
#endif
arm架构性能优化:
修改 src/include/storage/s_lock.h:
#if defined(__aarch64__) || defined(__aarch64)
#ifdef HAVE_GCC_INT_ATOMICS
#define HAS_TEST_AND_SET
#define TAS(lock) tas(lock)
typedef int slock_t;
static __inline__ int CompareAndSwap(volatile slock_t* ptr, int old_value, int new_value)
{
int prev;
int temp;
__asm__ __volatile__ (
"0: \n\t"
"ldaxr %w[prev], %[ptr] \n\t"
"cmp %w[prev], %w[old_value] \n\t"
"bne 1f \n\t"
"stlxr %w[temp], %w[new_value], %[ptr] \n\t"
"cbnz %w[temp], 0b \n\t"
"1: \n\t"
: [prev]"=&r" (prev),
[temp]"=&r" (temp),
[ptr]"+Q" (*ptr)
: [old_value]"IJr" (old_value),
[new_value]"r" (new_value)
: "cc", "memory"
);
return prev;
}
static __inline__ int
tas(volatile slock_t *lock)
{
return CompareAndSwap(lock, 0, 1);
//return __sync_lock_test_and_set(lock, 1);
}
#define S_UNLOCK(lock) __sync_lock_release(lock)
#endif /* HAVE_GCC_INT_ATOMICS */
#endif /* __aarch64__ */
安装sigar依赖:
# git clone https://github.com/boundary/sigar
# cd sigar
# mkdir build && cd build && cmake .. && make && make install
编译带各种插件的gp:
./configure --with-python --with-libxml --enable-gpperfmon --disable-gpcloud --enable-gpfdist --enable-orca --with-openssl \
CFLAGS='-I/usr/lib64/perl5/CORE -DGPOS_x86_64=1 -DGPOS_64BIT=1 -g -O2' CXXFLAGS='-DGPOS_x86_64=1 -DGPOS_64BIT=1 -g -O2'
make -j
make DESTDIR=/release install
部署:
1) Set RemoveIPC=no in /etc/systemd/logind.conf
2) Reboot the server or restart systemd-logind as follows:
# systemctl daemon-reload
# systemctl restart systemd-logind
初始化db:
gpinitsystem -c rb_config -e gpadmin
环境变量设置:
export MASTER_DATA_DIRECTORY=/data/zhangqiang/gp-data/gp-1
export PGDATA=$MASTER_DATA_DIRECTORY
export GPPORT=5434
export PGUSER=gpadmin
export PGPASSWORD=gpadmin
export PGDATABASE=postgres
export PGHOST=xx.x.x.x
export PGPORT=5434
3)参数配置:
gpconfig -c max_connections -v 500 -m 400
gpconfig -c shared_buffers -v '1GB'
gpconfig -c max_prepared_transactions -v '1500'
gpconfig -c max_stack_depth -v '4MB'
gpconfig -c vacuum_cost_delay -v '0'
gpconfig -c synchronous_commit -v 'off'
gpconfig -c wal_buffers -v '16MB'
gpconfig -c wal_writer_delay -v '10ms'
gpconfig -c checkpoint_segments -v '128' --skipvalidation
gpconfig -c random_page_cost -v '1.3'
gpconfig -c log_statement -v 'ddl'
gpconfig -c vacuum_freeze_table_age -v '1200000000'
gpconfig -c autovacuum_freeze_max_age -v '1300000000' --skipvalidation
gpconfig -c autovacuum_vacuum_cost_delay -v '0' --skipvalidation
gpconfig -c autovacuum -v 'on' --skipvalidation
对于小内存实例,需要配置:
gpconfig -c gp_vmem_protect_limit -v 1024
gpconfig -c logging_collector -v off
gpconfig -c statement_mem -v 8MB
# 可选 gpconfig -c gp_resqueue_memory_policy -v auto
gpconfig -c max_statement_mem -v 128MB
gpconfig -c max_connections -v 60 -m 20;
gpstop -r -M fast -a
gpconfig -s gp_vmem_protect_limit
gpconfig -s logging_collector
gpconfig -s gp_resqueue_memory_policy
gpconfig -s statement_mem
gpconfig -s max_statement_mem
gpconfig -s max_connections
4)重启:
gpstop -M fast -a
gpstart -a