Statistics
| Branch: | Tag: | Revision:

root / test / py / lockperf.py @ 14933c17

History | View | Annotate | Download (3.5 kB)

1 e4d452b4 Michael Hanselmann
#!/usr/bin/python
2 e4d452b4 Michael Hanselmann
#
3 e4d452b4 Michael Hanselmann
4 e4d452b4 Michael Hanselmann
# Copyright (C) 2011 Google Inc.
5 e4d452b4 Michael Hanselmann
#
6 e4d452b4 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 e4d452b4 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 e4d452b4 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 e4d452b4 Michael Hanselmann
# (at your option) any later version.
10 e4d452b4 Michael Hanselmann
#
11 e4d452b4 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 e4d452b4 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 e4d452b4 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 e4d452b4 Michael Hanselmann
# General Public License for more details.
15 e4d452b4 Michael Hanselmann
#
16 e4d452b4 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 e4d452b4 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 e4d452b4 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 e4d452b4 Michael Hanselmann
# 02110-1301, USA.
20 e4d452b4 Michael Hanselmann
21 e4d452b4 Michael Hanselmann
22 e4d452b4 Michael Hanselmann
"""Script for testing lock performance"""
23 e4d452b4 Michael Hanselmann
24 e4d452b4 Michael Hanselmann
import os
25 e4d452b4 Michael Hanselmann
import sys
26 e4d452b4 Michael Hanselmann
import time
27 e4d452b4 Michael Hanselmann
import optparse
28 e4d452b4 Michael Hanselmann
import threading
29 e4d452b4 Michael Hanselmann
import resource
30 e4d452b4 Michael Hanselmann
31 e4d452b4 Michael Hanselmann
from ganeti import locking
32 e4d452b4 Michael Hanselmann
33 e4d452b4 Michael Hanselmann
34 e4d452b4 Michael Hanselmann
def ParseOptions():
35 e4d452b4 Michael Hanselmann
  """Parses the command line options.
36 e4d452b4 Michael Hanselmann

37 e4d452b4 Michael Hanselmann
  In case of command line errors, it will show the usage and exit the
38 e4d452b4 Michael Hanselmann
  program.
39 e4d452b4 Michael Hanselmann

40 e4d452b4 Michael Hanselmann
  @return: the options in a tuple
41 e4d452b4 Michael Hanselmann

42 e4d452b4 Michael Hanselmann
  """
43 e4d452b4 Michael Hanselmann
  parser = optparse.OptionParser()
44 e4d452b4 Michael Hanselmann
  parser.add_option("-t", dest="thread_count", default=1, type="int",
45 e4d452b4 Michael Hanselmann
                    help="Number of threads", metavar="NUM")
46 e4d452b4 Michael Hanselmann
  parser.add_option("-d", dest="duration", default=5, type="float",
47 e4d452b4 Michael Hanselmann
                    help="Duration", metavar="SECS")
48 e4d452b4 Michael Hanselmann
49 e4d452b4 Michael Hanselmann
  (opts, args) = parser.parse_args()
50 e4d452b4 Michael Hanselmann
51 e4d452b4 Michael Hanselmann
  if opts.thread_count < 1:
52 e4d452b4 Michael Hanselmann
    parser.error("Number of threads must be at least 1")
53 e4d452b4 Michael Hanselmann
54 e4d452b4 Michael Hanselmann
  return (opts, args)
55 e4d452b4 Michael Hanselmann
56 e4d452b4 Michael Hanselmann
57 e4d452b4 Michael Hanselmann
class State:
58 e4d452b4 Michael Hanselmann
  def __init__(self, thread_count):
59 e4d452b4 Michael Hanselmann
    """Initializes this class.
60 e4d452b4 Michael Hanselmann

61 e4d452b4 Michael Hanselmann
    """
62 fc4498e9 Michael Hanselmann
    self.verify = [0 for _ in range(thread_count)]
63 e4d452b4 Michael Hanselmann
    self.counts = [0 for _ in range(thread_count)]
64 e4d452b4 Michael Hanselmann
    self.total_count = 0
65 e4d452b4 Michael Hanselmann
66 e4d452b4 Michael Hanselmann
67 e4d452b4 Michael Hanselmann
def _Counter(lock, state, me):
68 e4d452b4 Michael Hanselmann
  """Thread function for acquiring locks.
69 e4d452b4 Michael Hanselmann

70 e4d452b4 Michael Hanselmann
  """
71 e4d452b4 Michael Hanselmann
  counts = state.counts
72 e4d452b4 Michael Hanselmann
  verify = state.verify
73 e4d452b4 Michael Hanselmann
74 e4d452b4 Michael Hanselmann
  while True:
75 e4d452b4 Michael Hanselmann
    lock.acquire()
76 e4d452b4 Michael Hanselmann
    try:
77 e4d452b4 Michael Hanselmann
      verify[me] = 1
78 e4d452b4 Michael Hanselmann
79 e4d452b4 Michael Hanselmann
      counts[me] += 1
