os_tweaks.sh #10

  • //
  • guest/
  • perforce_software/
  • sdp/
  • main/
  • Server/
  • Unix/
  • setup/
  • os_tweaks.sh
  • View
  • Commits
  • Open Download .zip Download (4 KB)
#!/bin/bash
#==============================================================================
# Copyright and license info is available in the LICENSE file included with
# the Server Deployment Package (SDP), and also available online:
# https://swarm.workshop.perforce.com/projects/perforce-software-sdp/view/main/LICENSE
#------------------------------------------------------------------------------
set -u

# Usage (bash syntax):
# ./os_tweaks.sh 2>&1 | tee /tmp/os_tweaks.log

# This script checks, and if need be sets, certain OS parameters per
# Perforce recommendations: http://answers.perforce.com/articles/KB/3005#LINUX

# Following is a sample manual session:
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
# [yes] no
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/defrag
# [always] madvise never
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/enabled
# [always] madvise never
# ROOT@perforce1:/root echo no > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
# ROOT@perforce1:/root echo never > /sys/kernel/mm/transparent_hugepage/defrag
# ROOT@perforce1:/root echo never > /sys/kernel/mm/transparent_hugepage/enabled
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
# yes [no]
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/defrag
# always madvise [never]
# ROOT@perforce1:/root cat /sys/kernel/mm/transparent_hugepage/enabled
# always madvise [never]

function msg () { echo -e "$*"; }
function bail () { msg "\\n${1:-Unknown Error}\\n"; exit "${2:-1}"; }

declare -i i=0
declare -a Files
declare -i ChangesNeeded=0
declare -a CurrentValues
declare -a CorrectValues
declare CurrentValue=
declare Version=1.2.0

# Static Data
Files[0]=/sys/kernel/mm/transparent_hugepage/khugepaged/defrag
Files[1]=/sys/kernel/mm/transparent_hugepage/defrag
Files[2]=/sys/kernel/mm/transparent_hugepage/enabled

# The format of one of the files varies by kernel version, either
# numeric or string format.  Figure out what format it is, and
# set the correct value based on the format of the current value.
if [[ -r "${Files[0]}" ]]; then
   CurrentValue=$(cat ${Files[0]})
   if [[ $CurrentValue =~ ^[0-9]{1}$ ]]; then
      CorrectValues[0]="0"
   else
      CorrectValues[0]="no"
   fi
fi

[[ $(whoami) == root ]] || bail "This must be run as root."

CorrectValues[1]="never"
CorrectValues[2]="never"

msg "\\nStarted ${0##*/} v$Version at $(date) on host ${HOSTNAME%%.*}.\\n"

while [[ $i -lt ${#Files[*]} ]]; do
   if [[ -r "${Files[$i]}" ]]; then
      CurrentValue=$(cat "${Files[$i]}")
      CurrentValue=${CurrentValue#*\[}
      CurrentValue=${CurrentValue%\]*}
      CurrentValues[$i]="$CurrentValue"
   else
      bail "Expected file does not exist: ${Files[$i]}"
   fi

   echo -e -n "File:        : ${Files[$i]}\nCurrent Value: ${CurrentValues[$i]}\nCorrect Value: ${CorrectValues[$i]}"

   if [[ "$CurrentValue" == "${CorrectValues[$i]}" ]]; then
      msg " (OK)\\n"
   else
      msg " (Needs to be adjusted)\\n"
      ChangesNeeded=$((ChangesNeeded+1))
   fi

   i=$((i+1))
done

if [[ $ChangesNeeded -eq 0 ]]; then
   msg "Verified: No changes to the OS parameters checked by this script are needed.\\n"
   exit 0
else
   msg "Detected $ChangesNeeded of ${#Files[*]} OS parameters needing to be updated.\\n"
fi

msg "Making updates.\\n"
i=0
while [[ $i -lt ${#Files[*]} ]]; do
   CurrentValue=$(cat ${Files[$i]})
   CurrentValue=${CurrentValue#*\[}
   CurrentValue=${CurrentValue%\]*}

   [[ "$CurrentValue" == "${CorrectValues[$i]}" ]] && continue

   msg "Setting value to ${CorrectValues[$i]} in ${Files[$i]}"
   echo "${CorrectValues[$i]}" > "${Files[$i]}" || bail  "Failed to set value in ${Files[$i]}."

   i=$((i+1))
done

msg "\\nRechecking files after making updates.\\n"
i=0
ChangesNeeded=0

while [[ $i -lt ${#Files[*]} ]]; do
   CurrentValue=$(cat ${Files[$i]})
   CurrentValue=${CurrentValue#*\[}
   CurrentValue=${CurrentValue%\]*}

   echo -e -n "File:        : ${Files[$i]}\nCurrent Value: $CurrentValue\nCorrect Value: ${CorrectValues[$i]}"

   if [[ "$CurrentValue" == "${CorrectValues[$i]}" ]]; then
      msg " (OK)\\n"
   else
      msg " (Still needs to be adjusted)\\n"
      ChangesNeeded=$((ChangesNeeded+1))
   fi

   i=$((i+1))
done

if [[ $ChangesNeeded -eq 0 ]]; then
   msg "Done. All OS parameters needing updates have been made.\\n"
else
   bail "Some OS parameter updates failed.  See output above.\\n"
fi

# Change User Description Committed
#10 27331 C. Thomas Tyler Released SDP 2020.1.27325 (2021/01/29).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#9 26246 C. Thomas Tyler Released SDP 2019.3.26239 (2020/01/08).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#8 25933 C. Thomas Tyler Released SDP 2019.2.25923 (2019/08/05).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#7 25245 C. Thomas Tyler Released SDP 2019.1.25238 (2019/03/02).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#6 23006 C. Thomas Tyler Released SDP 2017.3.23003 (2017/10/19).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#5 22685 Russell C. Jackson (Rusty) Update main with current changes from dev.
#4 21193 Russell C. Jackson (Rusty) Update main from dev.
#3 21184 C. Thomas Tyler os_tweaks.sh: Corrected error messages, updated version.
#2 21174 C. Thomas Tyler Updated os_tweaks.sh to support CentOS 7.
#1 20353 C. Thomas Tyler Released SDP 2016.1.20348.
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev',
with selective removal of changes related to work-in-progress
changes.
//guest/perforce_software/sdp/dev/Server/Unix/setup/os_tweaks.sh
#1 20262 C. Thomas Tyler Added utility script to make recommended OS tweaks.
 This script
checks current values, and makes updates if needed.  It must
be run as root, and is only tested on RHEL/CentOS (and has built-in
safety features).