forked from memcached/mc-crusher
-
Notifications
You must be signed in to change notification settings - Fork 3
ENSIGN CRUSHER
License
dormando/mc-crusher
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
An extremely rough but extremely damaging benchmark utility for memcached. Does not use a client library, does not use threads (though it will). Uses event based sockets via libevent. Building -------- $ (install libevent + headers) $ ./compile Usage ----- Look in the conf/ directory for example configuration files. $ ./mc-crusher ./conf/loadconf [host] [port] defaults: host: 127.0.0.1 port: 11211 Running ------- This tool is extremely rough. First, run it for a few seconds with a config like "conf/loadconf", this will seed the instance with some values to fetch later. Now, kill it. You can also use the bench-warmer.pl tool to preload some keys. Pick a config file, and start it as above. You should start a fresh memcached, and run the "sample" script that comes with mc-crusher. mc-crusher makes no attempt to care about what it does. It flails tiredlessly against the fanged defenses of the cache daemon. Modify bench-sample to print what you are most interested in examining. You can change the "default" destination ip/port by adding extra arguments: $ ./mc-crusher ./conf/loadconf 192.168.1.1 11211 Configuration ------------- mc-crusher reads a configuration file then executes. These configurations describe a "type" of connection, one per line. Each "type" can spawn N connections. This allows you to mix setters and getters, getters of different sizes, binprot + asciiprot. It's very limited right now, but I wanted to build this in as a base. Config Options -------------- send : defines what function to use to send requests to memcached - ascii_get : one get per request via asciiprot - ascii_set : one set per request via asciiprot - ascii_delete : one delete per request via asciiprot - ascii_mget : multiget test via asciiprot - bin_get : one get per req via binprot - bin_getq : endless streaming multiget from hell - bin_set : one set per req via binprot - bin_setq : unleash cthulu upon the cache_lock recv : same, but for received data - blind_recv : mindlessly slurp any responses without inspecting them mget_count : set this to the number of keys to fetch per get in ascii_mget key_prefix : a string to prefix before each key's number (default 'foo') value_size : size of the value to set expire : the expiration value (default 0) flags : client flags (raw number, default 0) value : define a value by hand. Must be shortish and a string. host : define a host to connect to port : define a port to connect to key_prealloc : pre-create key strings in memory to reduce bench cpu usage key_count : number of keys to iterate across. use with key_prealloc=0 to iterate over large numbers of keys key_randomize : if using prealloc'ed keys, shuffle the list after generating usleep : fire one write event (up to pipeline count) with a microsecond sleep after. the sleep is per-connection (so conns=2 will write twice per usleep) stop_after : stop all conns for this test after N writes have been made. Caveats ------- - I bundled the protocol_binary.h header. It will need to be copied from the primary repo for updates. - Does not make any attempt to safely parse the config file. If you don't type it exactly right you will end up with bizarre failures. - It only works well with small values - It makes no attempt to reconcile with errors in the protocol, and can break if memcached throws errors. It will also stop if the connections are closed. - It's a ton of fun! Future Features --------------- A short list of things I intend to change or add: - Fix the command generators to have a *little* error handling - Switch to writev and use iovectors + pregenerated keys for almost everything - Add back some routines which are sprintf only, for doing tests with extremely wide keyspaces where performance is less of an issue. - Add a "run_every" option which fires a conn every N microseconds instead of endlessly. - Add a "timer" option which times the commands it runs and periodically dumps a histogram of response times. Mainly to be used with "run_every" - Add missing protocol commands. *_incr, *_decr, *_delete, etc. - Make the iteration loop per-connection, and randomizeable. - Add commands to iterate over different value sizes - Add multithreading to ease management. - Allow running timer conns in their own thread (or just define if a conn template should use a thread, then define conns=1?) - Bundle a better perl util for printing stats - Write/bundle a better util for running iterative benchmarks.
About
ENSIGN CRUSHER
Resources
License
Stars
Watchers
Forks
Packages 0
No packages published
Languages
- C 67.6%
- Perl 31.7%
- Other 0.7%