#!/bin/sh #----------------------------------------------------------------------------- # /var/install/bin/postgresql96-calc-shmmax - calculate required shmmax-segment # # Creation: 2009-04-10 dv # Last Update: 2019-03-05 20:09:59 # # Copyright (c) 2020 the eisfair team, team(at)eisfair(dot)org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #----------------------------------------------------------------------------- . /etc/config.d/postgresql96 #----------------------------------------------------------------------------- # this is a helper script to automatically adjust shmmax kernel configuration # if required. The formula was taken from the postgresql 8.3 documentation. # # Approximate multiplier (bytes per increment) as of 8.3: # # max_connections 1800 + 270 * max_locks_per_transaction # autovacuum_max_workers 1800 + 270 * max_locks_per_transaction # max_prepared_transactions 770 + 270 * max_locks_per_transaction # shared_buffers 8400 (assuming 8 kB BLCKSZ) # wal_buffers 8200 (assuming 8 kB XLOG_BLCKSZ) # max_fsm_relations 70 # max_fsm_pages 6 # Fixed space requirements 770 kB #----------------------------------------------------------------------------- # here are some defaults from postgresql.conf MAX_LOCKS_PER_TRANSACTION=64 AUTOVACUUM_MAX_WORKERS=3 SHARED_MEM_DEFAULT=16MB WAL_BUFFERS_DEFAULT=64kB MAX_FSM_RELATIONS=1000 MAX_FSM_PAGES=153600 #----------------------------------------------------------------------------- # convert memory size value to unified value in kB #----------------------------------------------------------------------------- getMemSize() { local a=$1 local multiply=$2 pos=$((${#a} - 2)) case "${a:$pos}" in kB) a=${a:0:$pos} ;; MB) a=$((${a:0:$pos} * 1024)) ;; GB) a=$((${a:0:$pos} * 1024 * 1024)) ;; *) a=$(($a * multiply)) esac echo $a } # collect all required values mem_max_locks=$((270 * ${MAX_LOCKS_PER_TRANSACTION})) mem_connect=$(((${POSTGRESQL96_MAX_CONNECTS} * (1800 + ${mem_max_locks})) / 1024 + 1)) mem_autovac=$(((${AUTOVACUUM_MAX_WORKERS} * (1800 + ${mem_max_locks})) / 1024 + 1)) mem_transac=$(((${POSTGRESQL96_PREP_TRANSACTIONS} * (770 + ${mem_max_locks})) / 1024 + 1)) if [ "${POSTGRESQL96_RESOURCE_TUNING}" == 'yes' ] then mem_sharedb=$(getMemSize "${POSTGRESQL96_SHARED_MEM}" "8") else mem_sharedb=$(getMemSize "${SHARED_MEM_DEFAULT}" "8") fi if [ "${POSTGRESQL96_WAL_TUNING}" == 'yes' ] then mem_buffers=$(getMemSize "${POSTGRESQL96_WAL_DATA_MEM}" "8") else mem_buffers=$(getMemSize "${WAL_BUFFERS_DEFAULT}" "8") fi mem_fsmrel=$(((${MAX_FSM_RELATIONS} * 70) / 1024 + 1)) mem_fsmpag=$(((${MAX_FSM_PAGES} * 6) / 1024 + 1)) # sum everything up mem_total=$(( 770 + \ $mem_connect + \ $mem_autovac + \ $mem_transac + \ $mem_sharedb + \ $mem_buffers + \ $mem_fsmrel + \ $mem_fsmpag )) #echo result (plus extra space) echo $(($mem_total + 1024)) exit 0