80 e4d452b4 Michael Hanselmann
81 e4d452b4 Michael Hanselmann
      state.total_count += 1
82 e4d452b4 Michael Hanselmann
83 e4d452b4 Michael Hanselmann
      if state.total_count % 1000 == 0:
84 e4d452b4 Michael Hanselmann
        sys.stdout.write(" %8d\r" % state.total_count)
85 e4d452b4 Michael Hanselmann
        sys.stdout.flush()
86 e4d452b4 Michael Hanselmann
87 e4d452b4 Michael Hanselmann
      if sum(verify) != 1:
88 e4d452b4 Michael Hanselmann
        print "Inconsistent state!"
89 e4d452b4 Michael Hanselmann
        os._exit(1) # pylint: disable=W0212
90 e4d452b4 Michael Hanselmann
91 e4d452b4 Michael Hanselmann
      verify[me] = 0
92 e4d452b4 Michael Hanselmann
    finally:
93 e4d452b4 Michael Hanselmann
      lock.release()
94 e4d452b4 Michael Hanselmann
95 e4d452b4 Michael Hanselmann
96 e4d452b4 Michael Hanselmann
def main():
97 e4d452b4 Michael Hanselmann
  (opts, _) = ParseOptions()
98 e4d452b4 Michael Hanselmann
99 e4d452b4 Michael Hanselmann
  lock = locking.SharedLock("TestLock")
100 e4d452b4 Michael Hanselmann
101 e4d452b4 Michael Hanselmann
  state = State(opts.thread_count)
102 e4d452b4 Michael Hanselmann
103 e4d452b4 Michael Hanselmann
  lock.acquire(shared=0)
104 e4d452b4 Michael Hanselmann
  try:
105 e4d452b4 Michael Hanselmann
    for i in range(opts.thread_count):
106 e4d452b4 Michael Hanselmann
      t = threading.Thread(target=_Counter, args=(lock, state, i))
107 e4d452b4 Michael Hanselmann
      t.setDaemon(True)
108 e4d452b4 Michael Hanselmann
      t.start()
109 e4d452b4 Michael Hanselmann
110 e4d452b4 Michael Hanselmann
    start = time.clock()
111 e4d452b4 Michael Hanselmann
  finally:
112 e4d452b4 Michael Hanselmann
    lock.release()
113 e4d452b4 Michael Hanselmann
114 e4d452b4 Michael Hanselmann
  while True:
115 e4d452b4 Michael Hanselmann
    if (time.clock() - start) > opts.duration:
116 e4d452b4 Michael Hanselmann
      break
117 e4d452b4 Michael Hanselmann
    time.sleep(0.1)
118 e4d452b4 Michael Hanselmann
119 e4d452b4 Michael Hanselmann
  # Make sure we get a consistent view
120 e4d452b4 Michael Hanselmann
  lock.acquire(shared=0)
121 e4d452b4 Michael Hanselmann
122 e4d452b4 Michael Hanselmann
  lock_cputime = time.clock() - start
123 e4d452b4 Michael Hanselmann
124 e4d452b4 Michael Hanselmann
  res = resource.getrusage(resource.RUSAGE_SELF)
125 e4d452b4 Michael Hanselmann
126 e4d452b4 Michael Hanselmann
  print "Total number of acquisitions: %s" % state.total_count
127 e4d452b4 Michael Hanselmann
  print "Per-thread acquisitions:"
128 e4d452b4 Michael Hanselmann
  for (i, count) in enumerate(state.counts):
129 e4d452b4 Michael Hanselmann
    print ("  Thread %s: %d (%0.1f%%)" %
130 e4d452b4 Michael Hanselmann
           (i, count, (100.0 * count / state.total_count)))
131 e4d452b4 Michael Hanselmann
132 e4d452b4 Michael Hanselmann
  print "Benchmark CPU time: %0.3fs" % lock_cputime
133 e4d452b4 Michael Hanselmann
  print ("Average time per lock acquisition: %0.5fms" %
134 e4d452b4 Michael Hanselmann
         (1000.0 * lock_cputime / state.total_count))
135 e4d452b4 Michael Hanselmann
  print "Process:"
136 e4d452b4 Michael Hanselmann
  print "  User time: %0.3fs" % res.ru_utime
137 e4d452b4 Michael Hanselmann
  print "  System time: %0.3fs" % res.ru_stime
138 e4d452b4 Michael Hanselmann
  print "  Total time: %0.3fs" % (res.ru_utime + res.ru_stime)
139 e4d452b4 Michael Hanselmann
140 e4d452b4 Michael Hanselmann
  # Exit directly without attempting to clean up threads
141 e4d452b4 Michael Hanselmann
  os._exit(0) # pylint: disable=W0212
142 e4d452b4 Michael Hanselmann
143 e4d452b4 Michael Hanselmann
144 e4d452b4 Michael Hanselmann
if __name__ == "__main__":
145 e4d452b4 Michael Hanselmann
  main()