Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

README and script skeleton

  • Loading branch information...
commit 78a286c99c52f620842a7730dc1f9832cd3cd5a1 1 parent 146b193
@avsej avsej authored
Showing with 208 additions and 0 deletions.
  1. +3 −0  Gemfile
  2. +25 −0 Gemfile.lock
  3. +50 −0 README.markdown
  4. +130 −0 run.rb
View
3  Gemfile
@@ -0,0 +1,3 @@
+source :rubygems
+
+gem 'em-couchbase', '~> 0.9.0'
View
25 Gemfile.lock
@@ -0,0 +1,25 @@
+GEM
+ remote: http://rubygems.org/
+ specs:
+ addressable (2.2.7)
+ cookiejar (0.3.0)
+ em-couchbase (0.9.0)
+ em-http-request (~> 1.0.1)
+ yajl-ruby (~> 1.1.0)
+ em-http-request (1.0.2)
+ addressable (>= 2.2.3)
+ cookiejar
+ em-socksify
+ eventmachine (>= 1.0.0.beta.4)
+ http_parser.rb (>= 0.5.3)
+ em-socksify (0.1.0)
+ eventmachine
+ eventmachine (1.0.0.beta.4)
+ http_parser.rb (0.5.3)
+ yajl-ruby (1.1.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ em-couchbase (~> 0.9.0)
View
50 README.markdown
@@ -0,0 +1,50 @@
+# em-couchbase-loader
+
+This script helps to measure performance of the [em-couchbase][1] gem.
+
+## Setup
+
+Clone repository:
+
+ $ git clone git://github.com/avsej/em-couchbase-loader.git
+
+Install dependencies, using bundler:
+
+ $ cd em-couchbase-loader
+ $ bundle install
+
+
+## Usage
+
+To show available options run script with `-?` argument:
+
+ $ ./run.rb --help
+ Usage: ./run.rb [options]
+ -c, --concurrency NUM Use NUM processes to run the test (default: 1)
+ -n, --operations NUM Number of operations (default: 100)
+ -r, --ratio RATIO The ratio if set/get operations (default: 0.5)
+ -h, --hostname HOSTNAME Hostname to connect to (default: nil)
+ -b, --bucket NAME Name of the bucket to connect to (default: "default")
+ -u, --user USERNAME Username to log with (default: none)
+ -p, --passwd PASSWORD Password to log with (default: none)
+ -?, --help Show this message
+
+## License
+
+ Author:: Couchbase <info@couchbase.com>
+ Copyright:: 2012 Couchbase, Inc.
+ License:: Apache License, Version 2.0
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+[1]: https://github.com/avsej/couchbase-ruby-client
View
130 run.rb
@@ -0,0 +1,130 @@
+#!/usr/bin/env ruby
+# Author:: Couchbase <info@couchbase.com>
+# Copyright:: 2012 Couchbase, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require 'rubygems'
+begin
+ require 'bundler/setup'
+rescue LoadError
+ # don't worry if bundler isn't available
+ # the script could be installed somewhere in PATH
+end
+require 'em-couchbase'
+require 'optparse'
+require 'logger'
+
+options = {
+ :host => "127.0.0.1:8091",
+ :bucket => "default",
+ :concurrency => 1,
+ :ratio => 0.5,
+ :operations => 10_000,
+ :prefix => 'em-couchbase:',
+ :size => 256,
+ :slice => 1_000,
+ :tick => 1
+}
+
+LOGGER = Logger.new(STDOUT)
+
+trap("INT") do
+ LOGGER.info("Caught SIGINT. Terminating...")
+ exit
+end
+
+OptionParser.new do |opts|
+ opts.banner = "Usage: #{__FILE__} [options]"
+ opts.on("-t", "--tick SECONDS", "The interval for timer (default: #{options[:tick].inspect})") do |v|
+ options[:tick] = v.to_i
+ end
+ opts.on("-S", "--slice NUM", "The number of operation scheduled each timer occurence (default: #{options[:slice].inspect})") do |v|
+ options[:slice] = v.to_i
+ end
+ opts.on("-P", "--prefix PREFIX", "The prefix used for keys (default: #{options[:prefix].inspect})") do |v|
+ options[:prefix] = v.to_i
+ end
+ opts.on("-c", "--concurrency NUM", "Use NUM processes to run the test (default: #{options[:concurrency].inspect})") do |v|
+ options[:concurrency] = v.to_i
+ end
+ opts.on("-n", "--operations NUM", "Number of operations (default: #{options[:operations].inspect})") do |v|
+ options[:operations] = v.to_i
+ end
+ opts.on("-r", "--ratio RATIO", "The percent of GETs from 1 (default: #{options[:ratio].inspect})") do |v|
+ options[:ratio] = v.to_f
+ end
+ opts.on("-s", "--size SIZE", "Number of bytes for values (default: #{options[:size].inspect})") do |v|
+ options[:size] = v.to_i
+ end
+ opts.on("-h", "--hostname HOSTNAME", "Hostname to connect to (default: #{options[:hostname].inspect})") do |v|
+ host, port = v.split(':')
+ options[:hostname] = host.empty? ? '127.0.0.1' : host
+ options[:port] = port.to_i > 0 ? port.to_i : 8091
+ end
+ opts.on("-b", "--bucket NAME", "Name of the bucket to connect to (default: #{options[:bucket].inspect})") do |v|
+ options[:bucket] = v.empty? ? "default" : v
+ end
+ opts.on("-u", "--user USERNAME", "Username to log with (default: none)") do |v|
+ options[:user] = v
+ end
+ opts.on("-p", "--passwd PASSWORD", "Password to log with (default: none)") do |v|
+ options[:passwd] = v
+ end
+ opts.on_tail("-?", "--help", "Show this message") do
+ puts opts
+ exit
+ end
+end.parse!
+
+ops_per_fork = (options[:operations] / options[:concurrency].to_f).ceil
+forks = []
+
+options[:concurrency].times do |n|
+ forks << fork do
+ $0 = "#{__FILE__}: fork ##{n}"
+ value = $0.dup
+ value << ('.' * (options[:size] - value.size))
+
+ EM.run do
+ cc = EM::Protocols::Couchbase.connect
+ on_complete = lambda do |ret|
+ ops_per_fork -= 1
+# case ret.operation
+# when :set
+# STDERR.print("s")
+# when :get
+# STDERR.print("g")
+# end
+ EM.stop if ops_per_fork < 0
+ end
+ on_tick = lambda do
+# STDERR.print(".")
+ options[:slice].times do
+ if rand > options[:ratio]
+ cc.set("#{options[:prefix]}fork-#{n}:#{n % 10}", value, &on_complete)
+ else
+ cc.get("#{options[:prefix]}fork-#{n}:#{n % 10}", &on_complete)
+ end
+ end
+ end
+ EM.add_periodic_timer(options[:tick], &on_tick)
+ end
+ end
+end
+
+forks.each do |pid|
+ Process.wait(pid)
+end
Please sign in to comment.
Something went wrong with that request. Please try again.