blob: f6651bd254bced83de31d151af67007f9b926a79 [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
88 profilers = self.job.profilers
mbligh642b03e2008-01-14 16:53:15 +000089 if not profilers.only():
mblighafce1032007-10-31 21:29:29 +000090 system(cmd + ' run')
91
92 # Do a profiling run if necessary
93 if profilers.present():
94 profilers.start(self)
95 print "Profiling run ..."
96 system(cmd + ' run')
97 profilers.stop(self)
98 profilers.report(self)
99 except:
100 system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
mblighec755762008-01-17 16:25:22 +0000101 raise
mblighafce1032007-10-31 21:29:29 +0000102
103 system(self.sudo + bin + '/pg_ctl -D ' + data + ' stop')
104
105 self.__format_results(open(self.debugdir + '/stdout').read())
106
107
108 def execute_mysql(self, build, num_threads, max_time, read_only, args):
109 bin = os.path.join(self.autodir, 'deps/mysql/mysql/bin')
110 data = os.path.join(self.autodir, 'deps/mysql/mysql/var')
111 log = os.path.join(self.debugdir, 'mysql.log')
112
113 if build == 1:
114 system('rm -rf ' + data)
115 os.mkdir(data)
116 os.chown(data, self.dbuid, 0)
117 system(bin + '/mysql_install_db --user=' + self.dbuser)
118
119 system(bin + '/mysqld_safe --log-error=' + log + \
120 ' --user=' + self.dbuser + ' &')
121
122 # Wait for database to start
123 time.sleep(5)
124
125 try:
126 base_cmd = self.srcdir + '/sysbench/sysbench ' + \
127 '--test=oltp --db-driver=mysql ' + \
128 '--mysql-user=root'
129
130 if build == 1:
131 system('echo "create database sbtest" | ' + \
132 bin + '/mysql -u root')
133 cmd = base_cmd +' prepare'
134 system(cmd)
135
136 cmd = base_cmd + \
137 ' --num-threads=' + str(num_threads) + \
138 ' --max-time=' + str(max_time) + \
139 ' --max-requests=0'
140
141 if read_only:
142 cmd = cmd + ' --oltp-read-only=on'
143
144 profilers = self.job.profilers
145 if not profilers.only():
146 system(cmd + ' run')
147
148 # Do a profiling run if necessary
149 if profilers.present():
150 profilers.start(self)
151 print "Profiling run ..."
152 system(cmd + ' run')
153 profilers.stop(self)
154 profilers.report(self)
155 except:
156 system(bin + '/mysqladmin shutdown')
mblighec755762008-01-17 16:25:22 +0000157 raise
mblighafce1032007-10-31 21:29:29 +0000158
159 system(bin + '/mysqladmin shutdown')
160
161 self.__format_results(open(self.debugdir + '/stdout').read())
162
163
164 def __format_results(self, results):
165 threads = 0
166 tps = 0
167
168 out = open(self.resultsdir + '/keyval', 'w')
169 for line in results.split('\n'):
170 threads_re = re.search('Number of threads: (\d+)', line)
171 if threads_re:
172 threads = threads_re.group(1)
173
174 tps_re = re.search('transactions:\s+\d+\s+\((\S+) per sec.\)', line)
175 if tps_re:
176 tps = tps_re.group(1)
177 break
178
179 print >> out, 'threads=%s\ntps=%s' % (threads, tps)
180 out.close()
181