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 しとくとか大切だな、と思いました。