doc update with gallery
Change-Id: I25e13c27fcd4d88f14c04190050c16d654ead6bc
This commit is contained in:
parent
879b366ac2
commit
6f1b2502d4
139
README.rst
139
README.rst
@ -1,126 +1,23 @@
|
|||||||
========
|
=====================
|
||||||
Overview
|
KloudBuster version 6
|
||||||
========
|
=====================
|
||||||
|
|
||||||
How good is your OpenStack data plane or storage plane under real heavy load?
|
How good is your OpenStack *data plane* or *storage service* under real heavy load?
|
||||||
|
|
||||||
KloudBuster is a tool that can load the data or storage plane of any OpenStack
|
KloudBuster is a tool that can load the data plane or storage infrastructure of any OpenStack
|
||||||
cloud at massive scale and can measure how well the cloud behaves under load.
|
cloud at massive scale and measure how well the cloud behaves under load
|
||||||
|
where it matters: from the VMs standpoint, where cloud applications run.
|
||||||
|
|
||||||
Anybody with basic knowledge of OpenStack, data plane and storage
|
Accessible to anybody with basic knowledge of OpenStack, installs in minutes and runs
|
||||||
performance concepts can use the tool and get scale numbers for any OpenStack
|
off the box with sensible default workloads in a fully automated way.
|
||||||
cloud straight off the box with pre-defined default workloads.
|
CLI/REST or Web User Interface.. you pick what works best for you.
|
||||||
|
|
||||||
No need for complex installation as the KloudBuster installation takes care of
|
Read the full documentation with feature list, snapshots and diagrams,
|
||||||
all the dependencies.
|
scale test design, how-to and installation instructions:
|
||||||
|
|
||||||
|
|
||||||
Features
|
`KloudBuster Documentation <http://kloudbuster.readthedocs.org>`_
|
||||||
--------
|
|
||||||
|
|
||||||
* Neutron configuration agnostic (any encapsulation, any overlay, any plugin)
|
|
||||||
|
|
||||||
* OpenStack Storage backend agnostic
|
|
||||||
|
|
||||||
* User can specify any number of tenants, routers, networks, VM instances (only
|
|
||||||
limited by cloud capacity) and KloudBuster will stage all these resources in a
|
|
||||||
way that makes sense for operational usage
|
|
||||||
|
|
||||||
* Real VM-level performance and scale numbers (not bare metal)
|
|
||||||
|
|
||||||
* Punishing scale (thousands of VMs and enough load to fill even the fastest NIC
|
|
||||||
cards or load any storage cluster with ease - if your cloud can even support
|
|
||||||
that much)
|
|
||||||
|
|
||||||
* Data plane with HTTP traffic load:
|
|
||||||
|
|
||||||
* Can load the data plane with one OpenStack cloud (single-cloud operations
|
|
||||||
for L3 East-West scale) or 2 OpenStack clouds (dual-cloud operations with
|
|
||||||
one cloud hosting the HTTP servers and the other loading HTTP traffic for
|
|
||||||
L3 North-South scale testing)
|
|
||||||
|
|
||||||
* Real HTTP servers (Nginx) running in real Linux images (Ubuntu 14.04)
|
|
||||||
|
|
||||||
* Can specify any number of HTTP servers per tenant (as many as your cloud
|
|
||||||
can handle)
|
|
||||||
|
|
||||||
* High performance and highly scalable HTTP traffic generators to simulate
|
|
||||||
huge number of HTTP users and TCP connections (hundreds of thousands to
|
|
||||||
millions of concurrent and active connections)
|
|
||||||
|
|
||||||
* Overall throughput aggegation and loss-less latency aggregation for every
|
|
||||||
single HTTP request (typically millions per run) using the open source
|
|
||||||
HdrHistogram library
|
|
||||||
|
|
||||||
* Traffic shaping to specify on which links traffic should flow
|
|
||||||
|
|
||||||
* Can support periodic reporting and aggregation of results
|
|
||||||
|
|
||||||
* Storage load:
|
|
||||||
|
|
||||||
* VM-level Cinder volume (block storage) or Ephemeral disk file I/O performance measurement
|
|
||||||
using FIO running inside VMs (not bare metal)
|
|
||||||
|
|
||||||
* Supports random and sequential file access mode
|
|
||||||
|
|
||||||
* Supports read, write and read/write mix
|
|
||||||
|
|
||||||
* IOPs, bandwitdh and loss-less latency aggregation
|
|
||||||
|
|
||||||
* User configurable storage workload profiles
|
|
||||||
|
|
||||||
* Supports automated scale progressions (VM count series in any multiple
|
|
||||||
increment) to reduce dramatically scale testing time
|
|
||||||
|
|
||||||
* Highly efficient and scalable metric aggregation
|
|
||||||
|
|
||||||
* Automatic cleanup upon termination (can be disabled)
|
|
||||||
|
|
||||||
* Manual cleanup script
|
|
||||||
|
|
||||||
* KloudBuster Server to drive scale test:
|
|
||||||
|
|
||||||
* from any browser (KloudBuster Web UI)
|
|
||||||
|
|
||||||
* from any external programs (KloudBuster REST API)
|
|
||||||
|
|
||||||
* Aggregated results provide an easy to understand way to assess the scale of
|
|
||||||
the cloud under test
|
|
||||||
|
|
||||||
* KloudBuster VM image pre-built and available from the OpenStack Community App
|
|
||||||
Catalog (https://apps.openstack.org/)
|
|
||||||
|
|
||||||
|
|
||||||
Limitations and Non-Goals
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
* Requires Neutron networking (does not support Nova networking)
|
|
||||||
|
|
||||||
* Only supports HTTP and storage traffic in this version
|
|
||||||
|
|
||||||
Unlike some other scaling test frameworks, KloudBuster does *not* attempt to:
|
|
||||||
|
|
||||||
* provide a scale test framework that works across different cloud technologies
|
|
||||||
(OpenStack + AWS + Google Cloud + ...) - we are only focusing on OpenStack
|
|
||||||
|
|
||||||
* provide a scale test framework that is flexible and programmable to do everything -
|
|
||||||
we just focus on opinionated and well targeted performance and scale areas
|
|
||||||
with sensible use cases and available in a fully integrated and easy to consume
|
|
||||||
packaged format
|
|
||||||
|
|
||||||
* replace bare metal and domain specific native performance and scale frameworks
|
|
||||||
(line level traffic generators, ceph specific performance and scale tools...)
|
|
||||||
|
|
||||||
|
|
||||||
Contributions and Feedbacks
|
|
||||||
---------------------------
|
|
||||||
|
|
||||||
If you are interested in OpenStack Performance and Scale, contributions and
|
|
||||||
feedbacks are welcome!
|
|
||||||
|
|
||||||
If you have any feedbacks or would like to make small or large contributions,
|
|
||||||
simply send an email to openstack-dev@lists.openstack.org with a '[kloudbuster]'
|
|
||||||
tag in the subject.
|
|
||||||
|
|
||||||
|
|
||||||
Licensing
|
Licensing
|
||||||
@ -150,13 +47,3 @@ the FIO binary copy was not modified and can be found directly at
|
|||||||
`<https://github.com/axboe/fio>`_ or can be obtained by email request to the
|
`<https://github.com/axboe/fio>`_ or can be obtained by email request to the
|
||||||
maintainer of KloudBuster.
|
maintainer of KloudBuster.
|
||||||
|
|
||||||
|
|
||||||
Links
|
|
||||||
-----
|
|
||||||
|
|
||||||
* Documentation: `<http://kloudbuster.readthedocs.org>`_
|
|
||||||
* `KloudBuster REST API documentation Preview <https://htmlpreview.github.io/?https://github.com/openstack/kloudbuster/blob/master/doc/source/_static/kloudbuster-swagger.html>`_
|
|
||||||
* Source: `<http://git.openstack.org/cgit/openstack/kloudbuster>`_
|
|
||||||
* Supports/Bugs: `<http://launchpad.net/kloudbuster>`_
|
|
||||||
* Mailing List: kloudbuster-core@lists.launchpad.net
|
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
========================
|
.. _arch:
|
||||||
|
|
||||||
KloudBuster Architecture
|
KloudBuster Architecture
|
||||||
========================
|
========================
|
||||||
|
|
||||||
@ -20,7 +21,7 @@ that run inside the same cloud. Such traffic can involve:
|
|||||||
(that is the packets do not have to go through a router) - often called L2
|
(that is the packets do not have to go through a router) - often called L2
|
||||||
East-West
|
East-West
|
||||||
|
|
||||||
- Packet routing if the 2 end points belong to differet Neutron networks
|
- Packet routing if the 2 end points belong to different Neutron networks
|
||||||
(packets have to go through router) - often called L3 East-West
|
(packets have to go through router) - often called L3 East-West
|
||||||
|
|
||||||
The KloudBuster data plane scale test exercises L3 East-West traffic by running
|
The KloudBuster data plane scale test exercises L3 East-West traffic by running
|
||||||
@ -32,7 +33,7 @@ corresponding server router as illustrated in the following diagram:
|
|||||||
.. image:: images/kb-http-east-west.png
|
.. image:: images/kb-http-east-west.png
|
||||||
|
|
||||||
The KloudBuster App typically runs outside the cloud under test on any server
|
The KloudBuster App typically runs outside the cloud under test on any server
|
||||||
that has a python interpreter (Macbook, Linux workstation...) with the
|
that has a python interpreter (MacBook, Linux workstation...) with the
|
||||||
requirement to have access to the OpenStack API of the cloud under test.
|
requirement to have access to the OpenStack API of the cloud under test.
|
||||||
|
|
||||||
The KloudBuster app basically reads the requested scale config (which contains
|
The KloudBuster app basically reads the requested scale config (which contains
|
||||||
@ -60,7 +61,7 @@ Rack to Rack Data Plane Scale
|
|||||||
-----------------------------
|
-----------------------------
|
||||||
|
|
||||||
By default KloudBuster will rely on the Nova scheduler to place the various
|
By default KloudBuster will rely on the Nova scheduler to place the various
|
||||||
cient and server VMs. As a result these VMs will be load balanced across all
|
client and server VMs. As a result these VMs will be load balanced across all
|
||||||
servers and causing the data path of the HTTP traffic to be quite random. This
|
servers and causing the data path of the HTTP traffic to be quite random. This
|
||||||
can be good to measure the scale on a random traffic pattern but sometimes it is
|
can be good to measure the scale on a random traffic pattern but sometimes it is
|
||||||
more interesting to shape the HTTP traffic can be shaped to follow certain
|
more interesting to shape the HTTP traffic can be shaped to follow certain
|
||||||
@ -83,12 +84,12 @@ North South Data Plane Scale Test
|
|||||||
---------------------------------
|
---------------------------------
|
||||||
|
|
||||||
The North South traffic refers to traffic flowing between external sources and
|
The North South traffic refers to traffic flowing between external sources and
|
||||||
VMs runnin in the cloud. Such traffic follows a very different path than
|
VMs running in the cloud. Such traffic follows a very different path than
|
||||||
East-West traffic as it is generally always routed and requires the used of IP
|
East-West traffic as it is generally always routed and requires the used of IP
|
||||||
address translation (SNAT and DNAT). One exception to this is the use of a
|
address translation (SNAT and DNAT). One exception to this is the use of a
|
||||||
provider network which may avoid routing and NAT completely.
|
provider network which may avoid routing and NAT completely.
|
||||||
|
|
||||||
KloudBuster provides a option to test the North-South data plabe traffic by
|
KloudBuster provides a option to test the North-South data plane traffic by
|
||||||
separating the client VMs and server VMs into 2 different OpenStack clouds.
|
separating the client VMs and server VMs into 2 different OpenStack clouds.
|
||||||
|
|
||||||
.. image:: images/kb-http-north-south.png
|
.. image:: images/kb-http-north-south.png
|
||||||
@ -101,12 +102,20 @@ Storage Scale Test
|
|||||||
++++++++++++++++++
|
++++++++++++++++++
|
||||||
|
|
||||||
The storage scale test is a relatively simpler version of the data plane scale
|
The storage scale test is a relatively simpler version of the data plane scale
|
||||||
test as it only involves 1 tenant 1 network and 1 router. Each test VM runs an
|
test as it only involves 1 tenant, 1 network and 1 router. Each test VM runs one
|
||||||
instance of the FIO test client (`FIO <https://github.com/axboe/fio>`_ is a
|
instance of the FIO test client (`FIO <https://github.com/axboe/fio>`_ which is a
|
||||||
popular open source storage test client).
|
widely adopted open source storage test client).
|
||||||
|
|
||||||
.. image:: images/kb-storage.png
|
.. image:: images/kb-storage.png
|
||||||
|
|
||||||
|
VM staging, storage plumbing (using Cinder or Nova for ephemeral disks) is done
|
||||||
|
by the KloudBuster app using OpenStack APIs.
|
||||||
|
Because the Cinder API abstracts the storage back-end, it is agnostic of
|
||||||
|
the technology used (Ceph, EMC...).
|
||||||
|
After the test, all resources (volumes, VMs, network, router) are cleaned up in
|
||||||
|
the proper order.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Progression Runs
|
Progression Runs
|
||||||
++++++++++++++++
|
++++++++++++++++
|
||||||
@ -118,7 +127,7 @@ Progression runs are a very convenient feature as it allows to produce result
|
|||||||
for series in a much shorter time by reusing the same set of staged VMs and
|
for series in a much shorter time by reusing the same set of staged VMs and
|
||||||
iterating the scale test to produce measurements at different scale level.
|
iterating the scale test to produce measurements at different scale level.
|
||||||
|
|
||||||
For example, to get storage performace measurement for 100 to 1000 VMs in
|
For example, to get storage performance measurement for 100 to 1000 VMs in
|
||||||
increments of 100, would require staging and unstaging 100+200+300+....+1,000 =
|
increments of 100, would require staging and unstaging 100+200+300+....+1,000 =
|
||||||
5,500 VM Instances without progression runs while it would only require staging
|
5,500 VM Instances without progression runs while it would only require staging
|
||||||
1,000 instances with VM reuse.
|
1,000 instances with VM reuse.
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
===========================
|
.. _cleanup:
|
||||||
|
|
||||||
OpenStack Resources Cleanup
|
OpenStack Resources Cleanup
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
@ -85,8 +86,8 @@ Example of cleanup log file::
|
|||||||
If such file is provided to the cleanup script using the *--file* option, only
|
If such file is provided to the cleanup script using the *--file* option, only
|
||||||
the resources described in the file will be deleted.
|
the resources described in the file will be deleted.
|
||||||
|
|
||||||
Discoverty with Resource name filter (--filter <regex>)
|
Discovery with Resource name filter (--filter <regex>)
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
If no cleanup log file is provided, resources are discovered from OpenStack and
|
If no cleanup log file is provided, resources are discovered from OpenStack and
|
||||||
selected using a regular expression on the resource name (--filter <regex>). You
|
selected using a regular expression on the resource name (--filter <regex>). You
|
||||||
|
71
doc/source/gallery.rst
Normal file
71
doc/source/gallery.rst
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
|
||||||
|
.. _gallery:
|
||||||
|
|
||||||
|
|
||||||
|
Gallery
|
||||||
|
=======
|
||||||
|
|
||||||
|
This page has links to examples of scale test reports in HTML format generated by KloudBuster.
|
||||||
|
These reports were generated within minutes after starting the scale test from a
|
||||||
|
bare bone OpenStack cloud (not running anything).
|
||||||
|
Click on the thumbnail images to view the result HTML file in your browser (you will need
|
||||||
|
access to the Internet to view these files as they reference multiple Java script libraries in CDN).
|
||||||
|
|
||||||
|
Sample HTTP Scale Report
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
The following report shows an HTTP scale run with results for 1 to 20 HTTP servers
|
||||||
|
(running in as many server VMs) in increment of 5, where each HTTP server is receiving
|
||||||
|
HTTP requests from 1 HTTP traffic generator that runs in a separate VM and emulates 1,000
|
||||||
|
users sending 1 request per second each (for a total of 1000 requests per second per HTTP server).
|
||||||
|
The topology used for the test is 1 tenant, 1 router, 4 networks and 5 HTTP servers per network.
|
||||||
|
Each iteration is programmed to run for 30 seconds.
|
||||||
|
This scale settings can be viewed in the Configuration tab.
|
||||||
|
|
||||||
|
The table shows the results for each iteration step, with the requested and measured RPS
|
||||||
|
(HTTP requests per second) and the corresponding aggregated download throughput (the sum of all
|
||||||
|
downloads for all clients).
|
||||||
|
|
||||||
|
The latency distribution is shows in the chart, where each line corresponds to one load level (or
|
||||||
|
iteration in the progression). Lines can be individually shown/hidden by clicking on the
|
||||||
|
corresponding legend item.
|
||||||
|
|
||||||
|
For example, the largest scale involves 20,000 simultaneous users sending an aggregate of 18,621
|
||||||
|
HTTP requests per second and the latency chart tells us that 99.9% of these 18,621 requests are
|
||||||
|
replied within 34ms, which is actually excellent.
|
||||||
|
|
||||||
|
Note that this test is configured to reuse HTTP connections meaning that we do not have the
|
||||||
|
overhead of creating a new TCP connection for every HTTP request. This also means that this cloud
|
||||||
|
had 20,000 TCP active connections at all times during the scale test.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.. image:: images/kb-http-thumbnail.png
|
||||||
|
:target: https://htmlpreview.github.io/?https://github.com/openstack/kloudbuster/blob/master/doc/source/gallery/http.html
|
||||||
|
|
||||||
|
|
||||||
|
Sample Storage Scale Report
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
This is a report for a storage scale test using the default workload suite with a progression run
|
||||||
|
from 1 VM to 20 VMs in increment of 5, and 30 second run per iteration.
|
||||||
|
This results in 6 tabs of results (1 per workload). The mixed read/write tabs further split in
|
||||||
|
2 sub tabs (1 for read and 1 for write results).
|
||||||
|
|
||||||
|
The random read tab shows that each VM could achieve its requested 100 IOPs across the progression.
|
||||||
|
The lines represent the latency value at given percentile and can be individually shown/hidden by clicking
|
||||||
|
the corresponding legend item.
|
||||||
|
As an example, 20 VMs represents a combined 2,000 IOPs measured for a total of 60,000 random read operations.
|
||||||
|
The latency line tells us that 99.9% of these 60,000 read operations are completed within 1.576 msec.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.. image:: images/kb-storage-thumbnail.png
|
||||||
|
:target: https://htmlpreview.github.io/?https://github.com/openstack/kloudbuster/blob/master/doc/source/gallery/storage.html
|
||||||
|
|
||||||
|
The sequential write results are more challenging as they show that the VMs cannot achieve their requested
|
||||||
|
write bandwidth (60MB/s) and can only get 49MB/s each when there are 20 of such VMs.
|
||||||
|
The latency lines also reflect that stress by peaking at 500 ms for 99.99% of all write operations (although
|
||||||
|
latency is not nearly as critical for sequential access than for random access).
|
||||||
|
|
||||||
|
|
230
doc/source/gallery/http.html
Normal file
230
doc/source/gallery/http.html
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
<!--Copyright 2016 Cisco Systems, Inc. All rights reserved.-->
|
||||||
|
|
||||||
|
<!--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.-->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US" ng-app="app">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<title>KloudBuster Report</title>
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular.min.js"></script>
|
||||||
|
<script src="https://d3js.org/d3.v3.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/line-chart/2.0.3/LineChart.min.js"></script>
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/line-chart/2.0.3/LineChart.min.css">
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ng-table/0.8.3/ng-table.min.css">
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/ng-table/0.8.3/ng-table.min.js"></script>
|
||||||
|
<link rel="stylesheet" href="https://bootswatch.com/flatly/bootstrap.min.css">
|
||||||
|
<script src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
|
||||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
|
||||||
|
|
||||||
|
<style rel="stylesheet">
|
||||||
|
.hidden {
|
||||||
|
display: inline !important;
|
||||||
|
}
|
||||||
|
.label {
|
||||||
|
padding: 0;
|
||||||
|
font-size: 110%;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 16;
|
||||||
|
color: #000000;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body ng-controller="MainCtrl">
|
||||||
|
<nav class="navbar navbar-default">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<a class="navbar-brand" ng-href="#/" style="font-family: Arial">
|
||||||
|
<span style="color:#DF314D">K</span>loudBuster
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||||
|
<ul class="nav navbar-nav" ng-init="tab=0">
|
||||||
|
<li ng-class="{active:tab==0}" ng-click="tab=0">
|
||||||
|
<a><span class="glyphicon" aria-hidden="true" ></span>Report</a>
|
||||||
|
</li>
|
||||||
|
<li ng-class="{active:tab==1}" ng-click="tab=1" ng-show="config == true">
|
||||||
|
<a><span class="glyphicon" aria-hidden="true" ></span>Configuration</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<!--<ul class="nav navbar-nav navbar-right">-->
|
||||||
|
<!--<li><a href="#"></a></li>-->
|
||||||
|
<!--</ul>-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="container" ng-show="tab == 0">
|
||||||
|
<h3>KloudBuster HTTP Test Report</h3>
|
||||||
|
<h6 style="margin-bottom:0"><span style="float:left">Latency(ms)</span></h6>
|
||||||
|
<div class="my-chart" style="height: 400px;margin-bottom: 10%">
|
||||||
|
<linechart data="data" options="options"></linechart>
|
||||||
|
</div>
|
||||||
|
<table ng-table="tableParams" class="table table-responsive table-condensed table-bordered table-striped">
|
||||||
|
<tr ng-repeat="row in tableParams.data" style="text-align:center;">
|
||||||
|
<td title="cols[0].title" ng-if="cols[0].show" style="margin:0 auto;padding:0;">
|
||||||
|
<button class="btn btn-default btn-xs {{row.seq}}" ng-click=""
|
||||||
|
style="height: 22px;width: 24px;"></button>
|
||||||
|
</td>
|
||||||
|
<td title="cols[1].title" data-sortable="cols[1].field" ng-if="cols[1].show">{{row.connection}}</td>
|
||||||
|
<td title="cols[2].title" data-sortable="cols[2].field" ng-if="cols[2].show">{{row.server_vms}}</td>
|
||||||
|
<td title="cols[3].title" data-sortable="cols[3].field" ng-if="cols[3].show">{{row.requests}}</td>
|
||||||
|
<td title="cols[4].title" data-sortable="cols[4].field" ng-if="cols[4].show">{{row.sock_err}}</td>
|
||||||
|
<td title="cols[5].title" data-sortable="cols[5].field" ng-if="cols[5].show">{{row.rps}}</td>
|
||||||
|
<td title="cols[6].title" data-sortable="cols[6].field" ng-if="cols[6].show">{{row.rate_limit}}</td>
|
||||||
|
<td title="cols[7].title" data-sortable="cols[7].field" ng-if="cols[7].show">{{row.throughput}} Gbps</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container" ng-show="tab == 1">
|
||||||
|
<h3>KloudBuster HTTP Test Configuration</h3>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-body" style="word-wrap:break-word">
|
||||||
|
<textarea style="font-family:Courier New, Monospace;width: 100%;height: 900px" disabled> {{from_outside_config}}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<footer style="text-align: center;">
|
||||||
|
<hr style="margin:2px"/>
|
||||||
|
<h6 style="color:gray">{{from_outside["time"]}} - KloudBuster {{from_outside["version"]}}</h6>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
angular.module("app", ["n3-line-chart", "ngTable"]).controller("MainCtrl", function ($scope, color, ngTableParams) {
|
||||||
|
|
||||||
|
if($scope.config = true) $scope.from_outside_config = JSON.stringify({"cleanup_resources": true, "client": {"availability_zone": null, "cleanup_resources": true, "flavor": {"disk": 0, "ram": 2048, "vcpus": 1}, "http_tool_configs": {"connection_type": "Keep-alive", "connections": 1000, "duration": 30, "rate_limit": 1000, "report_interval": 0, "threads": 1, "timeout": 5}, "image_name": "kloudbuster_v6", "keystone_admin_role": "admin", "networks_per_router": 1, "number_tenants": 1, "polling_interval": 5, "progression": {"enabled": true, "http_stop_limit": [50, 0], "storage_stop_limit": 20, "vm_multiple": 5, "vm_start": 1}, "prompt_before_run": false, "public_key_file": "/Users/xiyu3/.ssh/id_rsa.pub", "routers_per_tenant": 1, "secgroups_per_network": 1, "storage_stage_configs": {"disk_size": 10, "io_file_size": 1, "target": "volume", "vm_count": 20}, "storage_tool_configs": [{"block_size": "4k", "description": "Random Read", "iodepth": 4, "mode": "randread", "rate_iops": 100, "runtime": 30}, {"block_size": "4k", "description": "Random Write", "iodepth": 4, "mode": "randwrite", "rate_iops": 100, "runtime": 30}, {"block_size": "4k", "description": "Random Read/Write", "iodepth": 4, "mode": "randrw", "rate_iops": 100, "runtime": 30, "rwmixread": 70}, {"block_size": "64k", "description": "Sequential Read", "iodepth": 64, "mode": "read", "rate": "60M", "runtime": 30}, {"block_size": "64k", "description": "Sequential Write", "iodepth": 64, "mode": "write", "rate": "60M", "runtime": 30}, {"block_size": "64k", "description": "Sequential Read/Write", "iodepth": 64, "mode": "rw", "rate": "60M", "runtime": 30, "rwmixread": 70}], "use_floatingip": false, "vm_creation_concurrency": 5, "vms_per_network": 21}, "image_name": "kloudbuster_v6", "keystone_admin_role": "admin", "public_key_file": "/Users/xiyu3/.ssh/id_rsa.pub", "server": {"availability_zone": null, "cleanup_resources": true, "flavor": {"disk": 0, "ram": 2048, "vcpus": 1}, "http_server_configs": {"html_size": 32768}, "image_name": "kloudbuster_v6", "keystone_admin_role": "admin", "networks_per_router": 4, "number_tenants": 1, "public_key_file": "/Users/xiyu3/.ssh/id_rsa.pub", "routers_per_tenant": 1, "secgroups_per_network": 1, "use_floatingip": false, "vm_creation_concurrency": 5, "vms_per_network": 5}, "vm_creation_concurrency": 5}, null, "\t");
|
||||||
|
|
||||||
|
$scope.from_outside = {"kb_result": [{"description": "-- Stage 1: 1 VM(s), 1000 Connections, 1000 Expected RPS --", "http_rate_limit": 1000, "http_rps": 933, "http_sock_err": 0, "http_sock_timeout": 0, "http_throughput_kbytes": 30095, "http_total_req": 28001, "latency_stats": [[50, 1607], [75, 1919], [90, 2239], [99, 2815], [99.9, 3055], [99.99, 3279], [99.999, 3375]], "tool": "wrk2", "total_client_vms": 1, "total_connections": 1000, "total_server_vms": 1}, {"description": "-- Stage 2: 5 VM(s), 5000 Connections, 5000 Expected RPS --", "http_rate_limit": 5000, "http_rps": 4645, "http_sock_err": 0, "http_sock_timeout": 0, "http_throughput_kbytes": 149790, "http_total_req": 139408, "latency_stats": [[50, 1567], [75, 2191], [90, 2535], [99, 3735], [99.9, 5047], [99.99, 7591], [99.999, 8711]], "tool": "wrk2", "total_client_vms": 5, "total_connections": 5000, "total_server_vms": 5}, {"description": "-- Stage 3: 10 VM(s), 10000 Connections, 10000 Expected RPS --", "http_rate_limit": 10000, "http_rps": 9309, "http_sock_err": 0, "http_sock_timeout": 0, "http_throughput_kbytes": 300206, "http_total_req": 279355, "latency_stats": [[50, 1535], [75, 2023], [90, 2735], [99, 8991], [99.9, 17143], [99.99, 18967], [99.999, 20095]], "tool": "wrk2", "total_client_vms": 10, "total_connections": 10000, "total_server_vms": 10}, {"description": "-- Stage 4: 15 VM(s), 15000 Connections, 15000 Expected RPS --", "http_rate_limit": 15000, "http_rps": 13961, "http_sock_err": 0, "http_sock_timeout": 0, "http_throughput_kbytes": 450191, "http_total_req": 418951, "latency_stats": [[50, 1647], [75, 2159], [90, 4767], [99, 19359], [99.9, 27567], [99.99, 40551], [99.999, 47423]], "tool": "wrk2", "total_client_vms": 15, "total_connections": 15000, "total_server_vms": 15}, {"description": "-- Stage 5: 20 VM(s), 20000 Connections, 20000 Expected RPS --", "http_rate_limit": 20000, "http_rps": 18621, "http_sock_err": 0, "http_sock_timeout": 0, "http_throughput_kbytes": 600586, "http_total_req": 558895, "latency_stats": [[50, 1807], [75, 2335], [90, 3807], [99, 10703], [99.9, 34343], [99.99, 45439], [99.999, 55063]], "tool": "wrk2", "total_client_vms": 20, "total_connections": 20000, "total_server_vms": 20}], "test_mode": "http", "time": "2016-04-01 15:29:34", "version": "0.6.3"};
|
||||||
|
|
||||||
|
$scope.result = $scope.from_outside["kb_result"];
|
||||||
|
|
||||||
|
var countRep = $scope.result.length;
|
||||||
|
$scope.data = {dataset0: [{x: 0}, {x: 10}, {x: 20}, {x: 30}, {x: 40}, {x: 50}, {x: 60}]};
|
||||||
|
$scope.options = {
|
||||||
|
series: [], axes: {
|
||||||
|
x: {
|
||||||
|
key: "x", type: "linear", tickFormat: function (value) {
|
||||||
|
if (value === 0) {
|
||||||
|
return "50%"
|
||||||
|
} else if (value === 10) {
|
||||||
|
return "75%"
|
||||||
|
} else if (value === 20) {
|
||||||
|
return "90%"
|
||||||
|
} else if (value === 30) {
|
||||||
|
return "99%"
|
||||||
|
} else if (value === 40) {
|
||||||
|
return "99.9%"
|
||||||
|
} else if (value === 50) {
|
||||||
|
return "99.99%"
|
||||||
|
} else if (value === 60) {
|
||||||
|
return "99.999%"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, y: {
|
||||||
|
type: "log", ticksFormat: "d", ticks: 10, tickFormat: function (value, index) {
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, margin: {top: 20, right: 30, bottom: 20, left: 30}, grid: {x: false, y: true}
|
||||||
|
};
|
||||||
|
$scope.tabledata = [];
|
||||||
|
$scope.cols = [{field: "seq", title: "SEQ", sortable: "seq", show: true}, {
|
||||||
|
field: "connection",
|
||||||
|
title: "Connection",
|
||||||
|
sortable: "connection",
|
||||||
|
show: true
|
||||||
|
}, {field: "server_vms", title: "Server VMs", sortable: "server_vms", show: true}, {
|
||||||
|
field: "requests",
|
||||||
|
title: "Requests",
|
||||||
|
sortable: "requests",
|
||||||
|
show: true
|
||||||
|
}, {field: "sock_err", title: "Error", sortable: "sock_err", show: true}, {
|
||||||
|
field: "rps",
|
||||||
|
title: "RPS measured",
|
||||||
|
sortable: "rps",
|
||||||
|
show: true
|
||||||
|
}, {field: "rate_limit", title: "RPS requested", sortable: "rate_limit", show: true}, {
|
||||||
|
field: "throughput",
|
||||||
|
title: "Throughput",
|
||||||
|
sortable: "throughput",
|
||||||
|
show: true
|
||||||
|
},];
|
||||||
|
$scope.tableParams = new ngTableParams({sorting: {name: "asc"}, "count": 10}, {
|
||||||
|
counts: [],
|
||||||
|
data: $scope.tabledata
|
||||||
|
});
|
||||||
|
$scope.pushTableData = function (taName, taData, pickColor) {
|
||||||
|
var temThrou = (taData.http_throughput_kbytes * 8) / (1000 * 1000);
|
||||||
|
$scope.tabledata.push({
|
||||||
|
"seq": taName,
|
||||||
|
"connection": taData.total_connections,
|
||||||
|
"server_vms": taData.total_server_vms,
|
||||||
|
"requests": taData.http_total_req,
|
||||||
|
"sock_err": taData.http_sock_err + taData.http_sock_timeout,
|
||||||
|
"rps": taData.http_rps,
|
||||||
|
"rate_limit": taData.http_rate_limit,
|
||||||
|
"throughput": temThrou.toFixed(2),
|
||||||
|
"description": taData.description,
|
||||||
|
"color": pickColor
|
||||||
|
});
|
||||||
|
$("<style>button." + taName + " {background-color: " + pickColor + ";</style>").appendTo("head");
|
||||||
|
$scope.tableParams.reload()
|
||||||
|
};
|
||||||
|
for (var i = 0; i < countRep; i++) {
|
||||||
|
$scope.perrow = $scope.result[i];
|
||||||
|
var pickColor = color.getColor();
|
||||||
|
if (1) {
|
||||||
|
chName = "Connection-" + $scope.perrow.total_connections;
|
||||||
|
$scope.options.series.push({
|
||||||
|
label: chName,
|
||||||
|
color: pickColor,
|
||||||
|
dotSize: "3",
|
||||||
|
thickness: "2px",
|
||||||
|
axis: "y",
|
||||||
|
dataset: "dataset0",
|
||||||
|
key: chName,
|
||||||
|
type: ["line", "dot"],
|
||||||
|
id: chName,
|
||||||
|
interpolation: {mode: "cardinal", tension: 0.8}
|
||||||
|
});
|
||||||
|
for (var j = 0; j < 7; j++) {
|
||||||
|
$scope.data.dataset0[j][chName] = $scope.perrow.latency_stats[j][1] / 1000
|
||||||
|
}
|
||||||
|
$scope.pushTableData("Connection-" + $scope.perrow.total_connections, $scope.perrow, pickColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).service("color", function () {
|
||||||
|
var self = this;
|
||||||
|
var num = -1;
|
||||||
|
var colorList = ["#F44336", "#673AB7", "#03A9F4", "#4CAF50", "#FFEB3B", "#BF360C", "#795548", "#E91E63", "#3F51B5", "#00BCD4", "#CDDC39", "#FF9800", "#9E9E9E", "#9C27B0", "#009688"];
|
||||||
|
var length = colorList.length;
|
||||||
|
this.getColor = function () {
|
||||||
|
num = (num + 1) % length;
|
||||||
|
return colorList[num]
|
||||||
|
};
|
||||||
|
this.reset = function () {
|
||||||
|
num = -1
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
450
doc/source/gallery/storage.html
Normal file
450
doc/source/gallery/storage.html
Normal file
File diff suppressed because one or more lines are too long
BIN
doc/source/images/kb-http-thumbnail.png
Normal file
BIN
doc/source/images/kb-http-thumbnail.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
BIN
doc/source/images/kb-storage-thumbnail.png
Normal file
BIN
doc/source/images/kb-storage-thumbnail.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 71 KiB |
@ -13,6 +13,7 @@ Contents:
|
|||||||
|
|
||||||
readme
|
readme
|
||||||
architecture
|
architecture
|
||||||
|
gallery
|
||||||
installation
|
installation
|
||||||
usage
|
usage
|
||||||
cleanup
|
cleanup
|
||||||
|
@ -3,31 +3,41 @@ Installation
|
|||||||
============
|
============
|
||||||
|
|
||||||
KloudBuster is already pre-installed as a web service in the KloudBuster VM image
|
KloudBuster is already pre-installed as a web service in the KloudBuster VM image
|
||||||
available from the `OpenStack Community App Catalog <https://apps.openstack.org>`_
|
available from the `OpenStack Community App Catalog <https://apps.openstack.org>`_.
|
||||||
|
So if you just need to use the KloudBuster Web user interface you can instantiate
|
||||||
|
that VM image and point your browser to its public address as described in :ref:`run_server`.
|
||||||
|
|
||||||
There are two alternative ways to install and run KloudBuster tool.
|
There are two alternative ways to install and run KloudBuster tool.
|
||||||
Users of KloudBuster who prefers to use the CLI should use regular PyPI based installation.
|
|
||||||
Developers of KloudBuster should use the GitHub/OpenStack Repository based installation.
|
Users of KloudBuster who prefers to use the CLI or who prefer to run KloudBuster
|
||||||
|
locally on their workstation or laptop should use the PyPI based installation
|
||||||
|
(pip install).
|
||||||
|
|
||||||
|
Developers of KloudBuster should use the GitHub/OpenStack Repository based installation
|
||||||
|
(git clone).
|
||||||
|
|
||||||
Web Service and PyPI based installation will satisfy most use cases
|
Web Service and PyPI based installation will satisfy most use cases
|
||||||
and are the 2 recommended ways for running KloudBuster under production environments, or through an
|
and are the 2 recommended ways for running KloudBuster under production environments,
|
||||||
automated or scheduled job.
|
or through an automated or scheduled job.
|
||||||
The git repository based installation is targeted at developers of KloudBuster.
|
|
||||||
|
|
||||||
.. note:: Installation from PyPI will only have the latest stable version.
|
.. note:: Installation from PyPI will only have the latest stable version.
|
||||||
|
|
||||||
PyPI based Installation
|
PyPI based Installation
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
This is the recommended way to install KloudBuster for non-development use if CLI is required.
|
This is the recommended way to install KloudBuster for non-development use if CLI is preferred
|
||||||
KloudBuster is available in the Python Package Index (PyPI):
|
or if you prefer to run KloudBuster locally.
|
||||||
`KloudBuster PyPI <https://pypi.python.org/pypi/KloudBuster>`_
|
|
||||||
|
|
||||||
Step 1
|
KloudBuster is available in the Python Package Index (PyPI)
|
||||||
^^^^^^
|
`KloudBuster PyPI <https://pypi.python.org/pypi/KloudBuster>`_
|
||||||
|
and can be installed on any system that has python 2.7.
|
||||||
|
|
||||||
|
Step 1: Install pip and the python virtualenv (if not installed already)
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
You will need to have python 2.7, pip, and some dependencies installed
|
You will need to have python 2.7, pip, and some dependencies installed
|
||||||
before installing KloudBuster, run the command based on your distro.
|
before installing KloudBuster depending on the operating system at the installation site.
|
||||||
|
These pre-requisites can be skipped if the corresponding dependencies are already installed.
|
||||||
|
|
||||||
Ubuntu/Debian based:
|
Ubuntu/Debian based:
|
||||||
|
|
||||||
@ -50,8 +60,8 @@ MacOSX:
|
|||||||
$ sudo easy_install pip
|
$ sudo easy_install pip
|
||||||
$ sudo pip install virtualenv
|
$ sudo pip install virtualenv
|
||||||
|
|
||||||
Step 2
|
Step 2: Install KloudBuster in a virtual environment
|
||||||
^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Create a virtual environment for Python, and install KloudBuster:
|
Create a virtual environment for Python, and install KloudBuster:
|
||||||
|
|
||||||
@ -92,8 +102,8 @@ It is recommended to run KloudBuster inside a virtual environment. However,
|
|||||||
it can be skipped if installed in a dedicated VM.
|
it can be skipped if installed in a dedicated VM.
|
||||||
|
|
||||||
|
|
||||||
Super quick installation on Ubuntu/Debian
|
Quick installation on Ubuntu/Debian
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
@ -105,8 +115,8 @@ Super quick installation on Ubuntu/Debian
|
|||||||
$ cd kloudbuster
|
$ cd kloudbuster
|
||||||
$ pip install -r requirements-dev.txt
|
$ pip install -r requirements-dev.txt
|
||||||
|
|
||||||
Super quick installation on RHEL/Fedora/CentOS
|
Quick installation on RHEL/Fedora/CentOS
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
@ -118,11 +128,10 @@ Super quick installation on RHEL/Fedora/CentOS
|
|||||||
$ cd kloudbuster
|
$ cd kloudbuster
|
||||||
$ pip install -r requirements-dev.txt
|
$ pip install -r requirements-dev.txt
|
||||||
|
|
||||||
Super quick installation on MacOSX
|
Quick installation on MacOSX
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
KloudBuster can run natively on MacOSX. These instructions have been verified
|
KloudBuster can run natively on MacOSX.
|
||||||
to work on MacOSX 10.10 (Yosemite).
|
|
||||||
|
|
||||||
First, download XCode from App Store, then execute below commands:
|
First, download XCode from App Store, then execute below commands:
|
||||||
|
|
||||||
@ -157,9 +166,10 @@ Upload KloudBuster Image
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
If your OpenStack Glance is able to access the Internet, and you don't
|
If your OpenStack Glance is able to access the Internet and you only use
|
||||||
need to access the KloudBuster Web UI from the pre-built image, you can skip
|
the CLI to launch KloudBuster, you can skip this section (KloudBuster CLI
|
||||||
this section and you are done with the installation.
|
will request Glance to download the image from the OpenStack App Catalog when
|
||||||
|
it is not present in Glance).
|
||||||
|
|
||||||
In the cloud under test, KloudBuster needs one "universal" test VM image
|
In the cloud under test, KloudBuster needs one "universal" test VM image
|
||||||
(referred to as "KloudBuster image") that contains the necessary test software.
|
(referred to as "KloudBuster image") that contains the necessary test software.
|
||||||
@ -169,10 +179,7 @@ application using the appropriate role (HTTP server, HTTP traffic generator,
|
|||||||
etc.).
|
etc.).
|
||||||
|
|
||||||
Pre-built images are available for download from the
|
Pre-built images are available for download from the
|
||||||
`OpenStack App Catalog <http://apps.openstack.org>`_ (preferred method). For
|
`OpenStack App Catalog <http://apps.openstack.org>`_ (preferred method).
|
||||||
whatever reason the pre-built version doesn't work for you, the image can be
|
|
||||||
re-built from MacOSX using Vagrant or from any Linux server. See
|
|
||||||
:ref:`here <build_vm_image>` for more details.
|
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
@ -186,7 +193,8 @@ Manual upload of the KloudBuster VM image
|
|||||||
In order to upload the KloudBuster Image to the cloud under test, the image
|
In order to upload the KloudBuster Image to the cloud under test, the image
|
||||||
must be downloaded from the OpenStack App Catalog either directly from
|
must be downloaded from the OpenStack App Catalog either directly from
|
||||||
the OpenStack App Catalog (if you have direct access to the Internet)
|
the OpenStack App Catalog (if you have direct access to the Internet)
|
||||||
or through an intermediate location such as a jump host (a jump host has access
|
or through an intermediate location such as a laptop that has Internet access
|
||||||
|
or a jump host (a jump host has access
|
||||||
to both Internet and the cloud under
|
to both Internet and the cloud under
|
||||||
test and can be used to download the image from the App Catalog
|
test and can be used to download the image from the App Catalog
|
||||||
and upload to Glance using either a Glance CLI command or via Horizon
|
and upload to Glance using either a Glance CLI command or via Horizon
|
||||||
@ -199,7 +207,7 @@ with the "kloudbuster_v" prefix and download the latest version from the list.
|
|||||||
|
|
||||||
The name of the image in Glance must match exactly the image name in the App
|
The name of the image in Glance must match exactly the image name in the App
|
||||||
Catalog (without the .qcow2 extension), for example to upload the image from
|
Catalog (without the .qcow2 extension), for example to upload the image from
|
||||||
a local copy of that image:
|
a local copy of that image using the Glance CLI:
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
|
@ -1 +1,164 @@
|
|||||||
.. include:: ../../README.rst
|
=====================
|
||||||
|
KloudBuster version 6
|
||||||
|
=====================
|
||||||
|
|
||||||
|
How good is your OpenStack *data plane* or *storage service* under real heavy load?
|
||||||
|
|
||||||
|
KloudBuster is a tool that can load the data plane or storage infrastructure of any OpenStack
|
||||||
|
cloud at massive scale and measure how well the cloud behaves under load
|
||||||
|
where it matters: from the VMs standpoint, where cloud applications run.
|
||||||
|
|
||||||
|
Accessible to anybody with basic knowledge of OpenStack, installs in minutes and runs
|
||||||
|
off the box with sensible default workloads in a fully automated way.
|
||||||
|
CLI/REST or Web User Interface.. you pick what works best for you.
|
||||||
|
|
||||||
|
|
||||||
|
Feature List
|
||||||
|
------------
|
||||||
|
|
||||||
|
* Neutron configuration agnostic (any encapsulation, any overlay, any plugin)
|
||||||
|
|
||||||
|
* OpenStack Storage backend agnostic
|
||||||
|
|
||||||
|
* Real VM-level performance and scale numbers (not bare metal)
|
||||||
|
|
||||||
|
* Punishing scale (thousands of VMs and enough load to fill even the fastest NIC
|
||||||
|
cards or load any storage cluster with ease)
|
||||||
|
|
||||||
|
* Data plane with HTTP traffic load:
|
||||||
|
|
||||||
|
* Can load the data plane with one OpenStack cloud (single-cloud operations
|
||||||
|
for L3 East-West scale) or 2 OpenStack clouds (dual-cloud operations with
|
||||||
|
one cloud hosting the HTTP servers and the other loading HTTP traffic for
|
||||||
|
L3 North-South scale testing)
|
||||||
|
|
||||||
|
* Real HTTP servers (Nginx) running in real Linux images (Ubuntu 14.04)
|
||||||
|
|
||||||
|
* Can specify any number of tenants, routers and networks
|
||||||
|
|
||||||
|
* Can specify any number of HTTP servers per tenant (as many as your cloud
|
||||||
|
can handle)
|
||||||
|
|
||||||
|
* High performance and highly scalable HTTP traffic generators to simulate
|
||||||
|
huge number of HTTP users and TCP connections (hundreds of thousands to
|
||||||
|
millions of concurrent and active connections)
|
||||||
|
|
||||||
|
* Overall throughput aggegation and loss-less millisecond-precision latency
|
||||||
|
aggregation for every single HTTP request (typically millions per run)
|
||||||
|
|
||||||
|
* Traffic shaping to specify on which links traffic should flow
|
||||||
|
|
||||||
|
* Can support periodic reporting and aggregation of results
|
||||||
|
|
||||||
|
* Storage load:
|
||||||
|
|
||||||
|
* VM-level Cinder volume (block storage) or Ephemeral disk file I/O performance measurement
|
||||||
|
using FIO running inside VMs (not bare metal)
|
||||||
|
|
||||||
|
* Supports random and sequential file access mode
|
||||||
|
|
||||||
|
* Supports any mix of read/write
|
||||||
|
|
||||||
|
* IOPs, bandwitdh and loss-less millisecond-precision latency aggregation for every
|
||||||
|
IO operation (typically millions per run)
|
||||||
|
|
||||||
|
* User configurable workload sequence
|
||||||
|
|
||||||
|
* Supports automated scale progressions (VM count series in any multiple
|
||||||
|
increment) to reduce dramatically scale testing time
|
||||||
|
|
||||||
|
* Highly efficient and scalable metric aggregation
|
||||||
|
|
||||||
|
* Automatic cleanup upon termination
|
||||||
|
|
||||||
|
* Regular expression based cleanup script (`cleanup`_)
|
||||||
|
|
||||||
|
* KloudBuster server mode to drive scale test:
|
||||||
|
|
||||||
|
* from any browser (KloudBuster Web UI)
|
||||||
|
|
||||||
|
* or from any external programs (KloudBuster REST API)
|
||||||
|
|
||||||
|
* Aggregated results provide an easy to understand way to assess the scale of
|
||||||
|
the cloud under test
|
||||||
|
|
||||||
|
* KloudBuster VM image pre-built and available from the OpenStack Community App
|
||||||
|
Catalog (https://apps.openstack.org/)
|
||||||
|
|
||||||
|
*Diagrams* describing how the scale test resources are staged and how the traffic flows are available
|
||||||
|
in :ref:`arch`.
|
||||||
|
|
||||||
|
Scale results are available in json form or in html form with javascript graphical charts generated straight off the tool.
|
||||||
|
|
||||||
|
*Examples of results* are available in :ref:`gallery`.
|
||||||
|
|
||||||
|
|
||||||
|
Limitations and Non-Goals
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
* Requires Neutron networking (does not support Nova networking)
|
||||||
|
|
||||||
|
* Only supports HTTP and storage traffic in this version
|
||||||
|
|
||||||
|
Unlike some other scaling test frameworks, KloudBuster does *not* attempt to:
|
||||||
|
|
||||||
|
* provide a scale test framework that works across different cloud technologies
|
||||||
|
(OpenStack + AWS + Google Cloud + ...) - we are only focusing on OpenStack
|
||||||
|
|
||||||
|
* provide a scale test framework that is flexible and programmable to do everything -
|
||||||
|
we just focus on opinionated and well targeted performance and scale areas
|
||||||
|
with sensible use cases and available in a fully integrated and easy to consume
|
||||||
|
packaged format
|
||||||
|
|
||||||
|
* replace bare metal and domain specific native performance and scale frameworks
|
||||||
|
(line level traffic generators, ceph specific performance and scale tools...)
|
||||||
|
|
||||||
|
|
||||||
|
Contributions and Feedbacks
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
If you are interested in OpenStack Performance and Scale, contributions and
|
||||||
|
feedbacks are welcome!
|
||||||
|
|
||||||
|
If you have any feedbacks or would like to make small or large contributions,
|
||||||
|
simply send an email to openstack-dev@lists.openstack.org with a '[kloudbuster]'
|
||||||
|
tag in the subject.
|
||||||
|
|
||||||
|
|
||||||
|
Licensing
|
||||||
|
---------
|
||||||
|
|
||||||
|
KloudBuster is licensed under the Apache License, Version 2.0 (the "License").
|
||||||
|
You may not use this tool 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.
|
||||||
|
|
||||||
|
KloudBuster VM images contain multiple open source license components:
|
||||||
|
|
||||||
|
* nginx: BSD License (http://nginx.org/LICENSE)
|
||||||
|
* wrk2: Apache License 2.0
|
||||||
|
(https://raw.githubusercontent.com/giltene/wrk2/master/LICENSE)
|
||||||
|
* Redis: BSD License (http://redis.io/topics/license)
|
||||||
|
* FIO: GPL v2 (https://raw.githubusercontent.com/axboe/fio/master/MORAL-LICENSE)
|
||||||
|
|
||||||
|
Although the VM image includes a binary copy of the FIO code, it does not
|
||||||
|
include the source code used to build it. In accordance to the GPL V2 license
|
||||||
|
related to the inclusion of binary copies of FIO, the source code used to build
|
||||||
|
the FIO binary copy was not modified and can be found directly at
|
||||||
|
`<https://github.com/axboe/fio>`_ or can be obtained by email request to the
|
||||||
|
maintainer of KloudBuster.
|
||||||
|
|
||||||
|
|
||||||
|
Links
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Complete documentation: `<http://kloudbuster.readthedocs.org>`_
|
||||||
|
* `KloudBuster REST API documentation Preview <https://htmlpreview.github.io/?https://github.com/openstack/kloudbuster/blob/master/doc/source/_static/kloudbuster-swagger.html>`_
|
||||||
|
* Source: `<https://github.com/openstack/kloudbuster>`_
|
||||||
|
* Supports/Bugs: `<http://launchpad.net/kloudbuster>`_
|
||||||
|
* Mailing List: kloudbuster-core@lists.launchpad.net
|
||||||
|
|
||||||
|
@ -16,14 +16,15 @@ run KloudBuster:
|
|||||||
|
|
||||||
* Admin access to the cloud under test (non-admin might work with some
|
* Admin access to the cloud under test (non-admin might work with some
|
||||||
tweaks and limitations)
|
tweaks and limitations)
|
||||||
* 3 available floating IPs if running HTTP data plane testing, 2 available
|
* 3 available floating IPs if running the HTTP data plane scale test,
|
||||||
floating IPs if running Storage testing
|
* 2 available floating IPs if running the Storage scale test
|
||||||
|
|
||||||
Regardless of the way you launch KloudBuster, you will need the access info and
|
Regardless of the way you launch KloudBuster, you will need the access info and
|
||||||
the credentials to the cloud under test. This information can be downloaded
|
the credentials to the cloud under test. This information can be downloaded
|
||||||
from a Horizon dashboard (Project|Access&Security|Api Access|Download OpenStack
|
from the Horizon dashboard (Project|Access&Security|Api Access|Download OpenStack
|
||||||
RC File). Save it to your local file system for future use.
|
RC File). Save it to your local file system for future use.
|
||||||
|
|
||||||
|
.. _run_server:
|
||||||
|
|
||||||
Running KloudBuster as a Web/REST Server
|
Running KloudBuster as a Web/REST Server
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
@ -37,7 +38,7 @@ and is ready to service HTTP and REST requests once up and running. To get the
|
|||||||
KloudBuster Web server running in any OpenStack cloud:
|
KloudBuster Web server running in any OpenStack cloud:
|
||||||
|
|
||||||
1. Follow the steps :ref:`here <upload_kb_image>` to upload the KloudBuster
|
1. Follow the steps :ref:`here <upload_kb_image>` to upload the KloudBuster
|
||||||
image to the openstack cloud that will host your KloudBuster web server
|
image to the OpenStack cloud that will host your KloudBuster web server
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
This could be the same as the cloud under test or a different cloud.
|
This could be the same as the cloud under test or a different cloud.
|
||||||
@ -49,7 +50,7 @@ KloudBuster Web server running in any OpenStack cloud:
|
|||||||
3. Create or reuse a security group which allows ingress TCP traffic on port
|
3. Create or reuse a security group which allows ingress TCP traffic on port
|
||||||
8080
|
8080
|
||||||
|
|
||||||
4. Launch an instance using the KloudBuster image,with the proper security
|
4. Launch an instance using the KloudBuster image with the proper security
|
||||||
group, and connect to the appropriate network. Leave the Key Pair as blank,
|
group, and connect to the appropriate network. Leave the Key Pair as blank,
|
||||||
as we don't need the SSH access to this VM
|
as we don't need the SSH access to this VM
|
||||||
|
|
||||||
@ -82,13 +83,13 @@ is up running::
|
|||||||
Starting the KloudBuster Server from a git clone
|
Starting the KloudBuster Server from a git clone
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
If you use git clone, you can bring up the KloudBuster Web/REST server fron the
|
If you use git clone, you can bring up the KloudBuster Web/REST server from the
|
||||||
CLI. KloudBuster uses the `Pecan <http://www.pecanpy.org/>`_ web server to host
|
CLI. KloudBuster uses the `Pecan <http://www.pecanpy.org/>`_ web server to host
|
||||||
both the KloudBuster REST server and the KloudBuster front-end website (which
|
both the KloudBuster REST server and the KloudBuster front-end website (which
|
||||||
listens to port 8080 by default).
|
listens to port 8080 by default).
|
||||||
|
|
||||||
From the root of the KloudBuster repository, go to the kb_server directory. If
|
From the root of the KloudBuster repository, go to the kb_server directory. If
|
||||||
this is the first time to start the server, run below command once to setup the
|
this is the first time you start the server, run the below command once to setup the
|
||||||
environment::
|
environment::
|
||||||
|
|
||||||
$ python setup.py develop
|
$ python setup.py develop
|
||||||
@ -111,8 +112,8 @@ Using any browser, point to the provided URL at port 8080. You will get a Login
|
|||||||
page where you will need to enter:
|
page where you will need to enter:
|
||||||
|
|
||||||
* The type of scale test (HTTP data plane or storage)
|
* The type of scale test (HTTP data plane or storage)
|
||||||
* The location of openrc file of the cloud under test
|
* The location of the openrc file of the cloud under test
|
||||||
* The credentials for the cloud under test
|
* The password for the cloud under test
|
||||||
|
|
||||||
|
|
||||||
Interacting with the KloudBuster Server REST Interface
|
Interacting with the KloudBuster Server REST Interface
|
||||||
@ -133,8 +134,9 @@ If you do not really need a Web UI or REST interface, you can simply run
|
|||||||
KloudBuster scale test straight from CLI.
|
KloudBuster scale test straight from CLI.
|
||||||
|
|
||||||
KloudBuster is ready to run with the default configuration, which can be
|
KloudBuster is ready to run with the default configuration, which can be
|
||||||
displayed from the command line using *--show-config* option. By default,
|
displayed from the command line using *--show-config* option.
|
||||||
KloudBuster will run on a single cloud and run the default HTTP data plane scale
|
|
||||||
|
By default, KloudBuster will run on a single cloud and run the default HTTP data plane scale
|
||||||
test:
|
test:
|
||||||
|
|
||||||
* Create 2 tenants, 2 users, and 2 routers;
|
* Create 2 tenants, 2 users, and 2 routers;
|
||||||
@ -143,19 +145,41 @@ test:
|
|||||||
* Create 1 VM running the Redis server (for orchestration)
|
* Create 1 VM running the Redis server (for orchestration)
|
||||||
* Create 1 VM running the HTTP traffic generator (default to 1000 connections,
|
* Create 1 VM running the HTTP traffic generator (default to 1000 connections,
|
||||||
1000 requests per second, and 30 seconds duration
|
1000 requests per second, and 30 seconds duration
|
||||||
* Measure/aggegate throughput and latency
|
* Measure/aggregate throughput and latency
|
||||||
* Bring down and cleanup
|
* Bring down and cleanup
|
||||||
|
|
||||||
Run KloudBuster with the following options::
|
Run KloudBuster with the following options::
|
||||||
|
|
||||||
kloudbuster --tested-rc <path_to_the_admin_rc_file> --tested-passwd <admin_password>
|
kloudbuster --tested-rc <path_to_the_admin_rc_file> --tested-passwd <admin_password>
|
||||||
|
|
||||||
.. note::
|
If you installed KloudBuster using git clone you need to explicitly call the python interpreter
|
||||||
|
since the "kloudbuster" wrapper is only installed with pip install)::
|
||||||
|
|
||||||
Simply adding *--storage* to the above command will run KloudBuster with
|
python kloudbuster.py --tested-rc <path_to_the_admin_rc_file> --tested-passwd <admin_password>
|
||||||
storage testing.
|
|
||||||
|
|
||||||
The run should take couple of minutes (depending on how fast the cloud can
|
|
||||||
|
If you want to run the default storage scale test, simply adding *--storage*::
|
||||||
|
|
||||||
|
kloudbuster --storage --tested-rc <path_to_the_admin_rc_file> --tested-passwd <admin_password>
|
||||||
|
|
||||||
|
The default storage scale test will use the following settings:
|
||||||
|
* Create 1 tenant
|
||||||
|
* Create 1 router
|
||||||
|
* Create 1 private network
|
||||||
|
* Create 1 VM and attach a 10 GB Cinder volume to it
|
||||||
|
* Perform the default storage workload sequence
|
||||||
|
* random access 4KB block size, IO depth 4, 100 IOPs for 30 seconds each
|
||||||
|
* 100% read
|
||||||
|
* 100% write
|
||||||
|
* 70% read, 30% write
|
||||||
|
* sequential access 64KB block size, IO depth 64, 60 MB/sec for 30 seconds
|
||||||
|
* 100% read
|
||||||
|
* 100% write
|
||||||
|
* 70% read, 30% write
|
||||||
|
* Measure/aggregate IOPs, throughput and latency
|
||||||
|
* Bring down and cleanup
|
||||||
|
|
||||||
|
The run should take a few minutes (depending on how fast the cloud can
|
||||||
create the resources) and you should see the actions taken by KloudBuster
|
create the resources) and you should see the actions taken by KloudBuster
|
||||||
displayed on the console. Once this minimal scale test passes, you can tackle
|
displayed on the console. Once this minimal scale test passes, you can tackle
|
||||||
more elaborate scale testing by increasing the scale numbers or providing
|
more elaborate scale testing by increasing the scale numbers or providing
|
||||||
@ -169,12 +193,16 @@ KloudBuster Configuration
|
|||||||
To create a custom scale test configuration, make a copy of the default
|
To create a custom scale test configuration, make a copy of the default
|
||||||
configuration and modify that file to satisfy our own needs. A copy of the
|
configuration and modify that file to satisfy our own needs. A copy of the
|
||||||
default configuration can be obtained by redirecting the output of
|
default configuration can be obtained by redirecting the output of
|
||||||
*--show-config* to a new file. Once done, provide that custom configuration
|
*--show-config* to a new file. For example:
|
||||||
|
|
||||||
|
kloudbuster --show-config >scale1.cfg
|
||||||
|
|
||||||
|
Once done, provide that custom configuration
|
||||||
file to the KloudBuster command line using the *--config <file>* option.
|
file to the KloudBuster command line using the *--config <file>* option.
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
Note that the default configuration is always loaded by KloudBuster and
|
The default configuration is always loaded by KloudBuster and
|
||||||
any default option can be overridden by providing a custom configuration
|
any default option can be overridden by providing a custom configuration
|
||||||
file that only contains modified options. So you can delete all the lines
|
file that only contains modified options. So you can delete all the lines
|
||||||
in the configuration file that you do not intend to change
|
in the configuration file that you do not intend to change
|
||||||
@ -185,7 +213,7 @@ General Options
|
|||||||
|
|
||||||
Each item in cfg.scale.yaml is well documented and self-explained. Below is
|
Each item in cfg.scale.yaml is well documented and self-explained. Below is
|
||||||
just a quick-start on some important config items that need to be paid more
|
just a quick-start on some important config items that need to be paid more
|
||||||
attention.
|
attention to.
|
||||||
|
|
||||||
* **vm_creation_concurrency**
|
* **vm_creation_concurrency**
|
||||||
|
|
||||||
@ -258,7 +286,7 @@ In the case of Storage testing:
|
|||||||
capacity of storage is reached, the overall performance will start to
|
capacity of storage is reached, the overall performance will start to
|
||||||
degrade.
|
degrade.
|
||||||
|
|
||||||
e.g. In the randread and randwrite mode, for example the IOPS is limited to
|
e.g. In the random read and random write mode, for example the IOPS is limited to
|
||||||
100 IOPS/VM. In the iteration of 10 VMs, the requested IOPS for the system
|
100 IOPS/VM. In the iteration of 10 VMs, the requested IOPS for the system
|
||||||
is 100 * 10 = 1000. However, the measured IOPS is degraded to only 800 IOPS.
|
is 100 * 10 = 1000. However, the measured IOPS is degraded to only 800 IOPS.
|
||||||
So the degraded percentile is calculated as 800/1000=20% for this set of
|
So the degraded percentile is calculated as 800/1000=20% for this set of
|
||||||
@ -395,14 +423,14 @@ command line.
|
|||||||
Displaying the Results
|
Displaying the Results
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
Results can be saved in a file in json format or in html format. The json format
|
Results can be saved in a file in json format or in HTML format. The json format
|
||||||
is more appropriate for usage by any post-processing tool or script while the
|
is more appropriate for usage by any post-processing tool or script while the
|
||||||
html file is more adapted for human usage.
|
HTML file is more adapted for human usage.
|
||||||
|
|
||||||
The KloudBuster Web UI will display the results using charts and tables when the
|
The KloudBuster Web UI will display the results using charts and tables when the
|
||||||
test is finished running. The KloudBuster CLI provides an option to generate
|
test is finished running. The KloudBuster CLI provides an option to generate
|
||||||
the html file from the results (*--html* option). It can also generate the html
|
the HTML file from the results (*--html* option). It can also generate the HTML
|
||||||
file from the json results (*--charts-from-json* option).
|
file from the JSON results (*--charts-from-json* option).
|
||||||
|
|
||||||
|
|
||||||
Examples of running KloudBuster
|
Examples of running KloudBuster
|
||||||
|
@ -43,9 +43,9 @@ vm_creation_concurrency: 5
|
|||||||
# example to debug)
|
# example to debug)
|
||||||
public_key_file:
|
public_key_file:
|
||||||
|
|
||||||
# ==========================
|
# ==================================================
|
||||||
# SERVER SIDE CONFIG OPTIONS
|
# SERVER SIDE CONFIG OPTIONS (HTTP SERVER SIDE ONLY)
|
||||||
# ==========================
|
# ==================================================
|
||||||
server:
|
server:
|
||||||
# Flavor to use for the test images
|
# Flavor to use for the test images
|
||||||
flavor:
|
flavor:
|
||||||
@ -93,9 +93,9 @@ server:
|
|||||||
html_size: 32768
|
html_size: 32768
|
||||||
|
|
||||||
|
|
||||||
# ==========================
|
# ====================================================
|
||||||
# CLIENT SIDE CONFIG OPTIONS
|
# CLIENT SIDE CONFIG OPTIONS (HTTP CLIENT AND STORAGE)
|
||||||
# ==========================
|
# ====================================================
|
||||||
client:
|
client:
|
||||||
# Flavor to use for the test images
|
# Flavor to use for the test images
|
||||||
flavor:
|
flavor:
|
||||||
@ -136,6 +136,8 @@ client:
|
|||||||
# {'vm_start': 0, 'vm_multiple': 1}: 1, 2, 3, 4, 5...
|
# {'vm_start': 0, 'vm_multiple': 1}: 1, 2, 3, 4, 5...
|
||||||
# {'vm_start': 0, 'vm_multiple': 5}: 5, 10, 15, 20...
|
# {'vm_start': 0, 'vm_multiple': 5}: 5, 10, 15, 20...
|
||||||
vm_multiple: 2
|
vm_multiple: 2
|
||||||
|
|
||||||
|
# HTTP ONLY
|
||||||
# The stop condition for HTTP benchmarking, it is used for KloudBuster to
|
# The stop condition for HTTP benchmarking, it is used for KloudBuster to
|
||||||
# determine when to stop the progression, and do the cleanup if needed.
|
# determine when to stop the progression, and do the cleanup if needed.
|
||||||
# It defines as:
|
# It defines as:
|
||||||
@ -154,6 +156,8 @@ client:
|
|||||||
# [50, 75, 90, 99, 99.9, 99.99, 99.999]
|
# [50, 75, 90, 99, 99.9, 99.99, 99.999]
|
||||||
# (3) Sets percentile to 0 to disable HTTP request timeout checks;
|
# (3) Sets percentile to 0 to disable HTTP request timeout checks;
|
||||||
http_stop_limit: [50, 0]
|
http_stop_limit: [50, 0]
|
||||||
|
|
||||||
|
# STORAGE ONLY
|
||||||
# The stop condition for storage benchmarking, it is used for KloudBuster
|
# The stop condition for storage benchmarking, it is used for KloudBuster
|
||||||
# to determine when to stop the progression, and do the cleanup if needed.
|
# to determine when to stop the progression, and do the cleanup if needed.
|
||||||
# In the mode of random read and random write, this value indicates the
|
# In the mode of random read and random write, this value indicates the
|
||||||
|
Loading…
Reference in New Issue
Block a user