#!/bin/sh
# Copyright (c) 2002 ALT Linux Team, Russia.
#
# Author: Igor Muratov <migor@altlinux.ru>
#
# description:  Calculate Linux Kernel parameters
#               Add result strings to Your /etc/sysctl.conf
#               and do 'sysctl -p' as root user
#

PROCESSES=(100 100 200)   # This is example only !!

if [ "$1" ]; then
	unset PROCESSES
	PROCESSES="$*"
else
	echo "Usage: $0 processes1 [... processesN]"
	echo "Get \"processes\" variables from Your \$ORACLE_HOME/dbs/init*.ora files"
	echo "Example: $0 ${PROCESSES[@]}"
	echo
fi

PROCESSES_MAX=0
PROCESSES_SUM=0
for P in ${PROCESSES[@]}
do
	PROCESSES_SUM=$((PROCESSES_SUM + $P))
	[ "$PROCESSES_MAX" -lt "$P" ] && PROCESSES_MAX="$P"
done
PROCESSES_NUM=${#PROCESSES[@]}

# Get memory size
MEM_SIZE=`/bin/cat /proc/meminfo | /bin/grep ^Mem: | /bin/awk '{print $2}'`

# Calculate Linux Kernel Parameters for:
# Shared memory
SHMMAX=$((MEM_SIZE / 2))
SHMMAX_OLD=`/bin/cat /proc/sys/kernel/shmmax`
SHMMNI=4096
SHMMNI_OLD=`/bin/cat /proc/sys/kernel/shmmni`
SHMALL=2097152
SHMALL_OLD=`/bin/cat /proc/sys/kernel/shmall`

# Semaphores
SEMMSL=$((PROCESSES_MAX + 10))
SEMMNS=$((PROCESSES_SUM + PROCESSES_MAX + PROCESSES_NUM * 10))
SEMOPM=100
SEMMNI=256
SEM="$SEMMSL $SEMMNS $SEMOPM $SEMMNI"
SEM_OLD=`/bin/cat /proc/sys/kernel/sem`

## File systems
#FILEMAX=32768
#FILEMAX_OLD=`/bin/cat /proc/sys/fs/file-max`

echo "# Kernel parameters tuning for Oracle"
echo "#"
echo "# Current values"
echo "#-----------------------------------------------"
echo "#kernel.shmmax = $SHMMAX_OLD"
echo "#kernel.shmmni = $SHMMNI_OLD"
echo "#kernel.shmall = $SHMALL_OLD"
echo "#kernel.sem    = $SEM_OLD"
#echo "#fs.file-max   = $FILEMAX_OLD"
echo
echo "# Calculated minimum values for \"${PROCESSES[@]}\""
echo "#-----------------------------------------------"
echo "kernel.shmmax = $SHMMAX"
echo "kernel.shmmni = $SHMMNI"
echo "kernel.shmall = $SHMALL"
echo "kernel.sem    = $SEM"
#echo "fs.file-max   = $FILEMAX"
