I manage a bunch of Postgres DBs and one of the things I almost always forget to do when setting up a new one is set the readahead up from the default of 256. I created this script and run it out of /etc/rc.local and sometimes cron it too. The 3 commands at the top are only really relevant on systems with “huge” memory – probably over 64 GB. We ran into some memory problems with CentOS 6 on a box with 128 GB ram which we ended up working around by reinstalling CentOS 5, but the /sys/kernel/mm/redhat_transparent_hugepage/ options below should fix them in 6.x (though we haven’t actually tried it on that DB, we haven’t seen any problems in other large DBs).
#!/bin/bash
echo no > /sys/kernel/mm/redhat_transparent_hugepage/khugepaged/defrag
echo never >/sys/kernel/mm/redhat_transparent_hugepage/defrag
echo 1 > /proc/sys/vm/dirty_background_ratio
BLOCK_DEVICES=`perl -ne 'chomp; my @a=split(/[s]+/); next unless $a[4]; next if ($a[4] =~ /sd[a-z]+[d]+/); print "$a[4]n";' /proc/partitions `
logger -t tune_blockdevs "Block devices matching: $BLOCK_DEVICES"
for DEV in $BLOCK_DEVICES; do
logger -t tune_blockdevs "Setting IO params for $DEV"
### Uncomment the below line if using SSD
# echo "noop" > /sys/block/$DEV/queue/scheduler
/sbin/blockdev --setra 65536 /dev/$DEV
done
Leave a comment