Provisioned IOPS とか言われるとベンチはしてみたいので

毎度々々の備忘ですが、ベンチ厨になるべくベンチを取りたいと思いました。IOPS を Provisioned とか言われたらベンチしたくなるのは人情です。なので、m2.4xlarge な EC2 インスタンスを EBS optimized で立ちあげて、更に block device mapping で EBS for PIOPS な volume を 2000 IOPS provision して、fio を make してベンチ取るというスクリプトを試しに作ってみました。

#! /bin/bash
export AWS_ACCESS_KEY=$1
export AWS_SECRET_KEY=$2

script="#!/bin/sh

yum -y install git gcc make libaio-devel xfsprogs
cd /tmp
git clone git://git.kernel.dk/fio.git
cd fio
make
make install

while true
do
  if [ -e /dev/sdf1 ]
  then
    mkfs.xfs /dev/sdf1 > /dev/console
    break
  fi
  sleep 10
done
mkdir -p /media/p_iops_vol0
mount -t xfs /dev/sdf1 /media/p_iops_vol0 2> /dev/console
mount > /dev/console

while true
do
  echo '[write start]' > /dev/console
  /usr/local/bin/fio --directory=/media/p_iops_vol0 --name fio_test_file --direct=1 --rw=randwrite --bs=16k --size=1G --numjobs=16 --time_based --runtime=180 --output /dev/console
  echo '[write done]' > /dev/console
  echo '[read start]' > /dev/console
  /usr/local/bin/fio --directory=/media/p_iops_vol0 --name fio_test_file --direct=1 --rw=randread --bs=16k --size=1G --numjobs=16 --time_based --runtime=180 --group_reporting --output /dev/console
  echo '[read done]' > /dev/console
done 
"
encoded_script=`echo "$script" | base64 -w 0`

result=`ec2-run-instances --region ap-northeast-1 \
  ami-4e6cd34f \
  -z ap-northeast-1c \
  --ebs-optimized True \
  -b /dev/sdf1=:200:true:io1:2000 \
  -t m2.4xlarge \
  --instance-initiated-shutdown-behavior terminate \
  --ebs-optimized True \
  -d $encoded_script`
instance_id=`echo "$result" | grep INSTANCE | awk '{print $2}'`

if [ x"$instance_id" = "x" ]
then
  exit 1
fi

echo "$instance_id"

while true
do
  vol_id=`ec2-describe-instances --region ap-northeast-1 $instance_id | grep /dev/sdf1 | awk '{print $3}'`
  if [ x"$vol_id" != "x" ]
  then
    break
  fi
done

while true
do
  clear
  echo $instance_id - $vol_id
  now_in_sec=`date +%s`
  one_min_ago_in_sec=`expr $now_in_sec - 300`
  one_min_ago=`date -d @$one_min_ago_in_sec +'%Y-%m-%dT%H:%M:%S.000Z'`
  mon-get-stats --region ap-northeast-1 \
    --namespace AWS/EBS \
    --statistics Average \
    --dimensions VolumeId=$vol_id \
    --metric-name VolumeWriteOps \
    -I $AWS_ACCESS_KEY \
    -S $AWS_SECRET_KEY \
    --start-time "$one_min_ago"
  sleep 60
done

何してるかっつーと fio で 3 分毎に write と read を繰り返しています。引数に各種 key を取る辺りがダサいんですが、まだ IAM role に mon-get-stats が対応してなくて。スクリプトの最後で mon-get-stats で metric を定期的に取ってますが、これが要らなけりゃ IAM role に任せて各種 key を設定する必要は無いんすよね。

で、多分これそうなんだけど

EBS volume ってこなれるの待たなきゃなんだな、dd しとくとか大切だな、と思いました。