blob: 219b0082591d8367149e5ea5cd6667cc351c215e [file] [log] [blame]
mblighafce1032007-10-31 21:29:29 +00001import test, time, re, pwd
2from autotest_utils import *
3
4class sysbench(test.test):
5 version = 1
6
7 # http://osdn.dl.sourceforge.net/sourceforge/sysbench/sysbench-0.4.8.tar.gz
8 def setup(self, tarball = 'sysbench-0.4.8.tar.bz2'):
9 tarball = unmap_url(self.bindir, tarball, self.tmpdir)
10 extract_tarball_to_dir(tarball, self.srcdir)
11 self.job.setup_dep(['pgsql', 'mysql'])
12
13 os.chdir(self.srcdir)
14
15 pgsql_dir = os.path.join(self.autodir, 'deps/pgsql/pgsql')
16 mysql_dir = os.path.join(self.autodir, 'deps/mysql/mysql')
17
18 # configure wants to get at pg_config, so add its path
19 system('PATH=%s/bin:$PATH ./configure --with-mysql=%s --with-pgsql' % (pgsql_dir, mysql_dir))
20 system('make -j %d' % count_cpus())
21
22
23 def execute(self, db_type = 'pgsql', build = 1, \
24 num_threads = count_cpus(), max_time = 60, \
25 read_only = 0, args = ''):
26 plib = os.path.join(self.autodir, 'deps/pgsql/pgsql/lib')
27 mlib = os.path.join(self.autodir, 'deps/mysql/mysql/lib/mysql')
28 ld_path = prepend_path(plib, environ('LD_LIBRARY_PATH'))
29 ld_path = prepend_path(mlib, ld_path)
30 os.environ['LD_LIBRARY_PATH'] = ld_path
31
32 # The databases don't want to run as root so run them as nobody
33 self.dbuser = 'nobody'
34 self.dbuid = pwd.getpwnam(self.dbuser)[2]
35 self.sudo = 'sudo -u ' + self.dbuser + ' '
36
37 # Check for nobody user
38 try:
39 system(self.sudo + '/bin/true')
40 except:
mbligh642b03e2008-01-14 16:53:15 +000041 raise TestError('Unable to run as nobody')
mblighafce1032007-10-31 21:29:29 +000042
43 if (db_type == 'pgsql'):
44 self.execute_pgsql(build, num_threads, max_time, \
45 read_only, args)
46 elif (db_type == 'mysql'):
47 self.execute_mysql(build, num_threads, max_time, \
48 read_only, args)
49
50
51 def execute_pgsql(self, build, num_threads, max_time, read_only, args):
52 bin = os.path.join(self.autodir, 'deps/pgsql/pgsql/bin')
53 data = os.path.join(self.autodir, 'deps/pgsql/pgsql/data')
54 log = os.path.join(self.debugdir, 'pgsql.log')
55
56 if build == 1:
57 system('rm -rf ' + data)
58 os.mkdir(data)
59 os.chown(data, self.dbuid, 0)
60 system(self.sudo + bin + '/initdb -D ' + data)
61
62 # Database must be able to write its output into debugdir
63 os.chown(self.debugdir, self.dbuid, 0)
64 system(self.sudo + bin + '/pg_ctl -D ' + data + \
65 ' -l ' + log + ' start')
66
67 # Wait for database to start
68 time.sleep(5)
69
70 try:
71 base_cmd = self.srcdir + '/sysbench/sysbench ' + \
72 '--test=oltp --db-driver=pgsql ' + \
73 '--pgsql-user=' + self.dbuser
74
75 if build == 1:
76 system(self.sudo + bin + '/createdb sbtest')
77 cmd = base_cmd +' prepare'
78 system(cmd)
79
80 cmd = base_cmd + \
81 ' --num-threads=' + str(num_threads) + \
82 ' --max-time=' + str(max_time) + \
83 ' --max-requests=0'
84
85 if read_only:
86 cmd = cmd + ' --oltp-read-only=on'
87
jadmanski29956512008-05-16 14:45:24 +000088 results = []
89
mblighafce1032007-10-31 21:29:29 +000090 profilers = self.job.profilers
mbligh642b03e2008-01-14 16:53:15 +000091 if not profilers.only():
jadmanski29956512008-05-16 14:45:24 +000092 results.append(system_output(cmd + ' run',
93 retain_output=True))
mblighafce1032007-10-31 21:29:29 +000094
95 # Do a profiling run if necessary
96 if profilers.present():
97 profilers.start(self)
jadmanski29956512008-05-16 14:45:24 +000098 results.append("Profiling run ...")
99 results.append(system_output(cmd + ' run',
100 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000101 profilers.stop(self)
102 profilers.report(self)
103 except:
104 system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighec755762008-01-17 16:25:22 +0000105 raise
mblighafce1032007-10-31 21:29:29 +0000106
107 system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
108
jadmanski29956512008-05-16 14:45:24 +0000109 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000110
111
112 def execute_mysql(self, build, num_threads, max_time, read_only, args):
113 bin = os.path.join(self.autodir, 'deps/mysql/mysql/bin')
114 data = os.path.join(self.autodir, 'deps/mysql/mysql/var')
115 log = os.path.join(self.debugdir, 'mysql.log')
116
117 if build == 1:
118 system('rm -rf ' + data)
119 os.mkdir(data)
120 os.chown(data, self.dbuid, 0)
121 system(bin + '/mysql_install_db --user=' + self.dbuser)
122
123 system(bin + '/mysqld_safe --log-error=' + log + \
124 ' --user=' + self.dbuser + ' &')
125
126 # Wait for database to start
127 time.sleep(5)
128
129 try:
130 base_cmd = self.srcdir + '/sysbench/sysbench ' + \
131 '--test=oltp --db-driver=mysql ' + \
132 '--mysql-user=root'
133
134 if build == 1:
135 system('echo "create database sbtest" | ' + \
136 bin + '/mysql -u root')
137 cmd = base_cmd +' prepare'
138 system(cmd)
139
140 cmd = base_cmd + \
141 ' --num-threads=' + str(num_threads) + \
142 ' --max-time=' + str(max_time) + \
143 ' --max-requests=0'
144
145 if read_only:
146 cmd = cmd + ' --oltp-read-only=on'
147
jadmanski29956512008-05-16 14:45:24 +0000148 results = []
149
mblighafce1032007-10-31 21:29:29 +0000150 profilers = self.job.profilers
151 if not profilers.only():
jadmanski29956512008-05-16 14:45:24 +0000152 results.append(system_output(cmd + ' run',
153 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000154
155 # Do a profiling run if necessary
156 if profilers.present():
157 profilers.start(self)
jadmanski29956512008-05-16 14:45:24 +0000158 results.append("Profiling run ...")
159 results.append(system_output(cmd + ' run',
160 retain_output=True))
mblighafce1032007-10-31 21:29:29 +0000161 profilers.stop(self)
162 profilers.report(self)
163 except:
164 system(bin + '/mysqladmin shutdown')
mblighec755762008-01-17 16:25:22 +0000165 raise
mblighafce1032007-10-31 21:29:29 +0000166
167 system(bin + '/mysqladmin shutdown')
168
jadmanski29956512008-05-16 14:45:24 +0000169 self.__format_results("\n".join(results))
mblighafce1032007-10-31 21:29:29 +0000170
171
172 def __format_results(self, results):
173 threads = 0
174 tps = 0
175
176 out = open(self.resultsdir + '/keyval', 'w')
177 for line in results.split('\n'):
178 threads_re = re.search('Number of threads: (\d+)', line)
179 if threads_re:
180 threads = threads_re.group(1)
181
182 tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line)
183 if tps_re:
184 tps = tps_re.group(1)
185 break
186
187 print >> out, 'threads=%s\ntps=%s' % (threads, tps)
188 out.close()