21a2ab63c1bfcd52087819669fb0cf615babe4f4 max Fri Jul 9 01:07:19 2021 -0700 adding little tool to compare browser timings, email thread with Braney, Mark, Hiram, Chris diff --git src/utils/browserRace src/utils/browserRace new file mode 100755 index 0000000..85dad70 --- /dev/null +++ src/utils/browserRace @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 + +import logging, sys, optparse, time, os, random +#from collections import defaultdict +from os.path import join, basename, dirname, isfile +import requests + +# ==== functions ===== + +def parseArgs(): + " setup logging, parse command line arguments and options. -h shows auto-generated help page " + parser = optparse.OptionParser("""usage: %prog [options] hgcentralname server1 server2 outFname - measure timing of a browser + + Gets all public sessions, loads all of them on two servers, shows total time spent for each server. + + Example: + browserRace hgcentraltest hgwdev hgwdev-demo7 laps.tsv + """) + + parser.add_option("-d", "--debug", dest="debug", action="store_true", help="show debug messages") + #parser.add_option("-f", "--file", dest="file", action="store", help="run on file") + #parser.add_option("", "--test", dest="test", action="store_true", help="do something") + (options, args) = parser.parse_args() + + if args==[]: + parser.print_help() + exit(1) + + if options.debug: + logging.basicConfig(level=logging.DEBUG) + logging.getLogger().setLevel(logging.DEBUG) + else: + logging.basicConfig(level=logging.INFO) + logging.getLogger().setLevel(logging.INFO) + + return args, options + +def readSessions(centralName): + " return list of username, sessionname " + logging.info("Getting hubUrls from db %s" % centralName) + cmd = 'hgsql %s -se "select userName,sessionName from namedSessionDb where shared=1"' % centralName + lines = os.popen(cmd).read().splitlines() # please do not suggest using subprocess in code review. Thx. + rows = [l.split("\t") for l in lines] + logging.info("Got %d public sessions" % len(rows)) + return rows + +def timeWeb(url): + t = time.process_time() + requests.get(url) + elapsed_time = time.process_time() - t + return elapsed_time + +def timeSessions(sessions, server1, server2, outFname): + sum1 = 0 + sum2 = 0 + ofh = open(outFname, "w") + for user, session in sessions: + logging.info("Session: %s %s" % (user, session)) + path = "cgi-bin/hgTracks?hgS_doOtherUser=submit&hgS_otherUserName=%s&hgS_otherUserSessionName=%s"% (user, session) + url1 = "http://%s.gi.ucsc.edu/%s" % (server1, path) + url2 = "http://%s.gi.ucsc.edu/%s" % (server2, path) + # the second call always has an advantage due to warm caches so flip the order + if random.random() < 0.5: + time1 = timeWeb(url1) + time2 = timeWeb(url2) + else: + time2 = timeWeb(url2) + time1 = timeWeb(url1) + + sum1 += time1 + sum2 += time2 + diff = 100*((sum2/sum1)-1.0) + logging.info("%f versus %f. Sum: %f versus %f, difference: %.1f%%" % (time1, time2, sum1, sum2, diff)) + row = [user, session, str(time1), str(time2)] + ofh.write("%s\n" % ("\t".join(row))) + logging.info("Total time %s: %f" % (server1, sum1)) + logging.info("Total time %s: %f" % (server2, sum2)) + ofh.close() + +# ----------- main -------------- +def main(): + args, options = parseArgs() + + centralName, server1, server2, outFname = args + sessions = readSessions(centralName) + timeSessions(sessions, server1, server2, outFname) + +main()