def Run(): inst_type = _RunSubp( "curl -s http://169.254.169.254/latest/meta-data/instance-type") ami_id = _RunSubp("curl -s http://169.254.169.254/latest/meta-data/ami-id") public_ip = _RunSubp( "curl -s http://169.254.169.254/latest/meta-data/public-ipv4") #Cons.P(ec2_inst_type) #Cons.P(ami_id) #Cons.P(public_ip) # Get current datetime, hostname, instance type, ebs type global _fn_log0, _fn_log1 _fn_log0 = "%s-%s-%s-%s" % (inst_type, datetime.datetime.now().strftime( "%y%m%d-%H%M%S"), ami_id, public_ip) _fn_log1 = "../log/ioping/%s" % _fn_log0 with Cons.MeasureTime("Setting up ..."): dn_rand_data = "/mnt/ebs-ssd1/rand-data" #Util.RunSubp("rm -rf %s" % dn_rand_data) Util.RunSubp("mkdir -p %s" % dn_rand_data) Util.RunSubp( "dd if=/dev/zero of=%s/zeros bs=1M count=1000 > /dev/null 2>&1" % dn_rand_data) Util.RunSubp("mkdir -p /mnt/ebs-ssd1/ioping-tmp") #Cons.P("Logging to %s" % _fn_log0) Util.RunSubp("mkdir -p ../log/ioping") Util.RunSubp("touch %s" % _fn_log1) fn_rand_data = None while True: _MeasurePerf() if fn_rand_data == None: fn_rand_data = "%s/%s" % (dn_rand_data, datetime.datetime.now(). strftime("%y%m%d-%H%M%S")) else: # Make a new file when the file size becomes too big filesize = os.path.getsize(fn_rand_data) if filesize > 20 * 1024 * 1024 * 1024: fn_rand_data = "%s/%s" % (dn_rand_data, datetime.datetime.now( ).strftime("%y%m%d-%H%M%S")) # /dev/urandom too slow. http://serverfault.com/questions/6440/is-there-an-alternative-to-dev-urandom # dd if=/dev/urandom of=$dn_rand_data/`date +"%y%m%d-%H%M%S.%N"` bs=1M count=20 > /dev/null 2>&1 # # When the device gets full, it raises an exception and terminates. # It took 4 days and 12 hours to fill the 16TB EBS SSD volume. # start: 160422-220627 # end : 160427-093745 cmd = "(openssl enc -aes-256-ctr" \ " -pass pass:\"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)\" -nosalt" \ " < %s/zeros >> %s)" \ " && sync" \ % (dn_rand_data, fn_rand_data) _RunSubp(cmd) sys.stdout.write(".") sys.stdout.flush()
def Run(): with Cons.MeasureTime("Running an EC2 instance ..."): global _boto_client if _boto_client == None: _boto_client = boto3.client("ec2") inst_id = _RunEc2InstI2Xlarge() _KeepCheckingInst(inst_id)
def _PlotRandW4kLog(fn): fn_in = "plot-data/%s" % fn fn_out = "plot-data/randw-4k-lat-log-%s.pdf" % fn with Cons.MeasureTime("Plotting %s" % fn_out): env = os.environ.copy() env["FN_IN"] = fn_in env["FN_OUT"] = fn_out Util.RunSubp("gnuplot %s/randw-4k-log.gnuplot" % os.path.dirname(__file__), env) Cons.P("Created %s %d" % (fn_out, os.path.getsize(fn_out)))
def Setup(): with Cons.MeasureTime("Setting up EBS SSD ..."): Util.RunSubp("sudo mkdir -p /mnt/ebs-ssd1") Util.RunSubp("sudo umount /dev/xvdc || true") # TODO: Are EBS volumes come TRIMmed when they are allocated? Util.RunSubp("sudo mkfs.ext4 -m 0 -E nodiscard -L ebs-ssd1 /dev/xvdc") # -o discard for TRIM Util.RunSubp("sudo mount -t ext4 -o discard /dev/xvdc /mnt/ebs-ssd1") Util.RunSubp("sudo chown -R ubuntu /mnt/ebs-ssd1")
def _PlotSeqW100m(fn): fn_in = "plot-data/%s" % fn fn_out = "plot-data/seqw-100m-lat-%s.pdf" % fn with Cons.MeasureTime("Plotting %s" % fn_out): env = os.environ.copy() env["FN_IN"] = fn_in env["FN_OUT"] = fn_out Util.RunSubp("gnuplot %s/seqw-100m.gnuplot" % os.path.dirname(__file__), env) Cons.P("Created %s %d" % (fn_out, os.path.getsize(fn_out)))
def Setup(): with Cons.MeasureTime("Setting up local SSD ..."): Util.RunSubp("sudo mkdir -p /mnt/local-ssd1") Util.RunSubp("sudo umount /dev/xvdb || true") # Instance store volumes come TRIMmed when they are allocated. Without # nodiscard, it takes about 80 secs for a 800GB SSD. Util.RunSubp("sudo mkfs.ext4 -m 0 -E nodiscard -L local-ssd1 /dev/xvdb") # -o discard for TRIM Util.RunSubp("sudo mount -t ext4 -o discard /dev/xvdb /mnt/local-ssd1") Util.RunSubp("sudo chown -R ubuntu /mnt/local-ssd1")
def _SetHostnameWithAzPubIp(): with Cons.MeasureTime("Setting hostname"): az = Util.RunSubp( "curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone" ) pub_ip = Util.RunSubp( "curl -s http://169.254.169.254/latest/meta-data/public-ipv4") hn = "%s-%s" % (az, pub_ip.split(".")[-1]) Cons.P("hostname: %s" % hn) # http://askubuntu.com/questions/9540/how-do-i-change-the-computer-name cmd = "sudo sh -c 'echo \"%s\" > /etc/hostname'" % hn Util.RunSubp(cmd, shell=True) cmd = "sudo sed -i '/^127.0.0.1 localhost.*/c\\127.0.0.1 localhost %s' /etc/hosts" % hn Util.RunSubp(cmd, shell=True) cmd = "sudo service hostname restart" Util.RunSubp(cmd)
def _GenLocalSsdData(fn): fn_plot_data = "plot-data/%s" % fn fn_raw = "../log/ioping/%s" % fn # Uncompress the raw files if not exist if not os.path.isfile(fn_raw): with Cons.MeasureTime("file %s doesn't exist. uncompressing from the archive" % fn_raw): cmd = "7z x -o../log/ioping %s.7z" % fn_raw Util.RunSubp(cmd) # Generate one if not exist. Skip for now. It's fast enough. #if os.path.isfile(fn_plot_data): # Cons.P("%s already exists" % fn_plot_data) # return if not os.path.exists("plot-data"): os.makedirs("plot-data") with Cons.MeasureTime("Generating plot data %s" % fn_plot_data): with open(fn_raw) as fo_r, open(fn_plot_data, "w") as fo_w: fmt = "%13s" \ " %5.1f" \ " %3d %3d %5d %4d" \ " %3d %3d %5d %3d" \ " %6d" fo_w.write("%s\n" % Util.BuildHeader(fmt, "datetime" \ " blocks_used_percent" \ " rr_4k_min rr_4k_avg rr_4k_max rr_4k_sd" \ " rw_4k_min rw_4k_avg rw_4k_max rw_4k_sd" \ " seqw_100m" )) # 160425-011752 # 100 17430 5737 23499713 170 174 211 5 # 100 14822 6747 27634597 134 148 231 17 # 1 216553 5 484212179 216553 216553 216553 0 # Filesystem 1K-blocks Used Available Use% Mounted on # /dev/xvda1 8115168 2545256 5134636 34% / # /dev/xvdb 769018760 173080 768829296 1% /mnt/local-ssd1 i = 0 dt = None block_used_percent_prev = None blocks_total = None blocks_used = None rr_4k_min = None rr_4k_avg = None rr_4k_max = None rr_4k_sd = None rw_4k_min = None rw_4k_avg = None rw_4k_max = None rw_4k_sd = None seqw_100m = None for line in fo_r.readlines(): #Cons.P(line) if i == 0: dt = line.strip() # 4k rand read elif i == 1: t = line.split() if len(t) != 8: raise RuntimeError("Unexpected format [%s]" % line) # All in us rr_4k_min = int(t[4]) rr_4k_avg = int(t[5]) rr_4k_max = int(t[6]) rr_4k_sd = int(t[7]) elif i == 2: t = line.split() if len(t) != 8: raise RuntimeError("Unexpected format [%s]" % line) # All in us rw_4k_min = int(t[4]) rw_4k_avg = int(t[5]) rw_4k_max = int(t[6]) rw_4k_sd = int(t[7]) elif i == 3: t = line.split() if len(t) != 8: raise RuntimeError("Unexpected format [%s]" % line) # All of the min, avg, max are the same since there is only 1 request # at a time. seqw_100m = int(t[4]) elif i == 6: t = line.split() if (len(t) != 6) or (t[0] != "/dev/xvdb"): raise RuntimeError("Unexpected format [%s]" % line) blocks_total = int(t[1]) blocks_used = int(t[2]) i += 1 if i == 7: block_used_percent = round(100.0 * blocks_used / blocks_total, 1) if block_used_percent_prev != block_used_percent: fo_w.write((fmt + "\n") % (dt , (100.0 * blocks_used / blocks_total) , rr_4k_min, rr_4k_avg, rr_4k_max, rr_4k_sd , rw_4k_min, rw_4k_avg, rw_4k_max, rw_4k_sd , seqw_100m )) block_used_percent_prev = block_used_percent i = 0 dt = None blocks_total = None blocks_used = None rr_4k_min = None rr_4k_avg = None rr_4k_max = None rr_4k_sd = None rw_4k_min = None rw_4k_avg = None rw_4k_max = None rw_4k_sd = None seqw_100m = None Cons.P("Created %s %d" % (fn_plot_data, os.path.getsize(fn_plot_data)))
def _GenEbsSsdData(fn0, fn1): fn_plot_data = "plot-data/%s" % fn1 fn_raw0 = "../log/ioping/%s" % fn0 fn_raw1 = "../log/ioping/%s" % fn1 # Generate one if not exist. Skip for now. It's fast enough. #if os.path.isfile(fn_plot_data): # Cons.P("%s already exists" % fn_plot_data) # return # Uncompress the raw files if not exist for fn in [fn_raw0, fn_raw1]: if not os.path.isfile(fn): with Cons.MeasureTime("file %s doesn't exist. uncompressing from the archive" % fn): cmd = "7z x -o../log/ioping %s.7z" % fn Util.RunSubp(cmd) if not os.path.exists("plot-data"): os.makedirs("plot-data") with Cons.MeasureTime("Generating plot data %s" % fn_plot_data): with open(fn_plot_data, "w") as fo_w, open(fn_raw0) as fo_r0, open(fn_raw1) as fo_r1: fmt = "%13s" \ " %5.1f" \ " %3d %4d %5d %4d" \ " %3d %4d %5d %4d" \ " %6d" fo_w.write("%s\n" % Util.BuildHeader(fmt, "datetime" \ " blocks_used_percent" \ " rr_4k_min rr_4k_avg rr_4k_max rr_4k_sd" \ " rw_4k_min rw_4k_avg rw_4k_max rw_4k_sd" \ " seqw_100m" )) #160423-195525 #100 68474 1460 5981833 230 685 1631 568 #100 74883 1335 5469866 495 749 4723 585 #1 1690975 1 62010142 1690975 1690975 1690975 0 #Filesystem 1K-blocks Used Available Use% Mounted on #/dev/xvda1 8115168 2676196 5003696 35% / #/dev/xvdc 17111375772 1565491700 15545867688 10% /mnt/ebs-ssd1 i = 0 dt = None block_used_percent_prev = None blocks_total = None blocks_used = None rr_4k_min = None rr_4k_avg = None rr_4k_max = None rr_4k_sd = None rw_4k_min = None rw_4k_avg = None rw_4k_max = None rw_4k_sd = None seqw_100m = None for fo_r in [fo_r0, fo_r1]: for line in fo_r.readlines(): #Cons.P("%d [%s]" % (i, line.strip())) if i == 0: dt = line.strip() # 4k rand read elif i == 1: t = line.split() if len(t) != 8: raise RuntimeError("Unexpected format [%s]" % line) # All in us rr_4k_min = int(t[4]) rr_4k_avg = int(t[5]) rr_4k_max = int(t[6]) rr_4k_sd = int(t[7]) elif i == 2: t = line.split() if len(t) != 8: raise RuntimeError("Unexpected format [%s]" % line) # All in us rw_4k_min = int(t[4]) rw_4k_avg = int(t[5]) rw_4k_max = int(t[6]) rw_4k_sd = int(t[7]) elif i == 3: t = line.split() if len(t) != 8: raise RuntimeError("Unexpected format [%s]" % line) # All of the min, avg, max are the same since there is only 1 request # at a time. seqw_100m = int(t[4]) elif i == 6: t = line.split() if (len(t) != 6) or (t[0] != "/dev/xvdc"): raise RuntimeError("Unexpected format [%s]" % line) blocks_total = int(t[1]) blocks_used = int(t[2]) i += 1 if i == 7: block_used_percent = round(100.0 * blocks_used / blocks_total, 1) if block_used_percent_prev != block_used_percent: fo_w.write((fmt + "\n") % (dt , (100.0 * blocks_used / blocks_total) , rr_4k_min, rr_4k_avg, rr_4k_max, rr_4k_sd , rw_4k_min, rw_4k_avg, rw_4k_max, rw_4k_sd , seqw_100m )) block_used_percent_prev = block_used_percent i = 0 dt = None blocks_total = None blocks_used = None rr_4k_min = None rr_4k_avg = None rr_4k_max = None rr_4k_sd = None rw_4k_min = None rw_4k_avg = None rw_4k_max = None rw_4k_sd = None seqw_100m = None Cons.P("Created %s %d" % (fn_plot_data, os.path.getsize(fn_plot_data)))