├── .gitignore ├── DESCRIPTION.rst ├── LICENSE.txt ├── PKGBUILD ├── README.md ├── Workloads ├── Device │ ├── NVMe_04k_MIX7030_QD4_32J.ini │ ├── NVMe_04k_RR_QD1_1J.ini │ ├── NVMe_04k_RR_QD4_32J.ini │ ├── NVMe_04k_RW_QD1_1J.ini │ ├── NVMe_04k_RW_QD4_32J.ini │ ├── NVMe_08k_MIX7030_QD4_32J.ini │ ├── NVMe_08k_RR_QD4_32J.ini │ ├── NVMe_08k_RW_QD4_32J.ini │ ├── NVMe_64k_SR_QD128_01J.ini │ ├── NVMe_64k_SW_QD128_01J.ini │ ├── SATA_04k_MIX7030_QD32.ini │ ├── SATA_04k_MIX7030_QD4.ini │ ├── SATA_04k_MIX7030_QD8.ini │ ├── SATA_04k_RR_QD1.ini │ ├── SATA_04k_RR_QD32.ini │ ├── SATA_04k_RR_QD8.ini │ ├── SATA_04k_RW_QD1.ini │ ├── SATA_04k_RW_QD32.ini │ ├── SATA_04k_RW_QD8.ini │ ├── SATA_08k_MIX7030_QD32.ini │ ├── SATA_08k_MIX7030_QD4.ini │ ├── SATA_08k_MIX7030_QD8.ini │ ├── SATA_08k_RR_QD32.ini │ ├── SATA_08k_RW_QD32.ini │ ├── SATA_128k_SR_QD32.ini │ ├── SATA_128k_SW_QD32.ini │ ├── SATA_512B_RR_QD1.ini │ ├── SATA_512B_RR_QD32.ini │ ├── SATA_512B_RR_QD8.ini │ ├── SATA_512B_RW_QD1.ini │ ├── SATA_512B_RW_QD32.ini │ ├── SATA_512B_RW_QD8.ini │ ├── SATA_64k_SR_QD32.ini │ └── SATA_64k_SW_QD32.ini ├── FirstOptaneTest ├── MultiDevice │ ├── 2drives_NVMe_04k_RR_QD4_32J.ini │ ├── 2drives_NVMe_04k_RW_QD4_32J.ini │ ├── 2drives_NVMe_64k_SR_QD128_01J.ini │ └── 2drives_NVMe_64k_SW_QD128_01J.ini ├── Precondition │ ├── SSD precondition.txt │ ├── ddnull.sh │ ├── fill_1MSEQ.ini │ ├── fill_4KRandom_NVMe.ini │ ├── fill_4KRandom_SATA.ini │ └── iocheck.sh ├── Simulation │ ├── 8kwarm.ini │ ├── oracle.ini │ ├── oracle1.ini │ └── todo.ini └── WritePressureTest │ ├── nvme0n1_WPT_100MBs.fio │ ├── nvme0n1_WPT_10MBs.fio │ ├── nvme0n1_WPT_110MBs.fio │ ├── nvme0n1_WPT_120MBs.fio │ ├── nvme0n1_WPT_130MBs.fio │ ├── nvme0n1_WPT_140MBs.fio │ ├── nvme0n1_WPT_150MBs.fio │ ├── nvme0n1_WPT_160MBs.fio │ ├── nvme0n1_WPT_170MBs.fio │ ├── nvme0n1_WPT_180MBs.fio │ ├── nvme0n1_WPT_190MBs.fio │ ├── nvme0n1_WPT_200MBs.fio │ ├── nvme0n1_WPT_20MBs.fio │ ├── nvme0n1_WPT_210MBs.fio │ ├── nvme0n1_WPT_220MBs.fio │ ├── nvme0n1_WPT_230MBs.fio │ ├── nvme0n1_WPT_240MBs.fio │ ├── nvme0n1_WPT_250MBs.fio │ ├── nvme0n1_WPT_260MBs.fio │ ├── nvme0n1_WPT_270MBs.fio │ ├── nvme0n1_WPT_280MBs.fio │ ├── nvme0n1_WPT_290MBs.fio │ ├── nvme0n1_WPT_300MBs.fio │ ├── nvme0n1_WPT_30MBs.fio │ ├── nvme0n1_WPT_310MBs.fio │ ├── nvme0n1_WPT_320MBs.fio │ ├── nvme0n1_WPT_330MBs.fio │ ├── nvme0n1_WPT_340MBs.fio │ ├── nvme0n1_WPT_350MBs.fio │ ├── nvme0n1_WPT_360MBs.fio │ ├── nvme0n1_WPT_370MBs.fio │ ├── nvme0n1_WPT_380MBs.fio │ ├── nvme0n1_WPT_390MBs.fio │ ├── nvme0n1_WPT_400MBs.fio │ ├── nvme0n1_WPT_40MBs.fio │ ├── nvme0n1_WPT_410MBs.fio │ ├── nvme0n1_WPT_420MBs.fio │ ├── nvme0n1_WPT_430MBs.fio │ ├── nvme0n1_WPT_440MBs.fio │ ├── nvme0n1_WPT_450MBs.fio │ ├── nvme0n1_WPT_460MBs.fio │ ├── nvme0n1_WPT_470MBs.fio │ ├── nvme0n1_WPT_480MBs.fio │ ├── nvme0n1_WPT_490MBs.fio │ ├── nvme0n1_WPT_500MBs.fio │ ├── nvme0n1_WPT_50MBs.fio │ ├── nvme0n1_WPT_510MBs.fio │ ├── nvme0n1_WPT_520MBs.fio │ ├── nvme0n1_WPT_530MBs.fio │ ├── nvme0n1_WPT_540MBs.fio │ ├── nvme0n1_WPT_550MBs.fio │ ├── nvme0n1_WPT_560MBs.fio │ ├── nvme0n1_WPT_570MBs.fio │ ├── nvme0n1_WPT_580MBs.fio │ ├── nvme0n1_WPT_590MBs.fio │ ├── nvme0n1_WPT_600MBs.fio │ ├── nvme0n1_WPT_60MBs.fio │ ├── nvme0n1_WPT_70MBs.fio │ ├── nvme0n1_WPT_80MBs.fio │ └── nvme0n1_WPT_90MBs.fio ├── __init__.py ├── __pycache__ └── realtime_back.cpython-36.pyc ├── fio_visualizer.py ├── mainwindow.ui ├── realtime_back.py ├── setup.cfg └── setup.py /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/intel/fiovisualizer/e5f45ecc3c960abb2d319a0cd67e012efd4d0e94/.gitignore -------------------------------------------------------------------------------- /DESCRIPTION.rst: -------------------------------------------------------------------------------- 1 | FioVisualizer 2 | ============= 3 | 4 | This is the description for FioVisualizer. 5 | 6 | FioVisualizer is a data visualization tool for FIO written in PyQtGraph. 7 | 8 | It requires to be run on behalf of the root user, since it requires to access 9 | block devices. 10 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014-2015, Intel Corporation. 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are 6 | met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above 12 | copyright notice, this list of conditions and the following 13 | disclaimer in the documentation and/or other materials provided 14 | with the distribution. 15 | 16 | * Neither the name of the NumPy Developers nor the names of any 17 | contributors may be used to endorse or promote products derived 18 | from this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 | -------------------------------------------------------------------------------- /PKGBUILD: -------------------------------------------------------------------------------- 1 | # Maintainer: Ralf Zerres 2 | 3 | pkgname=python-fiovisualizer 4 | _pkgname=fiovisualizer 5 | pkgver=0.r6.g1192828 6 | pkgrel=1 7 | pkgdesc="Data visualisation tool for FIO" 8 | arch=('i686' 'x86_64') 9 | license='Intel' 10 | url="https://01.org/fio-visualizer" 11 | #depends=('python' 'fio=2.1.4' 'python-pyqtgraph') 12 | depends=('python' 'cython' 'fio' 'python-pyqtgraph' 'python-pyqt4') 13 | source=("$_pkgname::git+http://github.com/01org/fiovisualizer.git#branch=master") 14 | #md5sums=('6e2efa185b6b9227dfe16fefd921a8ec') 15 | md5sums=('SKIP') 16 | 17 | pkgver() { 18 | cd "${srcdir}/${_pkgname}" 19 | if GITTAG="$(git describe --abbrev=0 --tags 2>/dev/null)"; then 20 | echo "$(sed -e "s/^${_pkgname%%-git}//" -e 's/^[-_/a-zA-Z]\+//' -e 's/[-_+]/./g' <<< ${GITTAG}).r$(git rev-list --count ${GITTAG}..).g$(git log -1 --format="%h")" 21 | else 22 | echo "0.r$(git rev-list --count master).g$(git log -1 --format="%h")" 23 | fi 24 | } 25 | 26 | build() { 27 | echo "Building in (`pwd`)" 28 | cp ../setup.py "$srcdir/" 29 | cp ../DESCRIPTION.rst "$srcdir/" 30 | cp ../__init__.py "$srcdir/$_pkgname/" 31 | cp ../fio_visualizer.py "$srcdir/$_pkgname/" 32 | } 33 | 34 | package() { 35 | echo "Packaging in (`pwd`)" 36 | cd "$srcdir" 37 | python setup.py install --prefix=/usr --root="$pkgdir" --optimize 1 38 | } 39 | 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DISCONTINUATION OF PROJECT # 2 | This project will no longer be maintained by Intel. 3 | Intel has ceased development and contributions including, but not limited to, maintenance, bug fixes, new releases, or updates, to this project. 4 | Intel no longer accepts patches to this project. 5 | If you have an ongoing need to use this project, are interested in independently developing it, or would like to maintain patches for the open source software community, please create your own fork of this project. 6 | 7 | # fiovisualizer 8 | 9 | This tool is a realtime data visualisation tool for [FIO](http://freecode.com/projects/fio) written using [PyQtGraph](http://www.pyqtgraph.org). 10 | 11 | ## Overview 12 | 13 | This application is written in Python, using PyQtGraph to graph FIO data in realtime. Running as root is required because this application accesses block devices. 14 | 15 | ## Package Content 16 | - README.md 17 | - This readme file 18 | - LICENSE.txt 19 | - License file 20 | - fio_visualizer.py 21 | - The frontend for this application 22 | - realtime_back.py 23 | - The backend for this application 24 | - mainwindow.ui 25 | - GUI definition part of the script 26 | - Workloads: 27 | - Device 28 | - Block device workloads covering typical specifications, separated in SATA and NVMe sections 29 | - Precondition 30 | - instruction and script files to prepare SSD for the testing. 31 | - Simulation 32 | - Workloads to simulate real applications. 33 | - MultiDevice 34 | - Workloads to test two or more drives at a time. Currently has limitted support due to improper handling of total performance in the script. 35 | 36 | # Setup 37 | 38 | ## Installation 39 | Requires: 40 | 41 | - FIO 2.15 or newer (2.1.x is no longer supported) found [here](https://github.com/axboe/fio/releases) 42 | - PyQtGraph found [here](http://www.pyqtgraph.org/) 43 | - Python 2.7 or 3+ [here](https://www.python.org/downloads/) 44 | - PyQt 4.8+ or PySide 45 | - numpy 46 | - scipy 47 | 48 | #### CentOS 7 steps 49 | 50 | 0. You should have python and PyQt installed with this distro 51 | 52 | 1. Install pyqtgraph-develop (0.9.9 required) from [here](http://www.pyqtgraph.org) 53 | - `$ python setup.py install` 54 | 55 | 2. Install Cyphon from [here](http://cython.org) Version 0.21 or higher is required. 56 | - `$ python setup.py install` 57 | 58 | 3. Install Numpy from [here](http://numpy.org) 59 | - `$ python setup.py build` 60 | - `$ python setup.py install` 61 | 62 | 4. Install FIO from [here](http://freecode.com/projects/fio) 63 | - `# ./configure` 64 | - `# make` 65 | - `# make install` 66 | 67 | 5. Run Visualizer as root. 68 | - `# ./fio_visualizer.py` 69 | 70 | 71 | #### Ubuntu steps 72 | 73 | 1. Add the following repository `deb http://luke.campagnola.me/debian dev/` into your `/etc/apt/sources.list` and then run `$ sudo apt-get install fio python-pyqtgraph` 74 | 75 | 2. Install FIO from [here](http://freecode.com/projects/fio) 76 | - `# ./configure` 77 | - `# make` 78 | - `# make install` 79 | 80 | 3. Run Visualizer as root. 81 | - `# ./fio_visualizer.py` 82 | 83 | # Development notes 84 | 85 | ## Limitations 86 | 1. Increased CPU load with numjobs > 4 and all threads plotting. Avoid plotting all threads with numjobs > 4 or disable unneccessary ones to save CPU resources. 87 | 2. Multi-jobs configurations files (i.e. [job1]... [job2]) are not supported at the moment. The total amount of jobs if every workload has "numjobs" specified too are not correctly parsed. This can still be implemented manually specifing it in the code. 88 | 89 | ## Todo 90 | Continue working on workload profiles for new Intel SSDs. 91 | 92 | ## Maintainers 93 | - Andrey Kudryavtsev andrey.o.kudryavtsev@intel.com 94 | - Alexey Ponomarev alexey.ponomarev@intel.com 95 | 96 | ## Realtime backend processor 97 | 98 | fiovisualizer implements its realtime backend processor on the file 99 | realtime_back.py. This section documents the backend processor. 100 | 101 | ### Starting fio 102 | 103 | The routine start_fio() kicks off the fio process, and it 104 | kicks of a process which more or less looks something like the following: 105 | 106 | ``` bash 107 | fio --minimal --eta=never --status-interval=1 path-to-fio.ini 108 | ``` 109 | ### Realtime resolution 110 | 111 | Since `--status-interval=1` is currently used statically, it means a resolution 112 | of 1 second is used between updates. 113 | 114 | ### Meaning of data being processed 115 | 116 | Since `--status-interval` is used the values being processed currently do not 117 | provide per period measurements. The values being processed reflect the 118 | overall cumulative (from job start) values at the specified time intervals. 119 | 120 | #### fiovisualizer support for output format 121 | 122 | fio supports different output formats. The smallest and most compact output 123 | format currently is the terse output, and so fiovisualizer uses this to minimize 124 | the amount of processing done on the output and also to minimize the amount of 125 | data being transfered from a remote fio server. 126 | 127 | ##### fiovisualizer terse output format support 128 | 129 | fio supports different terse format versions, the format version can be 130 | specified via the argument `--terse-version`. If no version is specified the 131 | version used will depend on the fio release. 132 | 133 | ##### fio terse parsing version notes 134 | 135 | When `--minimal` is used it is equivalent to using `--output-format=terse`. 136 | 137 | The `--output-format` parameter was added via fio commit f3afa57e3 ("Add 138 | --output-format command line option") merged since fio-2.0.10. 139 | 140 | fiovisualizer started supporting fio since fio-2.1.14. The release of 141 | fio-2.1.14 uses by default the terse output format version 3. fiovisualizer's 142 | parser only currently supports terse output format version 3. 143 | 144 | The `--terse-version` parameter was added to fio via commit f57a9c59e36 145 | ("Add terse version output format command line parameter"), this commit was 146 | merged on the fio-1.58 release. This fio-1.58 release however used the terse 147 | version format 2. Development for the terse version format 3 started 148 | since fio commit 312b4af22018a ("Add IOPS to terse output") supported since 149 | fio-1.99.6. 150 | 151 | The current default terse output format on the latest fio release is terse 152 | version format 3. 153 | 154 | ##### fio terse output format version 3 155 | 156 | Below is a short description of each or the column outputs for fio terse 157 | output version format 3. 158 | 159 | | 0 | terse_version_3 | 160 | | 1 | fio_version | 161 | | 2 | jobname | 162 | | 3 | groupid | 163 | | 4 | error | 164 | | 5 | read_kb | 165 | | 6 | read_bandwidth | 166 | | 7 | read_iops | 167 | | 8 | read_runtime_ms | 168 | | 9 | read_slat_min | 169 | | 10 | read_slat_max | 170 | | 11 | read_slat_mean | 171 | | 12 | read_slat_dev | 172 | | 13 | read_clat_min | 173 | | 14 | read_clat_max | 174 | | 15 | read_clat_mean | 175 | | 16 | read_clat_dev | 176 | | 17 | read_clat_pct01 | 177 | | 18 | read_clat_pct02 | 178 | | 19 | read_clat_pct03 | 179 | | 20 | read_clat_pct04 | 180 | | 21 | read_clat_pct05 | 181 | | 22 | read_clat_pct06 | 182 | | 23 | read_clat_pct07 | 183 | | 24 | read_clat_pct08 | 184 | | 25 | read_clat_pct09 | 185 | | 26 | read_clat_pct10 | 186 | | 27 | read_clat_pct11 | 187 | | 28 | read_clat_pct12 | 188 | | 29 | read_clat_pct13 | 189 | | 30 | read_clat_pct14 | 190 | | 31 | read_clat_pct15 | 191 | | 32 | read_clat_pct16 | 192 | | 33 | read_clat_pct17 | 193 | | 34 | read_clat_pct18 | 194 | | 35 | read_clat_pct19 | 195 | | 36 | read_clat_pct20 | 196 | | 37 | read_tlat_min | 197 | | 38 | read_lat_max | 198 | | 39 | read_lat_mean | 199 | | 40 | read_lat_dev | 200 | | 41 | read_bw_min | 201 | | 42 | read_bw_max | 202 | | 43 | read_bw_agg_pct | 203 | | 44 | read_bw_mean | 204 | | 45 | read_bw_dev | 205 | | 46 | write_kb | 206 | | 47 | write_bandwidth | 207 | | 48 | write_iops | 208 | | 49 | write_runtime_ms | 209 | | 50 | write_slat_min | 210 | | 51 | write_slat_max | 211 | | 52 | write_slat_mean | 212 | | 53 | write_slat_dev | 213 | | 54 | write_clat_min | 214 | | 55 | write_clat_max | 215 | | 56 | write_clat_mean | 216 | | 57 | write_clat_dev | 217 | | 58 | write_clat_pct01 | 218 | | 59 | write_clat_pct02 | 219 | | 60 | write_clat_pct03 | 220 | | 61 | write_clat_pct04 | 221 | | 62 | write_clat_pct05 | 222 | | 63 | write_clat_pct06 | 223 | | 64 | write_clat_pct07 | 224 | | 65 | write_clat_pct08 | 225 | | 66 | write_clat_pct09 | 226 | | 67 | write_clat_pct10 | 227 | | 68 | write_clat_pct11 | 228 | | 69 | write_clat_pct12 | 229 | | 70 | write_clat_pct13 | 230 | | 71 | write_clat_pct14 | 231 | | 72 | write_clat_pct15 | 232 | | 73 | write_clat_pct16 | 233 | | 74 | write_clat_pct17 | 234 | | 75 | write_clat_pct18 | 235 | | 76 | write_clat_pct19 | 236 | | 77 | write_clat_pct20 | 237 | | 78 | write_tlat_min | 238 | | 79 | write_lat_max | 239 | | 80 | write_lat_mean | 240 | | 81 | write_lat_dev | 241 | | 82 | write_bw_min | 242 | | 83 | write_bw_max | 243 | | 84 | write_bw_agg_pct | 244 | | 85 | write_bw_mean | 245 | | 86 | write_bw_dev | 246 | | 87 | cpu_user | 247 | | 88 | cpu_sys | 248 | | 89 | cpu_csw | 249 | | 90 | cpu_mjf | 250 | | 91 | cpu_minf | 251 | | 92 | iodepth_1 | 252 | | 93 | iodepth_2 | 253 | | 94 | iodepth_4 | 254 | | 95 | iodepth_8 | 255 | | 96 | iodepth_16 | 256 | | 97 | iodepth_32 | 257 | | 98 | iodepth_64 | 258 | | 99 | lat_2us | 259 | | 100 | lat_4us | 260 | | 101 | lat_10us | 261 | | 102 | lat_20us | 262 | | 103 | lat_50us | 263 | | 104 | lat_100us | 264 | | 105 | lat_250us | 265 | | 106 | lat_500us | 266 | | 107 | lat_750us | 267 | | 108 | lat_1000us | 268 | | 109 | lat_2ms | 269 | | 110 | lat_4ms | 270 | | 111 | lat_10ms | 271 | | 112 | lat_20ms | 272 | | 113 | lat_50ms | 273 | | 114 | lat_100ms | 274 | | 115 | lat_250ms | 275 | | 116 | lat_500ms | 276 | | 117 | lat_750ms | 277 | | 118 | lat_1000ms | 278 | | 119 | lat_2000ms | 279 | | 120 | lat_over_2000ms | 280 | | 121 | disk_name | 281 | | 122 | disk_read_iops | 282 | | 123 | disk_write_iops | 283 | | 124 | disk_read_merges | 284 | | 125 | disk_write_merges | 285 | | 126 | disk_read_ticks | 286 | | 127 | write_ticks | 287 | | 128 | disk_queue_time | 288 | | 129 | disk_util | 289 | 290 | ### Processing 291 | 292 | Below is an example output of one line out using: 293 | 294 | ``` bash 295 | fio --client=some-hostname --eta=never --status-interval=1 --terse-version=3 some.ini 296 | ``` 297 | The output: 298 | 299 | ``` 300 | 3;fio-3.8-41-g7302;job1;0;0;0;0;0;0;0;0;0.000000;0.000000;0;0;0.000000;0.000000;1.000000%=0;5.000000%=0;10.000000%=0;20.000000%=0;30.000000%=0;40.000000%=0;50.000000%=0;60.000000%=0;70.000000%=0;80.000000%=0;90.000000%=0;95.000000%=0;99.000000%=0;99.500000%=0;99.900000%=0;99.950000%=0;99.990000%=0;0%=0;0%=0;0%=0;0;0;0.000000;0.000000;0;0;0.000000%;0.000000;0.000000;1886832;188645;23580;10002;1;87;2.561636;0.999742;6;6575;165.280554;282.700285;1.000000%=11;5.000000%=13;10.000000%=15;20.000000%=19;30.000000%=25;40.000000%=35;50.000000%=51;60.000000%=89;70.000000%=148;80.000000%=240;90.000000%=452;95.000000%=675;99.000000%=1286;99.500000%=1679;99.900000%=2736;99.950000%=3293;99.990000%=5013;0%=0;0%=0;0%=0;12;6577;167.875769;282.729144;138363;314224;25.026987%;188630.900000;35637.687291;5.179482%;9.399060%;151970;0;51;0.1%;0.1%;100.0%;0.0%;0.0%;0.0%;0.0%;0.00%;0.00%;0.01%;21.49%;27.82%;12.61%;18.75%;10.68%;4.67%;2.00%;1.66%;0.28%;0.03%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;0.00%;nvme0n1;44;934217;0;0;9;152472;152997;99.24% 301 | ``` 302 | 303 | From the above fiovisualizer's realtime_back.py records the following 6 columns 304 | and graphs them, below listed from the respective value from the output above: 305 | 306 | | 6 | read_bandwidth | 0 | 307 | | 7 | read_iops | 0 | 308 | | 15 | read_clat_mean | 0.000000 | 309 | | 47 | write_bandwidth | | 188645 | 310 | | 48 | write_iops | 23580 | 311 | | 56 | write_clat_mean | 165.280554 | 312 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_04k_MIX7030_QD4_32J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random MIX 70/30 with 4 ios in the queue in 32 queues 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=4 10 | numjobs=32 11 | buffered=0 12 | size=100% 13 | runtime=64000 14 | time_based 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_04k_RR_QD1_1J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random read 3 | filename=/dev/nvme0n1 4 | ioengine=sync 5 | direct=1 6 | bs=4k 7 | rw=randread 8 | iodepth=1 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=640000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | cpus_allowed=0 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_04k_RR_QD4_32J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random read 4 ios in the queue in 32 queues 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randread 8 | iodepth=4 9 | numjobs=32 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_04k_RW_QD1_1J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random read 3 | filename=/dev/nvme0n1 4 | ioengine=sync 5 | direct=1 6 | bs=4k 7 | rw=randwrite 8 | iodepth=1 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=640000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | cpus_allowed=0 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_04k_RW_QD4_32J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random write 4 ios in the queue in 32 queues 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randwrite 8 | iodepth=4 9 | numjobs=32 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_08k_MIX7030_QD4_32J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8k random MIX 70/30 with 4 ios in the queue in 32 queues 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=4 10 | numjobs=32 11 | buffered=0 12 | size=100% 13 | runtime=64000 14 | time_based 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_08k_RR_QD4_32J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8k random read 4 ios in the queue in 32 queues 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randread 8 | iodepth=4 9 | numjobs=32 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_08k_RW_QD4_32J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8k random write 4 ios in the queue in 32 queues 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randwrite 8 | iodepth=4 9 | numjobs=32 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_64k_SR_QD128_01J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=64k sequential read 128 ios in the queue in 1 queue 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=64k 7 | rw=read 8 | iodepth=128 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/NVMe_64k_SW_QD128_01J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=64k sequential read 128 ios in the queue in 1 queue 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=64k 7 | rw=write 8 | iodepth=128 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_MIX7030_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random MIX 70/30 with 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=32 10 | numjobs=1 11 | buffered=0 12 | size=100% 13 | runtime=64000 14 | time_based 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_MIX7030_QD4.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random MIX 70/30 with 4 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=4 10 | numjobs=1 11 | buffered=0 12 | size=100% 13 | runtime=64000 14 | time_based 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_MIX7030_QD8.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random MIX 70/30 with 8 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=8 10 | numjobs=1 11 | buffered=0 12 | size=100% 13 | runtime=64000 14 | time_based 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_RR_QD1.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random read 1 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randread 8 | iodepth=1 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_RR_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random read 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randread 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_RR_QD8.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random read 8 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randread 8 | iodepth=8 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_RW_QD1.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random write 1 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randwrite 8 | iodepth=1 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_RW_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random write 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randwrite 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_04k_RW_QD8.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random write 8 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randwrite 8 | iodepth=8 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_08k_MIX7030_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8k random MIX 70/30 with 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=32 10 | numjobs=1 11 | buffered=0 12 | size=100% 13 | runtime=64000 14 | time_based 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_08k_MIX7030_QD4.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8k random MIX 70/30 with 4 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=4 10 | numjobs=1 11 | buffered=0 12 | size=100% 13 | runtime=64000 14 | time_based 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_08k_MIX7030_QD8.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8k random MIX 70/30 with 8 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=8 10 | numjobs=1 11 | buffered=0 12 | size=100% 13 | runtime=64000 14 | time_based 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_08k_RR_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8k random read 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randread 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_08k_RW_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8k random write 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randwrite 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_128k_SR_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=128k sequential read 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=128k 7 | rw=read 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_128k_SW_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=128k sequential read 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=128k 7 | rw=write 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_512B_RR_QD1.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=512B random read 1 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=512 7 | rw=randread 8 | iodepth=1 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_512B_RR_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=512B random read 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=512 7 | rw=randread 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_512B_RR_QD8.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=512B random read 8 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=512 7 | rw=randread 8 | iodepth=8 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_512B_RW_QD1.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=512B random write 1 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=512 7 | rw=randwrite 8 | iodepth=1 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_512B_RW_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=512B random write 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=512 7 | rw=randwrite 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] -------------------------------------------------------------------------------- /Workloads/Device/SATA_512B_RW_QD8.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=512B random write 8 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=512 7 | rw=randwrite 8 | iodepth=8 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_64k_SR_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=64k sequential read 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=64k 7 | rw=read 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Device/SATA_64k_SW_QD32.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=64k sequential read 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=64k 7 | rw=write 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | runtime=64000 13 | time_based 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/FirstOptaneTest: -------------------------------------------------------------------------------- 1 | [global] 2 | name= FirstOptaneTest 3 | ioengine=pvsync2 4 | hipri 5 | direct=1 6 | buffered=0 7 | size=100% 8 | randrepeat=0 9 | time_based 10 | ramp_time=0 11 | norandommap 12 | refill_buffers 13 | log_avg_msec=1000 14 | log_max_value=1 15 | group_reporting 16 | percentile_list=1.0:25.0:50.0:75.0:90.0:99.0:99.9:99.99:99.999:99.9999:99.99999:99.999999:100.0 17 | filename=/dev/nvme0n1 18 | 19 | [rd_rnd_qd_1_4k_1w] 20 | bs=4k 21 | iodepth=1 22 | numjobs=1 23 | rw=randread 24 | #cpus_allowed=0-17 - dependent on NUMA configuration 25 | runtime=300 26 | write_bw_log=bw_rd_rnd_qd_1_4k_1w 27 | write_iops_log=iops_rd_rnd_qd_1_4k_1w 28 | write_lat_log=lat_rd_rnd_qd_1_4k_1w 29 | -------------------------------------------------------------------------------- /Workloads/MultiDevice/2drives_NVMe_04k_RR_QD4_32J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random read 4 ios in the queue in 32 queues 3 | ioengine=libaio 4 | direct=1 5 | rw=randread 6 | iodepth=4 7 | numjobs=32 8 | buffered=0 9 | size=100% 10 | runtime=64000 11 | time_based 12 | randrepeat=0 13 | norandommap 14 | refill_buffers 15 | 16 | [job1] 17 | filename=/dev/nvme0n1 18 | bs=4k 19 | 20 | [job1] 21 | filename=/dev/nvme1n1 22 | bs=4k 23 | 24 | -------------------------------------------------------------------------------- /Workloads/MultiDevice/2drives_NVMe_04k_RW_QD4_32J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random write 4 ios in the queue in 32 queues 3 | ioengine=libaio 4 | direct=1 5 | rw=randwrite 6 | iodepth=4 7 | numjobs=32 8 | buffered=0 9 | size=100% 10 | runtime=64000 11 | time_based 12 | randrepeat=0 13 | norandommap 14 | refill_buffers 15 | 16 | [job1] 17 | filename=/dev/nvme0n1 18 | bs=4k 19 | 20 | [job1] 21 | filename=/dev/nvme1n1 22 | bs=4k 23 | -------------------------------------------------------------------------------- /Workloads/MultiDevice/2drives_NVMe_64k_SR_QD128_01J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=64k sequential read 128 ios in the queue in 1 queue 3 | ioengine=libaio 4 | direct=1 5 | rw=read 6 | iodepth=128 7 | numjobs=1 8 | buffered=0 9 | size=100% 10 | runtime=64000 11 | time_based 12 | randrepeat=0 13 | norandommap 14 | refill_buffers 15 | 16 | [job1] 17 | filename=/dev/nvme0n1 18 | bs=64k 19 | 20 | [job1] 21 | filename=/dev/nvme1n1 22 | bs=64k 23 | -------------------------------------------------------------------------------- /Workloads/MultiDevice/2drives_NVMe_64k_SW_QD128_01J.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=64k sequential read 128 ios in the queue in 1 queue 3 | ioengine=libaio 4 | direct=1 5 | rw=write 6 | iodepth=128 7 | numjobs=1 8 | buffered=0 9 | size=100% 10 | runtime=64000 11 | time_based 12 | randrepeat=0 13 | norandommap 14 | refill_buffers 15 | 16 | [job1] 17 | filename=/dev/nvme0n1 18 | bs=64k 19 | 20 | [job1] 21 | filename=/dev/nvme1n1 22 | bs=64k 23 | -------------------------------------------------------------------------------- /Workloads/Precondition/SSD precondition.txt: -------------------------------------------------------------------------------- 1 | There are multiple ways how you can prepare the drive for the benchmarking. 2 | Here are basic steps to follow to get reliable data at the end: 3 | 1. Secure Erase SSD 4 | 5 | 2. Fill SSD with sequential data twice of it's capacity. This will gurantee all available 6 | memory is filled with a data including factory provisioned area. DD is the easiest way for this: 7 | dd if=/dev/zero bs=1024k of=/dev/"devicename" 8 | 9 | 3. If you're running sequential workload to estimate the read or write throughput then skip the next step. 10 | 11 | 4. Fill the drive with 4k random data. The same rule, total amount of data is twice drive's capacity. 12 | Use FIO for this purpose. Here is an example script for NVMe SSD: 13 | [global] 14 | name=4k random write 4 ios in the queue in 32 queues 15 | filename=/dev/nvme0n1 16 | ioengine=libaio 17 | direct=1 18 | bs=4k 19 | rw=randwrite 20 | iodepth=4 21 | numjobs=32 22 | buffered=0 23 | size=100% 24 | loops=2 25 | [job1] 26 | 27 | 5. Run your workload. Usually meassurements starts after 5 minutes of runtime in order to let the SSD FW 28 | adopting to the workload. It's called sustained performance state. This time depends on the SSD 29 | Vendor/SKU/capacity. 30 | -------------------------------------------------------------------------------- /Workloads/Precondition/ddnull.sh: -------------------------------------------------------------------------------- 1 | dd if=/dev/zero bs=1024k of=/dev/nvme0n1 2 | -------------------------------------------------------------------------------- /Workloads/Precondition/fill_1MSEQ.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=1M sequential write 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=1M 7 | rw=write 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | loops=2 13 | randrepeat=0 14 | norandommap 15 | refill_buffers 16 | 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Precondition/fill_4KRandom_NVMe.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random write 4 ios in the queue in 32 queues 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randwrite 8 | iodepth=4 9 | numjobs=32 10 | buffered=0 11 | size=100% 12 | loops=2 13 | randrepeat=0 14 | norandommap 15 | refill_buffers 16 | 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Precondition/fill_4KRandom_SATA.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random write 32 ios in the queue 3 | filename=/dev/sdb 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randwrite 8 | iodepth=32 9 | numjobs=1 10 | buffered=0 11 | size=100% 12 | loops=2 13 | randrepeat=0 14 | norandommap 15 | refill_buffers 16 | 17 | [job1] 18 | -------------------------------------------------------------------------------- /Workloads/Precondition/iocheck.sh: -------------------------------------------------------------------------------- 1 | iostat -c -d -x -t -m /dev/nvme0n1 1 2 | -------------------------------------------------------------------------------- /Workloads/Simulation/8kwarm.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=8kwarm 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=8k 7 | rw=randread 8 | iodepth=4 9 | numjobs=16 10 | buffered=0 11 | size=100% 12 | runtime=10 13 | time_based=1 14 | write_iops_log=8kwarm.txt 15 | randrepeat=0 16 | norandommap 17 | refill_buffers 18 | 19 | [job1] 20 | -------------------------------------------------------------------------------- /Workloads/Simulation/oracle.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | ioengine=libaio 3 | rw=randwrite 4 | numjobs=16 5 | direct=1 6 | iodepth=8 7 | time_based 8 | norandommap 9 | loops=64 10 | randrepeat=0 11 | norandommap 12 | refill_buffers 13 | 14 | [warm-up-0] 15 | stonewall 16 | filename=/dev/nvme0n1 17 | bssplit=8k/50:64k/50 18 | ramp_time=180 19 | runtime=5 20 | 21 | [warm-up-1] 22 | filename=/dev/nvme1n1 23 | bssplit=8k/50:64k/50 24 | ramp_time=180 25 | runtime=5 26 | 27 | [8k-random-0] 28 | stonewall 29 | filename=/dev/nvme0n1 30 | bs=8k 31 | ramp_time=5 32 | runtime=90 33 | 34 | [8k-random-1] 35 | filename=/dev/nvme1n1 36 | bs=8k 37 | ramp_time=5 38 | runtime=90 39 | 40 | [64k-random-0] 41 | stonewall 42 | filename=/dev/nvme0n1 43 | iodepth=4 44 | bs=64k 45 | ramp_time=5 46 | runtime=90 47 | 48 | [64k-random-1] 49 | filename=/dev/nvme1n1 50 | iodepth=4 51 | bs=64k 52 | ramp_time=5 53 | runtime=90 54 | -------------------------------------------------------------------------------- /Workloads/Simulation/oracle1.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | ioengine=libaio 3 | rw=randwrite 4 | numjobs=16 5 | direct=1 6 | iodepth=8 7 | time_based=1 8 | randrepeat=0 9 | norandommap 10 | refill_buffers 11 | 12 | [warm-up-0] 13 | filename=/dev/nvme0n1 14 | bssplit=512/50:64k/50 15 | runtime=10 16 | 17 | -------------------------------------------------------------------------------- /Workloads/Simulation/todo.ini: -------------------------------------------------------------------------------- 1 | [global] 2 | name=4k random MIX 70/30 with 4 ios in the queue in 32 queues 3 | filename=/dev/nvme0n1 4 | ioengine=libaio 5 | direct=1 6 | bs=4k 7 | rw=randrw 8 | rwmixread=70 9 | iodepth=4 10 | numjobs=32 11 | buffered=0 12 | size=100% 13 | runtime=0 14 | randrepeat=0 15 | norandommap 16 | refill_buffers 17 | 18 | [job1] 19 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_100MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_100MBs 19 | rate=,12500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_100MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_10MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_10MBs 19 | rate=,1250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_10MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_110MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_110MBs 19 | rate=,13750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_110MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_120MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_120MBs 19 | rate=,15000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_120MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_130MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_130MBs 19 | rate=,16250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_130MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_140MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_140MBs 19 | rate=,17500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_140MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_150MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_150MBs 19 | rate=,18750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_150MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_160MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_160MBs 19 | rate=,20000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_160MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_170MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_170MBs 19 | rate=,21250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_170MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_180MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_180MBs 19 | rate=,22500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_180MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_190MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_190MBs 19 | rate=,23750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_190MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_200MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_200MBs 19 | rate=,25000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_200MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_20MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_20MBs 19 | rate=,2500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_20MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_210MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_210MBs 19 | rate=,26250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_210MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_220MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_220MBs 19 | rate=,27500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_220MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_230MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_230MBs 19 | rate=,28750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_230MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_240MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_240MBs 19 | rate=,30000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_240MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_250MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_250MBs 19 | rate=,31250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_250MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_260MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_260MBs 19 | rate=,32500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_260MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_270MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_270MBs 19 | rate=,33750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_270MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_280MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_280MBs 19 | rate=,35000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_280MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_290MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_290MBs 19 | rate=,36250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_290MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_300MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_300MBs 19 | rate=,37500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_300MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_30MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_30MBs 19 | rate=,3750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_30MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_310MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_310MBs 19 | rate=,38750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_310MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_320MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_320MBs 19 | rate=,40000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_320MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_330MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_330MBs 19 | rate=,41250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_330MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_340MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_340MBs 19 | rate=,42500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_340MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_350MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_350MBs 19 | rate=,43750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_350MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_360MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_360MBs 19 | rate=,45000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_360MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_370MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_370MBs 19 | rate=,46250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_370MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_380MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_380MBs 19 | rate=,47500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_380MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_390MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_390MBs 19 | rate=,48750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_390MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_400MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_400MBs 19 | rate=,50000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_400MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_40MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_40MBs 19 | rate=,5000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_40MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_410MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_410MBs 19 | rate=,51250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_410MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_420MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_420MBs 19 | rate=,52500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_420MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_430MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_430MBs 19 | rate=,53750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_430MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_440MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_440MBs 19 | rate=,55000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_440MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_450MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_450MBs 19 | rate=,56250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_450MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_460MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_460MBs 19 | rate=,57500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_460MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_470MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_470MBs 19 | rate=,58750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_470MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_480MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_480MBs 19 | rate=,60000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_480MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_490MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_490MBs 19 | rate=,61250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_490MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_500MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_500MBs 19 | rate=,62500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_500MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_50MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_50MBs 19 | rate=,6250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_50MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_510MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_510MBs 19 | rate=,63750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_510MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_520MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_520MBs 19 | rate=,65000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_520MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_530MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_530MBs 19 | rate=,66250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_530MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_540MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_540MBs 19 | rate=,67500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_540MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_550MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_550MBs 19 | rate=,68750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_550MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_560MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_560MBs 19 | rate=,70000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_560MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_570MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_570MBs 19 | rate=,71250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_570MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_580MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_580MBs 19 | rate=,72500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_580MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_590MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_590MBs 19 | rate=,73750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_590MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_600MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_600MBs 19 | rate=,75000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_600MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_60MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_60MBs 19 | rate=,7500k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_60MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_70MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_70MBs 19 | rate=,8750k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_70MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_80MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_80MBs 19 | rate=,10000k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_80MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /Workloads/WritePressureTest/nvme0n1_WPT_90MBs.fio: -------------------------------------------------------------------------------- 1 | [global] 2 | thread 3 | direct=1 4 | group_reporting 5 | norandommap=1 6 | randrepeat=0 7 | refill_buffers 8 | ioengine=libaio 9 | gtod_reduce=0 10 | time_based 11 | blocksize=8k 12 | runtime=10 13 | log_avg_msec=500 14 | [Random_Write] 15 | rw=randwrite 16 | numjobs=8 17 | iodepth=8 18 | write_bw_log=nvme0n1_WPT_90MBs 19 | rate=,11250k 20 | filename=/dev/nvme0n1 21 | 22 | [Random_Read] 23 | rw=randread 24 | numjobs=1 25 | iodepth=1 26 | write_lat_log=nvme0n1_WPT_90MBs 27 | percentile_list=99:99.9:99.99:99.999:99.9999:99.99999:99.999999:99.9999999 28 | filename=/dev/nvme0n1 29 | 30 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | fio-visualizer - Data visualisation tool for FIO 4 | 01.org/fio-visualizer 5 | """ 6 | 7 | __version__ = '0.r6.g1192828' 8 | -------------------------------------------------------------------------------- /__pycache__/realtime_back.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/intel/fiovisualizer/e5f45ecc3c960abb2d319a0cd67e012efd4d0e94/__pycache__/realtime_back.cpython-36.pyc -------------------------------------------------------------------------------- /fio_visualizer.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from pyqtgraph.Qt import QtGui, QtCore 3 | import copy as cp 4 | import pyqtgraph as pg 5 | import itertools 6 | import subprocess 7 | import os 8 | import signal 9 | import threading 10 | import shlex, time 11 | import sys 12 | import realtime_back 13 | 14 | try: 15 | _fromUtf8 = QtCore.QString.fromUtf8 16 | except AttributeError: 17 | def _fromUtf8(s): 18 | return s 19 | 20 | try: 21 | _encoding = QtGui.QApplication.UnicodeUTF8 22 | def _translate(context, text, disambig): 23 | return QtGui.QApplication.translate(context, text, disambig, _encoding) 24 | except AttributeError: 25 | def _translate(context, text, disambig): 26 | return QtGui.QApplication.translate(context, text, disambig) 27 | 28 | class dateAxis(pg.AxisItem): 29 | def tickStrings(self, values, scale, spacing): 30 | strns = [] 31 | rng = max(values)-min(values) 32 | string = '%M:%S' 33 | label1 = '%b %d -' 34 | label2 = ' %b %d, %Y' 35 | for x in values: 36 | try: 37 | strns.append(time.strftime(string, time.localtime(x))) 38 | except ValueError: ## Windows can't handle dates before 1970 39 | strns.append('') 40 | try: 41 | label = time.strftime(label1, time.localtime(min(values)))+time.strftime(label2, time.localtime(max(values))) 42 | except ValueError: 43 | label = '' 44 | return strns 45 | 46 | class uiMainWindow(object): 47 | def __init__(self): 48 | self.WIN_HEIGHT = 1024 49 | self.WIN_WIDTH = 768 50 | self.MAX_SIZE = 16777215 51 | 52 | def select_jobfile(self): 53 | if (QtCore.QT_VERSION_STR >= "5"): 54 | jobfile = QtGui.QFileDialog.getOpenFileName()[0] 55 | else: 56 | jobfile = QtGui.QFileDialog.getOpenFileName() 57 | self.fio_jobfile_path.setText(jobfile) 58 | if not jobfile: 59 | self.start_button.setEnabled(False) 60 | self.stop_button.setEnabled(False) 61 | self.fio_jobfile_contents.clear() 62 | try: 63 | text = open('' + jobfile).read() 64 | self.fio_jobfile_contents.setPlainText(text) 65 | self.start_button.setEnabled(True) 66 | except IOError: 67 | pass 68 | self.browse_button.setChecked(False) 69 | 70 | def reset_window(self, MainWindow): 71 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 72 | sizePolicy.setHorizontalStretch(0) 73 | sizePolicy.setVerticalStretch(0) 74 | sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) 75 | MainWindow.setSizePolicy(sizePolicy) 76 | MainWindow.setMinimumSize(QtCore.QSize(0, 0)) 77 | MainWindow.setMaximumSize(QtCore.QSize(self.MAX_SIZE, self.MAX_SIZE)) 78 | 79 | def create_splitter(self, orientation, widget, name): 80 | widget.setAccessibleName(_fromUtf8("")) 81 | widget.setLineWidth(0) 82 | widget.setOrientation(orientation) 83 | widget.setHandleWidth(0) 84 | widget.setObjectName(_fromUtf8(name)) 85 | 86 | def setup_ui(self, MainWindow): 87 | y_axis_read_iops=pg.AxisItem(orientation='left', showValues=True) 88 | self.set_y_ax(y_axis_read_iops,'Read IOPs (IOP/s)

') 89 | y_axis_write_iops=pg.AxisItem(orientation='left') 90 | self.set_y_ax(y_axis_write_iops, '
Write IOPs (IOP/s)

') 91 | y_axis_read_bw=pg.AxisItem(orientation='left') 92 | self.set_y_ax(y_axis_read_bw, 'Read BW (autoscale)

') 93 | y_axis_write_bw=pg.AxisItem(orientation='left') 94 | self.set_y_ax(y_axis_write_bw, '
Write BW (autoscale)

') 95 | y_axis_read_lat=pg.AxisItem(orientation='left') 96 | self.set_y_ax(y_axis_read_lat, 'Read latency (ms)

') 97 | y_axis_write_lat=pg.AxisItem(orientation='left') 98 | self.set_y_ax(y_axis_write_lat, '
Write latency (ms)

') 99 | x_ax_r_iops, x_ax_w_iops, x_ax_r_bw, x_ax_w_bw, x_ax_r_lat, x_ax_w_lat = dateAxis(orientation='bottom'), dateAxis(orientation='bottom'), dateAxis(orientation='bottom'), dateAxis(orientation='bottom'), dateAxis(orientation='bottom'), dateAxis(orientation='bottom') 100 | MainWindow.setObjectName(_fromUtf8("MainWindow")) 101 | MainWindow.resize(self.WIN_HEIGHT, self.WIN_WIDTH) 102 | self.reset_window(MainWindow) 103 | palette = QtGui.QPalette() 104 | self.set_brush(0, 0, 0, QtGui.QPalette.WindowText, palette, QtGui.QPalette.Active) 105 | self.set_brush(227, 227, 227,QtGui.QPalette.Button, palette, QtGui.QPalette.Active) 106 | self.set_brush(255, 255, 255,QtGui.QPalette.Light, palette, QtGui.QPalette.Active) 107 | self.set_brush(241, 241, 241,QtGui.QPalette.Midlight, palette, QtGui.QPalette.Active) 108 | self.set_brush(113, 113, 113,QtGui.QPalette.Dark, palette, QtGui.QPalette.Active) 109 | self.set_brush(151, 151, 151,QtGui.QPalette.Mid, palette, QtGui.QPalette.Active) 110 | self.set_brush(0, 0, 0,QtGui.QPalette.Text, palette, QtGui.QPalette.Active) 111 | self.set_brush(255, 255, 255,QtGui.QPalette.BrightText, palette, QtGui.QPalette.Active) 112 | self.set_brush(0, 0, 0,QtGui.QPalette.ButtonText, palette, QtGui.QPalette.Active) 113 | self.set_brush(255, 255, 255,QtGui.QPalette.Base, palette, QtGui.QPalette.Active) 114 | self.set_brush(227, 227, 227,QtGui.QPalette.Window, palette, QtGui.QPalette.Active) 115 | self.set_brush(0, 0, 0,QtGui.QPalette.Shadow, palette, QtGui.QPalette.Active) 116 | self.set_brush(241, 241, 241,QtGui.QPalette.AlternateBase, palette, QtGui.QPalette.Active) 117 | self.set_brush(255, 255, 220,QtGui.QPalette.ToolTipBase, palette, QtGui.QPalette.Active) 118 | self.set_brush(0, 0, 0,QtGui.QPalette.ToolTipText, palette, QtGui.QPalette.Active) 119 | self.set_brush(0, 0, 0,QtGui.QPalette.WindowText, palette, QtGui.QPalette.Inactive) 120 | self.set_brush(227, 227, 227,QtGui.QPalette.Button, palette, QtGui.QPalette.Inactive) 121 | self.set_brush(255, 255, 255,QtGui.QPalette.Light, palette, QtGui.QPalette.Inactive) 122 | self.set_brush(241, 241, 241,QtGui.QPalette.Midlight, palette, QtGui.QPalette.Inactive) 123 | self.set_brush(113, 113, 113,QtGui.QPalette.Dark, palette, QtGui.QPalette.Inactive) 124 | self.set_brush(151, 151, 151,QtGui.QPalette.Mid, palette, QtGui.QPalette.Inactive) 125 | self.set_brush(0, 0, 0,QtGui.QPalette.Text, palette, QtGui.QPalette.Inactive) 126 | self.set_brush(255, 255, 255,QtGui.QPalette.BrightText, palette, QtGui.QPalette.Inactive) 127 | self.set_brush(0, 0, 0,QtGui.QPalette.ButtonText, palette, QtGui.QPalette.Inactive) 128 | self.set_brush(255, 255, 255,QtGui.QPalette.Base, palette, QtGui.QPalette.Inactive) 129 | self.set_brush(227, 227, 227,QtGui.QPalette.Window, palette, QtGui.QPalette.Inactive) 130 | self.set_brush(0, 0, 0,QtGui.QPalette.Shadow, palette, QtGui.QPalette.Inactive) 131 | self.set_brush(241, 241, 241,QtGui.QPalette.AlternateBase, palette, QtGui.QPalette.Inactive) 132 | self.set_brush(255, 255, 220,QtGui.QPalette.ToolTipBase, palette, QtGui.QPalette.Inactive) 133 | self.set_brush(0, 0, 0,QtGui.QPalette.ToolTipText, palette, QtGui.QPalette.Inactive) 134 | self.set_brush(113, 113, 113,QtGui.QPalette.WindowText, palette, QtGui.QPalette.Disabled) 135 | self.set_brush(227, 227, 227,QtGui.QPalette.Button, palette, QtGui.QPalette.Disabled) 136 | self.set_brush(255, 255, 255,QtGui.QPalette.Light, palette, QtGui.QPalette.Disabled) 137 | self.set_brush(241, 241, 241,QtGui.QPalette.Midlight, palette, QtGui.QPalette.Disabled) 138 | self.set_brush(113, 113, 113,QtGui.QPalette.Dark, palette, QtGui.QPalette.Disabled) 139 | self.set_brush(151, 151, 151,QtGui.QPalette.Mid, palette, QtGui.QPalette.Disabled) 140 | self.set_brush(113, 113, 113,QtGui.QPalette.Text, palette, QtGui.QPalette.Disabled) 141 | self.set_brush(255, 255, 255,QtGui.QPalette.BrightText, palette, QtGui.QPalette.Disabled) 142 | self.set_brush(113, 113, 113,QtGui.QPalette.ButtonText, palette, QtGui.QPalette.Disabled) 143 | self.set_brush(227, 227, 227,QtGui.QPalette.Base, palette, QtGui.QPalette.Disabled) 144 | self.set_brush(227, 227, 227,QtGui.QPalette.Window, palette, QtGui.QPalette.Disabled) 145 | self.set_brush(0, 0, 0,QtGui.QPalette.Shadow, palette, QtGui.QPalette.Disabled) 146 | self.set_brush(227, 227, 227,QtGui.QPalette.AlternateBase, palette, QtGui.QPalette.Disabled) 147 | self.set_brush(255, 255, 220,QtGui.QPalette.ToolTipBase, palette, QtGui.QPalette.Disabled) 148 | self.set_brush(0, 0, 0,QtGui.QPalette.ToolTipText, palette, QtGui.QPalette.Disabled) 149 | MainWindow.setPalette(palette) 150 | MainWindow.setContextMenuPolicy(QtCore.Qt.NoContextMenu) 151 | self.centralWidget = QtGui.QWidget(MainWindow) 152 | self.reset_window(MainWindow) 153 | self.centralWidget.setObjectName(_fromUtf8("centralWidget")) 154 | self.gridLayout_8 = QtGui.QGridLayout(self.centralWidget) 155 | self.gridLayout_8.setMargin(3) 156 | self.gridLayout_8.setSpacing(0) 157 | self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) 158 | self.splitter_3 = QtGui.QSplitter(self.centralWidget) 159 | self.create_splitter(QtCore.Qt.Horizontal, self.splitter_3, "splitter_3") 160 | self.splitter = QtGui.QSplitter(self.splitter_3) 161 | self.create_splitter(QtCore.Qt.Vertical, self.splitter, "splitter") 162 | self.read_iops_plot = pg.PlotWidget(self.splitter, axisItems={'left': y_axis_read_iops, 'bottom':x_ax_r_iops}) 163 | self.setup_plot(self.read_iops_plot, "read_iops_plot") 164 | self.read_bw_plot = pg.PlotWidget(self.splitter, axisItems={'left': y_axis_read_bw, 'bottom':x_ax_r_bw}) 165 | self.setup_plot(self.read_bw_plot, "read_bw_plot") 166 | self.read_lat_plot = pg.PlotWidget(self.splitter, axisItems={'left': y_axis_read_lat, 'bottom':x_ax_r_lat}) 167 | self.setup_plot(self.read_lat_plot, "read_lat_plot") 168 | self.splitter_2 = QtGui.QSplitter(self.splitter_3) 169 | self.splitter_2.setAccessibleName(_fromUtf8("")) 170 | self.splitter_2.setLineWidth(0) 171 | self.splitter_2.setOrientation(QtCore.Qt.Vertical) 172 | self.splitter_2.setHandleWidth(4) 173 | self.splitter_2.setObjectName(_fromUtf8("splitter_2")) 174 | self.write_iops_plot = pg.PlotWidget(self.splitter_2, axisItems={'left': y_axis_write_iops, 'bottom':x_ax_w_iops}) 175 | self.setup_plot(self.write_iops_plot, "write_iops_plot") 176 | self.write_bw_plot = pg.PlotWidget(self.splitter_2, axisItems={'left': y_axis_write_bw, 'bottom':x_ax_w_bw}) 177 | self.setup_plot(self.write_bw_plot, "write_bw_plot") 178 | self.write_lat_plot = pg.PlotWidget(self.splitter_2, axisItems={'left': y_axis_write_lat, 'bottom':x_ax_w_lat}) 179 | self.setup_plot(self.write_lat_plot, "write_lat_plot") 180 | self.gridLayout_8.addWidget(self.splitter_3, 0, 0, 1, 1) 181 | MainWindow.setCentralWidget(self.centralWidget) 182 | self.dockWidget = QtGui.QDockWidget(MainWindow) 183 | 184 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding) 185 | sizePolicy.setHorizontalStretch(0) 186 | sizePolicy.setVerticalStretch(0) 187 | sizePolicy.setHeightForWidth(self.dockWidget.sizePolicy().hasHeightForWidth()) 188 | self.dockWidget.setSizePolicy(sizePolicy) 189 | self.dockWidget.setMinimumSize(QtCore.QSize(180, 723)) 190 | self.dockWidget.setMaximumSize(QtCore.QSize(180, 524287)) 191 | self.dockWidget.setAccessibleName(_fromUtf8("")) 192 | self.dockWidget.setFloating(False) 193 | self.dockWidget.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea|QtCore.Qt.RightDockWidgetArea) 194 | self.dockWidget.setWindowTitle(_fromUtf8("Settings")) 195 | self.dockWidget.setObjectName(_fromUtf8("dockWidget")) 196 | self.dockWidgetContents = QtGui.QWidget() 197 | self.dockWidgetContents.setObjectName(_fromUtf8("dockWidgetContents")) 198 | self.gridLayout_6 = QtGui.QGridLayout(self.dockWidgetContents) 199 | self.gridLayout_6.setMargin(0) 200 | self.gridLayout_6.setSpacing(0) 201 | self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) 202 | self.frame_10 = QtGui.QFrame(self.dockWidgetContents) 203 | self.set_size(self.frame_10) 204 | 205 | self.frame_10.setAccessibleName(_fromUtf8("")) 206 | self.frame_10.setFrameShape(QtGui.QFrame.NoFrame) 207 | self.frame_10.setFrameShadow(QtGui.QFrame.Plain) 208 | self.frame_10.setObjectName(_fromUtf8("frame_10")) 209 | self.gridLayout_5 = QtGui.QGridLayout(self.frame_10) 210 | self.gridLayout_5.setMargin(2) 211 | self.gridLayout_5.setHorizontalSpacing(0) 212 | self.gridLayout_5.setVerticalSpacing(2) 213 | self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) 214 | self.frame_11 = QtGui.QFrame(self.frame_10) 215 | self.set_size(self.frame_11) 216 | 217 | font = QtGui.QFont() 218 | font.setPointSize(9) 219 | self.client_box = QtGui.QLabel(self.frame_10) 220 | self.client_box.setFont(font) 221 | self.client_box.setAccessibleName(_fromUtf8("")) 222 | self.client_box.setStyleSheet(_fromUtf8("")) 223 | self.client_box.setObjectName(_fromUtf8("client_box")) 224 | self.client_box.setText("Client:") 225 | self.client_box.setScaledContents(True) 226 | self.client_box.setScaledContents(False) 227 | self.set_size(self.client_box) 228 | 229 | font = QtGui.QFont() 230 | font.setPointSize(9) 231 | self.client_box_edit = QtGui.QLineEdit(self.frame_10) 232 | self.client_box_edit.setFont(font) 233 | self.client_box_edit.setPlaceholderText("localhost") 234 | self.client_box_edit.setTextMargins(0, 0, 1, 1) 235 | self.set_size(self.client_box_edit) 236 | 237 | self.gridLayout_5.addWidget(self.client_box, 0, 0, 1, 1) 238 | self.gridLayout_5.addWidget(self.client_box_edit, 0, 1, 1, 1) 239 | 240 | self.frame_11.setAccessibleName(_fromUtf8("")) 241 | self.frame_11.setFrameShape(QtGui.QFrame.WinPanel) 242 | self.frame_11.setFrameShadow(QtGui.QFrame.Raised) 243 | self.frame_11.setObjectName(_fromUtf8("frame_11")) 244 | self.gridLayout_2 = QtGui.QGridLayout(self.frame_11) 245 | self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) 246 | self.start_button = QtGui.QPushButton(self.frame_11) 247 | self.set_size(self.start_button) 248 | 249 | font = QtGui.QFont() 250 | font.setPointSize(9) 251 | self.start_button.setFont(font) 252 | self.start_button.setAccessibleName(_fromUtf8("")) 253 | self.start_button.setStyleSheet(_fromUtf8("")) 254 | self.start_button.setObjectName(_fromUtf8("start_button")) 255 | self.gridLayout_2.addWidget(self.start_button, 0, 0, 1, 1) 256 | self.stop_button = QtGui.QPushButton(self.frame_11) 257 | self.set_size(self.stop_button) 258 | self.start_button.setEnabled(False) 259 | 260 | font = QtGui.QFont() 261 | font.setPointSize(9) 262 | self.stop_button.setFont(font) 263 | self.stop_button.setAccessibleName(_fromUtf8("")) 264 | self.stop_button.setStyleSheet(_fromUtf8("")) 265 | self.stop_button.setObjectName(_fromUtf8("stop_button")) 266 | self.gridLayout_2.addWidget(self.stop_button, 1, 0, 1, 1) 267 | self.stop_button.setEnabled(False) 268 | self.frame = QtGui.QFrame(self.frame_10) 269 | self.set_size(self.frame) 270 | 271 | self.gridLayout_5.addWidget(self.frame_11, 3, 0, 1, 2) 272 | self.frame.setAccessibleName(_fromUtf8("")) 273 | self.frame.setFrameShape(QtGui.QFrame.StyledPanel) 274 | self.frame.setFrameShadow(QtGui.QFrame.Raised) 275 | self.frame.setObjectName(_fromUtf8("frame")) 276 | self.gridLayout_7 = QtGui.QGridLayout(self.frame) 277 | self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) 278 | self.label_8 = QtGui.QLabel(self.frame) 279 | self.set_size(self.label_8) 280 | 281 | font = QtGui.QFont() 282 | font.setPointSize(9) 283 | self.label_8.setFont(font) 284 | self.label_8.setAccessibleName(_fromUtf8("")) 285 | self.label_8.setStyleSheet(_fromUtf8("")) 286 | self.label_8.setFrameShape(QtGui.QFrame.NoFrame) 287 | self.label_8.setFrameShadow(QtGui.QFrame.Plain) 288 | self.label_8.setLineWidth(-5) 289 | self.label_8.setScaledContents(False) 290 | self.label_8.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) 291 | self.label_8.setMargin(0) 292 | self.label_8.setObjectName(_fromUtf8("label_8")) 293 | self.gridLayout_7.addWidget(self.label_8, 0, 0, 1, 1) 294 | self.fio_jobfile_path = QtGui.QLineEdit(self.frame) 295 | self.set_size(self.fio_jobfile_path) 296 | 297 | self.fio_jobfile_path.setAccessibleName(_fromUtf8("")) 298 | self.fio_jobfile_path.setReadOnly(True) 299 | self.fio_jobfile_path.setObjectName(_fromUtf8("fio_jobfile_path")) 300 | self.gridLayout_7.addWidget(self.fio_jobfile_path, 1, 0, 1, 1) 301 | self.fio_jobfile_contents = QtGui.QPlainTextEdit(self.frame) 302 | self.set_size(self.fio_jobfile_contents) 303 | 304 | self.fio_jobfile_contents.setAccessibleName(_fromUtf8("")) 305 | self.fio_jobfile_contents.setUndoRedoEnabled(False) 306 | self.fio_jobfile_contents.setReadOnly(True) 307 | self.fio_jobfile_contents.setObjectName(_fromUtf8("fio_jobfile_contents")) 308 | self.gridLayout_7.addWidget(self.fio_jobfile_contents, 2, 0, 1, 2) 309 | 310 | self.browse_button = QtGui.QPushButton(self.frame) 311 | self.set_size(self.browse_button) 312 | font = QtGui.QFont() 313 | font.setPointSize(9) 314 | self.browse_button.setFont(font) 315 | self.browse_button.setAccessibleName(_fromUtf8("")) 316 | self.browse_button.setStyleSheet(_fromUtf8("")) 317 | self.browse_button.setCheckable(True) 318 | self.browse_button.setChecked(False) 319 | self.browse_button.setAutoExclusive(False) 320 | self.browse_button.setObjectName(_fromUtf8("browse_button")) 321 | self.gridLayout_7.addWidget(self.browse_button, 1, 1, 1, 1) 322 | self.gridLayout_5.addWidget(self.frame, 1, 0, 1, 2) 323 | self.gridLayout_7.setMargin(3) 324 | 325 | self.tabWidget = QtGui.QTabWidget(self.frame_10) 326 | self.set_size(self.tabWidget) 327 | self.tabWidget.setAccessibleName(_fromUtf8("")) 328 | self.tabWidget.setUsesScrollButtons(True) 329 | self.tabWidget.setDocumentMode(False) 330 | self.tabWidget.setTabsClosable(False) 331 | self.tabWidget.setMovable(False) 332 | self.tabWidget.setObjectName(_fromUtf8("tabWidget")) 333 | self.tab = QtGui.QWidget() 334 | self.tab.setObjectName(_fromUtf8("tab")) 335 | self.gridLayout_11 = QtGui.QGridLayout(self.tab) 336 | self.gridLayout_11.setObjectName(_fromUtf8("gridLayout_11")) 337 | 338 | self.frame_4 = QtGui.QFrame(self.tab) 339 | self.set_size(self.frame_4) 340 | self.frame_4.setFrameShape(QtGui.QFrame.Box) 341 | self.frame_4.setFrameShadow(QtGui.QFrame.Plain) 342 | self.frame_4.setObjectName(_fromUtf8("frame_4")) 343 | self.gridLayout_12 = QtGui.QGridLayout(self.frame_4) 344 | self.gridLayout_12.setObjectName(_fromUtf8("gridLayout_12")) 345 | self.read_iops_checkbox = QtGui.QCheckBox(self.frame_4) 346 | self.set_size(self.read_iops_checkbox) 347 | font = QtGui.QFont() 348 | font.setPointSize(9) 349 | self.read_iops_checkbox.setFont(font) 350 | self.read_iops_checkbox.setStyleSheet(_fromUtf8("")) 351 | self.read_iops_checkbox.setChecked(True) 352 | self.read_iops_checkbox.setAutoExclusive(False) 353 | self.read_iops_checkbox.setTristate(False) 354 | self.read_iops_checkbox.setObjectName(_fromUtf8("read_iops_checkbox")) 355 | self.gridLayout_12.addWidget(self.read_iops_checkbox, 0, 0, 2, 1) 356 | self.read_iops_total_checkbox = QtGui.QCheckBox(self.frame_4) 357 | self.set_size_pol(self.read_iops_total_checkbox, "read_iops_total_checkbox", True, (0, 1, 1, 1), self.gridLayout_12, self.frame_4) 358 | self.read_iops_threads_checkbox = QtGui.QCheckBox(self.frame_4) 359 | self.set_size_pol(self.read_iops_threads_checkbox, "read_iops_threads_checkbox", False, (1, 1, 1, 1), self.gridLayout_12, self.frame_4) 360 | self.gridLayout_11.addWidget(self.frame_4, 0, 0, 1, 1) 361 | self.frame_5 = QtGui.QFrame(self.tab) 362 | self.set_size(self.frame_5) 363 | self.frame_5.setFrameShape(QtGui.QFrame.Box) 364 | self.frame_5.setFrameShadow(QtGui.QFrame.Plain) 365 | self.frame_5.setObjectName(_fromUtf8("frame_5")) 366 | self.gridLayout_13 = QtGui.QGridLayout(self.frame_5) 367 | self.gridLayout_13.setObjectName(_fromUtf8("gridLayout_13")) 368 | self.read_bw_checkbox = QtGui.QCheckBox(self.frame_5) 369 | self.set_size_pol(self.read_bw_checkbox, "read_bw_checkbox", True, (0,0,2,1), self.gridLayout_13, self.frame_5) 370 | self.read_bw_total_checkbox = QtGui.QCheckBox(self.frame_5) 371 | self.set_size_pol(self.read_bw_total_checkbox, "read_bw_total_checkbox", True, (0,1,1,1), self.gridLayout_13, self.frame_5) 372 | self.read_bw_threads_checkbox = QtGui.QCheckBox(self.frame_5) 373 | self.set_size(self.read_bw_threads_checkbox) 374 | font = QtGui.QFont() 375 | font.setPointSize(9) 376 | self.read_bw_threads_checkbox.setFont(font) 377 | self.read_bw_threads_checkbox.setStyleSheet(_fromUtf8("")) 378 | self.read_bw_threads_checkbox.setObjectName(_fromUtf8("read_bw_threads_checkbox")) 379 | self.gridLayout_13.addWidget(self.read_bw_threads_checkbox, 1, 1, 1, 1) 380 | self.gridLayout_11.addWidget(self.frame_5, 1, 0, 1, 1) 381 | self.frame_9 = QtGui.QFrame(self.tab) 382 | self.set_size(self.frame_9) 383 | self.frame_9.setFrameShape(QtGui.QFrame.Box) 384 | self.frame_9.setFrameShadow(QtGui.QFrame.Plain) 385 | self.frame_9.setObjectName(_fromUtf8("frame_9")) 386 | self.gridLayout_14 = QtGui.QGridLayout(self.frame_9) 387 | self.gridLayout_14.setObjectName(_fromUtf8("gridLayout_14")) 388 | self.read_lat_checkbox = QtGui.QCheckBox(self.frame_9) 389 | self.set_size_pol(self.read_lat_checkbox, "read_lat_checkbox", True, (0,0,2,1), self.gridLayout_14, self.frame_9) 390 | self.read_lat_max_checkbox = QtGui.QCheckBox(self.frame_9) 391 | self.set_size_pol(self.read_lat_max_checkbox, "read_lat_max_checkbox", True, (0,1,1,1), self.gridLayout_14, self.frame_9) 392 | self.read_lat_threads_checkbox = QtGui.QCheckBox(self.frame_9) 393 | self.set_size_pol(self.read_lat_threads_checkbox, "read_lat_threads_checkbox", False, (1,1,1,1), self.gridLayout_14, self.frame_9) 394 | self.gridLayout_11.addWidget(self.frame_9, 2, 0, 1, 1) 395 | self.tabWidget.addTab(self.tab, _fromUtf8("")) 396 | self.tab_2 = QtGui.QWidget() 397 | self.tab_2.setObjectName(_fromUtf8("tab_2")) 398 | self.gridLayout = QtGui.QGridLayout(self.tab_2) 399 | self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 400 | self.frame_6 = QtGui.QFrame(self.tab_2) 401 | 402 | self.set_size(self.frame_6) 403 | self.frame_6.setAccessibleName(_fromUtf8("")) 404 | self.frame_6.setFrameShape(QtGui.QFrame.Box) 405 | self.frame_6.setFrameShadow(QtGui.QFrame.Plain) 406 | self.frame_6.setObjectName(_fromUtf8("frame_6")) 407 | self.gridLayout_10 = QtGui.QGridLayout(self.frame_6) 408 | self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10")) 409 | self.write_iops_checkbox = QtGui.QCheckBox(self.frame_6) 410 | self.set_size_pol(self.write_iops_checkbox, "write_iops_checkbox", True, (0,0,2,1), self.gridLayout_10, self.frame_6) 411 | self.write_iops_total_checkbox = QtGui.QCheckBox(self.frame_6) 412 | self.set_size_pol(self.write_iops_total_checkbox, "write_iops_total_checkbox", True, (0,1,1,1), self.gridLayout_10, self.frame_6) 413 | self.write_iops_threads_checkbox = QtGui.QCheckBox(self.frame_6) 414 | self.set_size_pol(self.write_iops_threads_checkbox, "write_iops_threads_checkbox", False, (1,1,1,1), self.gridLayout_10, self.frame_6) 415 | self.gridLayout.addWidget(self.frame_6, 0, 0, 1, 1) 416 | self.frame_7 = QtGui.QFrame(self.tab_2) 417 | 418 | self.set_size(self.frame_7) 419 | self.frame_7.setAccessibleName(_fromUtf8("")) 420 | self.frame_7.setFrameShape(QtGui.QFrame.Box) 421 | self.frame_7.setFrameShadow(QtGui.QFrame.Plain) 422 | self.frame_7.setObjectName(_fromUtf8("frame_7")) 423 | self.gridLayout_9 = QtGui.QGridLayout(self.frame_7) 424 | self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9")) 425 | self.write_bw_checkbox = QtGui.QCheckBox(self.frame_7) 426 | self.set_size_pol(self.write_bw_checkbox, "write_bw_checkbox", True, (0,0,2,1), self.gridLayout_9, self.frame_7) 427 | self.write_bw_total_checkbox = QtGui.QCheckBox(self.frame_7) 428 | self.set_size_pol(self.write_bw_total_checkbox, "write_bw_total_checkbox", True, (0,1,1,1), self.gridLayout_9, self.frame_7) 429 | self.write_bw_threads_checkbox = QtGui.QCheckBox(self.frame_7) 430 | self.set_size_pol(self.write_bw_threads_checkbox, "write_bw_threads_checkbox", False, (1,1,1,1), self.gridLayout_9, self.frame_7) 431 | self.gridLayout.addWidget(self.frame_7, 1, 0, 1, 1) 432 | self.frame_8 = QtGui.QFrame(self.tab_2) 433 | 434 | self.set_size(self.frame_8) 435 | self.frame_8.setAccessibleName(_fromUtf8("")) 436 | self.frame_8.setFrameShape(QtGui.QFrame.Box) 437 | self.frame_8.setFrameShadow(QtGui.QFrame.Plain) 438 | self.frame_8.setObjectName(_fromUtf8("frame_8")) 439 | self.gridLayout_4 = QtGui.QGridLayout(self.frame_8) 440 | self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) 441 | self.write_lat_checkbox = QtGui.QCheckBox(self.frame_8) 442 | self.set_size_pol(self.write_lat_checkbox, "write_lat_checkbox", True, (0,0,2,1), self.gridLayout_4, self.frame_8) 443 | self.write_lat_max_checkbox = QtGui.QCheckBox(self.frame_8) 444 | self.set_size_pol(self.write_lat_max_checkbox, "write_lat_max_checkbox", True, (0, 1, 1, 1), self.gridLayout_4, self.frame_8) 445 | self.write_lat_threads_checkbox = QtGui.QCheckBox(self.frame_8) 446 | self.set_size_pol(self.write_lat_threads_checkbox, "write_lat_threads_checkbox", False, (1,1,1,1), self.gridLayout_4, self.frame_8) 447 | self.gridLayout.addWidget(self.frame_8, 2, 0, 1, 1) 448 | self.tabWidget.addTab(self.tab_2, _fromUtf8("")) 449 | self.gridLayout_5.addWidget(self.tabWidget, 2, 0, 1, 2) 450 | self.gridLayout_6.addWidget(self.frame_10, 0, 0, 2, 1) 451 | self.dockWidget.setWidget(self.dockWidgetContents) 452 | MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dockWidget) 453 | self.actionSettings = QtGui.QAction(MainWindow) 454 | self.actionSettings.setObjectName(_fromUtf8("actionSettings")) 455 | self.actionPlot_Area = QtGui.QAction(MainWindow) 456 | self.actionPlot_Area.setObjectName(_fromUtf8("actionPlot_Area")) 457 | self.browse_button.clicked.connect(self.select_jobfile) 458 | plots = [self.read_iops_plot, self.write_iops_plot, self.read_bw_plot, self.write_bw_plot, self.read_lat_plot, self.write_lat_plot] 459 | for plot in plots: 460 | plot.setLimits(yMin=0, xMin=0) 461 | plot.showGrid(x=True, y=True, alpha=0.2) 462 | self.retranslateUi(MainWindow) 463 | self.tabWidget.setCurrentIndex(0) 464 | QtCore.QMetaObject.connectSlotsByName(MainWindow) 465 | 466 | def set_size(self, widget): 467 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 468 | sizePolicy.setHorizontalStretch(0) 469 | sizePolicy.setVerticalStretch(0) 470 | sizePolicy.setHeightForWidth(widget.sizePolicy().hasHeightForWidth()) 471 | widget.setSizePolicy(sizePolicy) 472 | widget.setMinimumSize(QtCore.QSize(0, 0)) 473 | 474 | def retranslateUi(self, MainWindow): 475 | MainWindow.setWindowTitle(_translate("MainWindow", "FIO visualizing tool", None)) 476 | self.client_box.setText(_translate("MainWindow", "Client:", None)) 477 | self.start_button.setText(_translate("MainWindow", "START", None)) 478 | self.stop_button.setText(_translate("MainWindow", "STOP", None)) 479 | self.label_8.setText(_translate("MainWindow", "Jobfile:", None)) 480 | self.browse_button.setText(_translate("MainWindow", "Browse", None)) 481 | self.set_check_text(self.read_iops_checkbox, self.read_iops_total_checkbox, self.read_iops_threads_checkbox, self.read_bw_checkbox, self.read_bw_total_checkbox, self.read_bw_threads_checkbox, self.read_lat_checkbox, self.read_lat_max_checkbox, self.read_lat_threads_checkbox) 482 | self.set_check_text(self.write_iops_checkbox, self.write_iops_total_checkbox, self.write_iops_threads_checkbox, self.write_bw_checkbox, self.write_bw_total_checkbox, self.write_bw_threads_checkbox, self.write_lat_checkbox, self.write_lat_max_checkbox, self.write_lat_threads_checkbox) 483 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Read", None)) 484 | self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Write", None)) 485 | self.actionSettings.setText(_translate("MainWindow", "Settings", None)) 486 | self.actionPlot_Area.setText(_translate("MainWindow", "Plot Area", None)) 487 | 488 | def set_size_pol(self, checkbox, name, checked, coord, grid, frame): 489 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 490 | sizePolicy.setHorizontalStretch(0) 491 | sizePolicy.setVerticalStretch(0) 492 | sizePolicy.setHeightForWidth(checkbox.sizePolicy().hasHeightForWidth()) 493 | checkbox.setSizePolicy(sizePolicy) 494 | checkbox.setMinimumSize(QtCore.QSize(0, 0)) 495 | font = QtGui.QFont() 496 | font.setPointSize(9) 497 | checkbox.setFont(font) 498 | checkbox.setAccessibleName(_fromUtf8("")) 499 | checkbox.setStyleSheet(_fromUtf8("")) 500 | checkbox.setChecked(checked) 501 | checkbox.setObjectName(_fromUtf8(name)) 502 | grid.addWidget(checkbox, coord[0], coord[1], coord[2], coord[3]) 503 | 504 | def checkbox_handler(self, plot, total_checkbox, thread_checkbox, unit_checkbox): 505 | checked = unit_checkbox.isChecked() 506 | thread_checkbox.setEnabled(checked) 507 | total_checkbox.setEnabled(checked) 508 | if checked: 509 | plot.show() 510 | else: 511 | plot.hide() 512 | 513 | def set_brush(self, r,g,b,widget,palette,status): 514 | brush = QtGui.QBrush(QtGui.QColor(r, g, b)) 515 | brush.setStyle(QtCore.Qt.SolidPattern) 516 | palette.setBrush(status, widget, brush) 517 | 518 | def setup_plot(self, plot, name): 519 | sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 520 | sizePolicy.setHorizontalStretch(0) 521 | sizePolicy.setVerticalStretch(0) 522 | sizePolicy.setHeightForWidth(plot.sizePolicy().hasHeightForWidth()) 523 | plot.setSizePolicy(sizePolicy) 524 | plot.setMinimumSize(QtCore.QSize(0, 0)) 525 | plot.setMaximumSize(QtCore.QSize(16777215, 16777215)) 526 | plot.setBaseSize(QtCore.QSize(0, 0)) 527 | plot.setAccessibleName(_fromUtf8("")) 528 | plot.setInteractive(True) 529 | plot.setObjectName(_fromUtf8(name)) 530 | 531 | def set_y_ax(self, y_ax, label): 532 | y_ax.setLabel(label) 533 | y_ax.setStyle(autoExpandTextSpace=False) 534 | 535 | 536 | def set_check_text(self, iops, iops_tot, iops_threads, bw, bw_tot, bw_threads, lat, lat_max, lat_threads): 537 | iops.setText(_translate("MainWindow", "IOPS", None)) 538 | iops_tot.setText(_translate("MainWindow", "Total", None)) 539 | iops_threads.setText(_translate("MainWindow", "Threads", None)) 540 | bw.setText(_translate("MainWindow", "BW", None)) 541 | bw_tot.setText(_translate("MainWindow", "Total", None)) 542 | bw_threads.setText(_translate("MainWindow", "Threads", None)) 543 | lat.setText(_translate("MainWindow", "LAT", None)) 544 | lat_max.setText(_translate("MainWindow", "Peak\n(max of\nclat_max)", None)) 545 | lat_threads.setText(_translate("MainWindow", "Threads clat_avg", None)) 546 | 547 | def init_fio(): 548 | global parsing_thread, fio_process, timer 549 | numjobs = realtime_back.get_jobs(str(ui.fio_jobfile_path.text())) 550 | read_iops_data = { 551 | 'type':'r_iops', 552 | 'all':[], 553 | 'job_vals':[[] for i in itertools.repeat(None, numjobs)], 554 | 'plot':ui.read_iops_plot, 555 | 'checkb':ui.read_iops_checkbox, 556 | 'thread_check':ui.read_iops_threads_checkbox, 557 | 'total_check':ui.read_iops_total_checkbox, 558 | 'colors':['#00aeef'] 559 | } 560 | read_bw_data = { 561 | 'type': 'r_bw', 562 | 'all':[], 563 | 'job_vals':[[] for i in itertools.repeat(None, numjobs)], 564 | 'plot':ui.read_bw_plot, 565 | 'checkb':ui.read_bw_checkbox, 566 | 'thread_check':ui.read_bw_threads_checkbox, 567 | 'total_check':ui.read_bw_total_checkbox, 568 | 'colors':['#fd9613'] 569 | } 570 | read_lat_data = { 571 | 'type': 'r_lat', 572 | 'all':[], 573 | 'job_vals':[[] for i in itertools.repeat(None, numjobs)], 574 | 'plot':ui.read_lat_plot, 575 | 'checkb':ui.read_lat_checkbox, 576 | 'thread_check':ui.read_lat_threads_checkbox, 577 | 'total_check':ui.read_lat_max_checkbox, 578 | 'colors':['#004280'] 579 | } 580 | write_iops_data = { 581 | 'type':'w_iops', 582 | 'all':[], 583 | 'job_vals':[[] for i in itertools.repeat(None, numjobs)], 584 | 'plot':ui.write_iops_plot, 585 | 'checkb':ui.write_iops_checkbox, 586 | 'thread_check':ui.write_iops_threads_checkbox, 587 | 'total_check':ui.write_iops_total_checkbox, 588 | 'colors':['#00aeef'] 589 | } 590 | write_bw_data = { 591 | 'type': 'w_bw', 592 | 'all':[], 593 | 'job_vals':[[] for i in itertools.repeat(None, numjobs)], 594 | 'plot':ui.write_bw_plot, 595 | 'checkb':ui.write_bw_checkbox, 596 | 'thread_check':ui.write_bw_threads_checkbox, 597 | 'total_check':ui.write_bw_total_checkbox, 598 | 'colors':['#fd9613'] 599 | } 600 | write_lat_data = { 601 | 'type': 'w_lat', 602 | 'all':[], 603 | 'job_vals':[[] for i in itertools.repeat(None, numjobs)], 604 | 'plot':ui.write_lat_plot, 605 | 'checkb':ui.write_lat_checkbox, 606 | 'thread_check':ui.write_lat_threads_checkbox, 607 | 'total_check':ui.write_lat_max_checkbox, 608 | 'colors':['#004280'] 609 | } 610 | 611 | fio_all_data = [read_iops_data, read_bw_data, read_lat_data, write_iops_data, write_bw_data, write_lat_data] 612 | for entry in fio_all_data: 613 | entry['colors'] = gen_colors(entry['colors'][0], numjobs) 614 | exit_code = [None] 615 | parsing_thread, fio_process = realtime_back.start_fio(str(ui.fio_jobfile_path.text()), str(ui.client_box_edit.text()), fio_all_data, exit_code) 616 | parsing_thread.start() 617 | timer = QtCore.QTimer() 618 | timer.timeout.connect(lambda: update(fio_all_data, parsing_thread, exit_code[0], timer)) 619 | timer.start(1000) 620 | ui.stop_button.setEnabled(True) 621 | ui.start_button.setEnabled(False) 622 | 623 | def gen_colors(base_color, numjobs): 624 | colors = [] 625 | grad_weight = int(64000/numjobs) 626 | for i in range(0, numjobs): 627 | colors.append(format(int(base_color[1:], 16) + (i * grad_weight), '06X')) 628 | return colors 629 | 630 | def kill_fio(): 631 | os.killpg(fio_process.pid, signal.SIGTERM) 632 | fio_process_output, fio_process_error = fio_process.communicate() 633 | ui.start_button.setEnabled(True) 634 | ui.stop_button.setEnabled(False) 635 | 636 | def is_lat(entry): 637 | dtype = entry['type'] 638 | return (dtype == 'w_lat' or dtype == 'r_lat') 639 | 640 | def update(fio_data, parsing_thread, exit_code, timer): 641 | if parsing_thread.isAlive(): 642 | for entry in fio_data: 643 | if entry['checkb'].isChecked(): 644 | entry['plot'].clear() 645 | if entry['thread_check'].isChecked(): 646 | for i in range(0, len(entry['job_vals'])): 647 | entry['plot'].plot(pen=entry['colors'][i]).setData(entry['job_vals'][i]) 648 | 649 | if entry['total_check'].isChecked(): 650 | entry['plot'].plot(pen=entry['colors'][0]).setData(entry['all']) 651 | 652 | else: 653 | timer.stop() 654 | msg = QtGui.QMessageBox() 655 | if exit_code==0: 656 | msg.about(msg, 'Informational', 'FIO succefully finished with exit code: '+str(exit_code)) 657 | elif exit_code==128: 658 | msg.about(msg, 'Informational', 'FIO was terminated by user, exit code: '+str(exit_code)) 659 | else: 660 | fio_process_output, fio_process_error = fio_process.communicate() 661 | msg.about(msg, 'Informational', 'FIO was terminated with exit code: '+str(exit_code)+'\n\nSTDERR :'+str(fio_process_error)) 662 | 663 | application = QtGui.QApplication([]) 664 | pg.setConfigOptions(antialias=True) 665 | pg.setConfigOptions(foreground='k') 666 | pg.setConfigOptions(background=(227, 227, 227)) 667 | window = QtGui.QMainWindow() 668 | ui = uiMainWindow() 669 | ui.setup_ui(window) 670 | window.show() 671 | ui.read_iops_checkbox.stateChanged.connect(lambda: ui.checkbox_handler(ui.read_iops_plot, ui.read_iops_total_checkbox, ui.read_iops_threads_checkbox, ui.read_iops_checkbox)) 672 | ui.write_iops_checkbox.stateChanged.connect(lambda: ui.checkbox_handler(ui.write_iops_plot, ui.write_iops_total_checkbox, ui.write_iops_threads_checkbox, ui.write_iops_checkbox)) 673 | ui.read_bw_checkbox.stateChanged.connect(lambda: ui.checkbox_handler(ui.read_bw_plot, ui.read_bw_total_checkbox, ui.read_bw_threads_checkbox, ui.read_bw_checkbox)) 674 | ui.write_bw_checkbox.stateChanged.connect(lambda: ui.checkbox_handler(ui.write_bw_plot, ui.write_bw_total_checkbox, ui.write_bw_threads_checkbox, ui.write_bw_checkbox)) 675 | ui.read_lat_checkbox.stateChanged.connect(lambda: ui.checkbox_handler(ui.read_lat_plot, ui.read_lat_max_checkbox, ui.read_lat_threads_checkbox, ui.read_lat_checkbox)) 676 | ui.write_lat_checkbox.stateChanged.connect(lambda: ui.checkbox_handler(ui.write_lat_plot, ui.write_lat_max_checkbox, ui.write_lat_threads_checkbox, ui.write_lat_checkbox)) 677 | ui.start_button.clicked.connect(init_fio) 678 | ui.stop_button.clicked.connect(kill_fio) 679 | QtGui.QApplication.instance().exec_() 680 | 681 | def main(argv=None): 682 | if argv is None: 683 | argv = sys.argv 684 | if __name__ == "__main__": 685 | sys.exit(main()) 686 | 687 | -------------------------------------------------------------------------------- /mainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 1024 10 | 776 11 | 12 | 13 | 14 | 15 | 0 16 | 0 17 | 18 | 19 | 20 | 21 | 0 22 | 0 23 | 24 | 25 | 26 | 27 | 16777215 28 | 16777215 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 0 38 | 0 39 | 0 40 | 41 | 42 | 43 | 44 | 45 | 46 | 227 47 | 227 48 | 227 49 | 50 | 51 | 52 | 53 | 54 | 55 | 255 56 | 255 57 | 255 58 | 59 | 60 | 61 | 62 | 63 | 64 | 241 65 | 241 66 | 241 67 | 68 | 69 | 70 | 71 | 72 | 73 | 113 74 | 113 75 | 113 76 | 77 | 78 | 79 | 80 | 81 | 82 | 151 83 | 151 84 | 151 85 | 86 | 87 | 88 | 89 | 90 | 91 | 0 92 | 0 93 | 0 94 | 95 | 96 | 97 | 98 | 99 | 100 | 255 101 | 255 102 | 255 103 | 104 | 105 | 106 | 107 | 108 | 109 | 0 110 | 0 111 | 0 112 | 113 | 114 | 115 | 116 | 117 | 118 | 255 119 | 255 120 | 255 121 | 122 | 123 | 124 | 125 | 126 | 127 | 227 128 | 227 129 | 227 130 | 131 | 132 | 133 | 134 | 135 | 136 | 0 137 | 0 138 | 0 139 | 140 | 141 | 142 | 143 | 144 | 145 | 241 146 | 241 147 | 241 148 | 149 | 150 | 151 | 152 | 153 | 154 | 255 155 | 255 156 | 220 157 | 158 | 159 | 160 | 161 | 162 | 163 | 0 164 | 0 165 | 0 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 0 175 | 0 176 | 0 177 | 178 | 179 | 180 | 181 | 182 | 183 | 227 184 | 227 185 | 227 186 | 187 | 188 | 189 | 190 | 191 | 192 | 255 193 | 255 194 | 255 195 | 196 | 197 | 198 | 199 | 200 | 201 | 241 202 | 241 203 | 241 204 | 205 | 206 | 207 | 208 | 209 | 210 | 113 211 | 113 212 | 113 213 | 214 | 215 | 216 | 217 | 218 | 219 | 151 220 | 151 221 | 151 222 | 223 | 224 | 225 | 226 | 227 | 228 | 0 229 | 0 230 | 0 231 | 232 | 233 | 234 | 235 | 236 | 237 | 255 238 | 255 239 | 255 240 | 241 | 242 | 243 | 244 | 245 | 246 | 0 247 | 0 248 | 0 249 | 250 | 251 | 252 | 253 | 254 | 255 | 255 256 | 255 257 | 255 258 | 259 | 260 | 261 | 262 | 263 | 264 | 227 265 | 227 266 | 227 267 | 268 | 269 | 270 | 271 | 272 | 273 | 0 274 | 0 275 | 0 276 | 277 | 278 | 279 | 280 | 281 | 282 | 241 283 | 241 284 | 241 285 | 286 | 287 | 288 | 289 | 290 | 291 | 255 292 | 255 293 | 220 294 | 295 | 296 | 297 | 298 | 299 | 300 | 0 301 | 0 302 | 0 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 113 312 | 113 313 | 113 314 | 315 | 316 | 317 | 318 | 319 | 320 | 227 321 | 227 322 | 227 323 | 324 | 325 | 326 | 327 | 328 | 329 | 255 330 | 255 331 | 255 332 | 333 | 334 | 335 | 336 | 337 | 338 | 241 339 | 241 340 | 241 341 | 342 | 343 | 344 | 345 | 346 | 347 | 113 348 | 113 349 | 113 350 | 351 | 352 | 353 | 354 | 355 | 356 | 151 357 | 151 358 | 151 359 | 360 | 361 | 362 | 363 | 364 | 365 | 113 366 | 113 367 | 113 368 | 369 | 370 | 371 | 372 | 373 | 374 | 255 375 | 255 376 | 255 377 | 378 | 379 | 380 | 381 | 382 | 383 | 113 384 | 113 385 | 113 386 | 387 | 388 | 389 | 390 | 391 | 392 | 227 393 | 227 394 | 227 395 | 396 | 397 | 398 | 399 | 400 | 401 | 227 402 | 227 403 | 227 404 | 405 | 406 | 407 | 408 | 409 | 410 | 0 411 | 0 412 | 0 413 | 414 | 415 | 416 | 417 | 418 | 419 | 227 420 | 227 421 | 227 422 | 423 | 424 | 425 | 426 | 427 | 428 | 255 429 | 255 430 | 220 431 | 432 | 433 | 434 | 435 | 436 | 437 | 0 438 | 0 439 | 0 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | Qt::NoContextMenu 448 | 449 | 450 | FIO visualizing tool 451 | 452 | 453 | 454 | 455 | 0 456 | 0 457 | 458 | 459 | 460 | 461 | 0 462 | 0 463 | 464 | 465 | 466 | 467 | 16777215 468 | 16777215 469 | 470 | 471 | 472 | 473 | 3 474 | 475 | 476 | 0 477 | 478 | 479 | 480 | 481 | 482 | 9 483 | 484 | 485 | 486 | 487 | 488 | 489 | 0 490 | 491 | 492 | Qt::Horizontal 493 | 494 | 495 | 4 496 | 497 | 498 | 499 | 500 | 9 501 | 502 | 503 | 504 | 505 | 506 | 507 | 0 508 | 509 | 510 | Qt::Vertical 511 | 512 | 513 | 4 514 | 515 | 516 | 517 | 518 | 0 519 | 0 520 | 521 | 522 | 523 | 524 | 0 525 | 0 526 | 527 | 528 | 529 | 530 | 16777215 531 | 16777215 532 | 533 | 534 | 535 | 536 | 0 537 | 0 538 | 539 | 540 | 541 | 542 | 9 543 | 544 | 545 | 546 | 547 | 548 | 549 | true 550 | 551 | 552 | 553 | 554 | 555 | 0 556 | 0 557 | 558 | 559 | 560 | 561 | 0 562 | 0 563 | 564 | 565 | 566 | 567 | 16777215 568 | 16777215 569 | 570 | 571 | 572 | 573 | 0 574 | 0 575 | 576 | 577 | 578 | 579 | 9 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 0.000000000000000 588 | 0.000000000000000 589 | 0.000000000000000 590 | 0.000000000000000 591 | 592 | 593 | 594 | 595 | 596 | 597 | 0 598 | 0 599 | 600 | 601 | 602 | 603 | 0 604 | 0 605 | 606 | 607 | 608 | 609 | 16777215 610 | 16777215 611 | 612 | 613 | 614 | 615 | 0 616 | 0 617 | 618 | 619 | 620 | 621 | 9 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 9 633 | 634 | 635 | 636 | 637 | 638 | 639 | 0 640 | 641 | 642 | Qt::Vertical 643 | 644 | 645 | 4 646 | 647 | 648 | 649 | 650 | 0 651 | 0 652 | 653 | 654 | 655 | 656 | 0 657 | 0 658 | 659 | 660 | 661 | 662 | 16777215 663 | 16777215 664 | 665 | 666 | 667 | 668 | 0 669 | 0 670 | 671 | 672 | 673 | 674 | 9 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 0 685 | 0 686 | 687 | 688 | 689 | 690 | 0 691 | 0 692 | 693 | 694 | 695 | 696 | 16777215 697 | 16777215 698 | 699 | 700 | 701 | 702 | 0 703 | 0 704 | 705 | 706 | 707 | 708 | 9 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 0 719 | 0 720 | 721 | 722 | 723 | 724 | 0 725 | 0 726 | 727 | 728 | 729 | 730 | 16777215 731 | 16777215 732 | 733 | 734 | 735 | 736 | 0 737 | 0 738 | 739 | 740 | 741 | 742 | 9 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 0 758 | 0 759 | 760 | 761 | 762 | 763 | 225 764 | 769 765 | 766 | 767 | 768 | 769 | 225 770 | 524287 771 | 772 | 773 | 774 | 775 | 9 776 | 777 | 778 | 779 | 780 | 781 | 782 | false 783 | 784 | 785 | Qt::LeftDockWidgetArea|Qt::RightDockWidgetArea 786 | 787 | 788 | Settings 789 | 790 | 791 | 2 792 | 793 | 794 | 795 | 796 | 0 797 | 798 | 799 | 0 800 | 801 | 802 | 803 | 804 | 805 | 0 806 | 0 807 | 808 | 809 | 810 | 811 | 0 812 | 0 813 | 814 | 815 | 816 | 817 | 9 818 | 819 | 820 | 821 | 822 | 823 | 824 | QFrame::NoFrame 825 | 826 | 827 | QFrame::Plain 828 | 829 | 830 | 831 | 0 832 | 833 | 834 | 2 835 | 836 | 837 | 2 838 | 839 | 840 | 841 | 842 | 843 | 0 844 | 0 845 | 846 | 847 | 848 | 849 | 0 850 | 0 851 | 852 | 853 | 854 | 855 | 9 856 | 857 | 858 | 859 | 860 | 861 | 862 | QFrame::WinPanel 863 | 864 | 865 | QFrame::Raised 866 | 867 | 868 | 869 | 870 | 871 | 872 | 0 873 | 0 874 | 875 | 876 | 877 | 878 | 0 879 | 0 880 | 881 | 882 | 883 | 884 | 9 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | START 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 0 906 | 0 907 | 908 | 909 | 910 | 911 | 0 912 | 0 913 | 914 | 915 | 916 | 917 | 9 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | STOP 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 0 942 | 0 943 | 944 | 945 | 946 | 947 | 0 948 | 0 949 | 950 | 951 | 952 | 953 | 9 954 | 955 | 956 | 957 | 958 | 959 | 960 | QFrame::StyledPanel 961 | 962 | 963 | QFrame::Raised 964 | 965 | 966 | 967 | 968 | 969 | 970 | 0 971 | 0 972 | 973 | 974 | 975 | 976 | 0 977 | 0 978 | 979 | 980 | 981 | 982 | 9 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | QFrame::NoFrame 993 | 994 | 995 | QFrame::Plain 996 | 997 | 998 | -5 999 | 1000 | 1001 | Jobfile: 1002 | 1003 | 1004 | false 1005 | 1006 | 1007 | Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 1008 | 1009 | 1010 | 0 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 0 1019 | 0 1020 | 1021 | 1022 | 1023 | 1024 | 0 1025 | 0 1026 | 1027 | 1028 | 1029 | 1030 | 9 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | Browse 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | true 1047 | 1048 | 1049 | false 1050 | 1051 | 1052 | false 1053 | 1054 | 1055 | false 1056 | 1057 | 1058 | false 1059 | 1060 | 1061 | false 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 0 1070 | 0 1071 | 1072 | 1073 | 1074 | 1075 | 0 1076 | 0 1077 | 1078 | 1079 | 1080 | 1081 | 9 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 1088 | true 1089 | 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 0 1097 | 0 1098 | 1099 | 1100 | 1101 | 1102 | 0 1103 | 0 1104 | 1105 | 1106 | 1107 | 1108 | 9 1109 | 1110 | 1111 | 1112 | 1113 | 1114 | 1115 | false 1116 | 1117 | 1118 | true 1119 | 1120 | 1121 | 1122 | 1123 | 1124 | 1125 | 1126 | 0 1127 | 0 1128 | 1129 | 1130 | 1131 | 1132 | 0 1133 | 0 1134 | 1135 | 1136 | 1137 | 1138 | 9 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | QFrame::NoFrame 1149 | 1150 | 1151 | QFrame::Plain 1152 | 1153 | 1154 | 0 1155 | 1156 | 1157 | 0 1158 | 1159 | 1160 | FIO arguments: 1161 | 1162 | 1163 | 1164 | 1165 | 1166 | 1167 | 1168 | 0 1169 | 0 1170 | 1171 | 1172 | 1173 | 1174 | 0 1175 | 0 1176 | 1177 | 1178 | 1179 | 1180 | 9 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | 1190 | 1191 | 1192 | 1193 | 1194 | 1195 | 0 1196 | 0 1197 | 1198 | 1199 | 1200 | 1201 | 0 1202 | 0 1203 | 1204 | 1205 | 1206 | 1207 | 9 1208 | 1209 | 1210 | 1211 | 1212 | 1213 | 1214 | 1 1215 | 1216 | 1217 | true 1218 | 1219 | 1220 | false 1221 | 1222 | 1223 | false 1224 | 1225 | 1226 | false 1227 | 1228 | 1229 | 1230 | Read 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | 0 1238 | 0 1239 | 1240 | 1241 | 1242 | 1243 | 0 1244 | 0 1245 | 1246 | 1247 | 1248 | 1249 | 9 1250 | 1251 | 1252 | 1253 | QFrame::Box 1254 | 1255 | 1256 | QFrame::Plain 1257 | 1258 | 1259 | 1260 | 1261 | 1262 | 1263 | 0 1264 | 0 1265 | 1266 | 1267 | 1268 | 1269 | 0 1270 | 0 1271 | 1272 | 1273 | 1274 | 1275 | 9 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | Read IOPS 1283 | 1284 | 1285 | 1286 | 1287 | 1288 | true 1289 | 1290 | 1291 | false 1292 | 1293 | 1294 | false 1295 | 1296 | 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | 0 1303 | 0 1304 | 1305 | 1306 | 1307 | 1308 | 0 1309 | 0 1310 | 1311 | 1312 | 1313 | 1314 | 9 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | 1321 | Total 1322 | 1323 | 1324 | 1325 | 1326 | 1327 | true 1328 | 1329 | 1330 | 1331 | 1332 | 1333 | 1334 | 1335 | 0 1336 | 0 1337 | 1338 | 1339 | 1340 | 1341 | 0 1342 | 0 1343 | 1344 | 1345 | 1346 | 1347 | 9 1348 | 1349 | 1350 | 1351 | 1352 | 1353 | 1354 | All 1355 | 1356 | 1357 | 1358 | 1359 | 1360 | false 1361 | 1362 | 1363 | 1364 | 1365 | 1366 | 1367 | 1368 | 1369 | 1370 | 1371 | 0 1372 | 0 1373 | 1374 | 1375 | 1376 | 1377 | 0 1378 | 0 1379 | 1380 | 1381 | 1382 | 1383 | 9 1384 | 1385 | 1386 | 1387 | QFrame::Box 1388 | 1389 | 1390 | QFrame::Plain 1391 | 1392 | 1393 | 1394 | 1395 | 1396 | 1397 | 0 1398 | 0 1399 | 1400 | 1401 | 1402 | 1403 | 0 1404 | 0 1405 | 1406 | 1407 | 1408 | 1409 | 9 1410 | 1411 | 1412 | 1413 | 1414 | 1415 | 1416 | Read BW 1417 | 1418 | 1419 | 1420 | 1421 | 1422 | true 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | 1429 | 1430 | 0 1431 | 0 1432 | 1433 | 1434 | 1435 | 1436 | 0 1437 | 0 1438 | 1439 | 1440 | 1441 | 1442 | 9 1443 | 1444 | 1445 | 1446 | 1447 | 1448 | 1449 | Total 1450 | 1451 | 1452 | 1453 | 1454 | 1455 | true 1456 | 1457 | 1458 | 1459 | 1460 | 1461 | 1462 | 1463 | 0 1464 | 0 1465 | 1466 | 1467 | 1468 | 1469 | 0 1470 | 0 1471 | 1472 | 1473 | 1474 | 1475 | 9 1476 | 1477 | 1478 | 1479 | 1480 | 1481 | 1482 | All 1483 | 1484 | 1485 | 1486 | 1487 | 1488 | 1489 | 1490 | 1491 | 1492 | 1493 | 1494 | 1495 | 1496 | 0 1497 | 0 1498 | 1499 | 1500 | 1501 | 1502 | 0 1503 | 0 1504 | 1505 | 1506 | 1507 | 1508 | 9 1509 | 1510 | 1511 | 1512 | QFrame::Box 1513 | 1514 | 1515 | QFrame::Plain 1516 | 1517 | 1518 | 1519 | 1520 | 1521 | 1522 | 0 1523 | 0 1524 | 1525 | 1526 | 1527 | 1528 | 0 1529 | 0 1530 | 1531 | 1532 | 1533 | 1534 | 9 1535 | 1536 | 1537 | 1538 | 1539 | 1540 | 1541 | Read LAT 1542 | 1543 | 1544 | 1545 | 1546 | 1547 | true 1548 | 1549 | 1550 | 1551 | 1552 | 1553 | 1554 | true 1555 | 1556 | 1557 | 1558 | 0 1559 | 0 1560 | 1561 | 1562 | 1563 | 1564 | 0 1565 | 0 1566 | 1567 | 1568 | 1569 | 1570 | 9 1571 | 1572 | 1573 | 1574 | 1575 | 1576 | 1577 | Peak 1578 | (max of 1579 | clat_max) 1580 | 1581 | 1582 | 1583 | 1584 | 1585 | false 1586 | 1587 | 1588 | 1589 | 1590 | 1591 | 1592 | 1593 | 0 1594 | 0 1595 | 1596 | 1597 | 1598 | 1599 | 0 1600 | 0 1601 | 1602 | 1603 | 1604 | 1605 | 9 1606 | 1607 | 1608 | 1609 | 1610 | 1611 | 1612 | All clat_avg 1613 | 1614 | 1615 | 1616 | 1617 | 1618 | true 1619 | 1620 | 1621 | 1622 | 1623 | read_lat_threads_checkbox 1624 | read_lat_max_checkbox 1625 | read_lat_checkbox 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | Write 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 0 1640 | 0 1641 | 1642 | 1643 | 1644 | 1645 | 0 1646 | 0 1647 | 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | QFrame::Box 1654 | 1655 | 1656 | QFrame::Plain 1657 | 1658 | 1659 | 1660 | 1661 | 1662 | 1663 | 0 1664 | 0 1665 | 1666 | 1667 | 1668 | 1669 | 0 1670 | 0 1671 | 1672 | 1673 | 1674 | 1675 | 9 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 | 1683 | 1684 | 1685 | Write IOPS 1686 | 1687 | 1688 | true 1689 | 1690 | 1691 | 1692 | 1693 | 1694 | 1695 | 1696 | 0 1697 | 0 1698 | 1699 | 1700 | 1701 | 1702 | 0 1703 | 0 1704 | 1705 | 1706 | 1707 | 1708 | 9 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 1718 | Total 1719 | 1720 | 1721 | true 1722 | 1723 | 1724 | 1725 | 1726 | 1727 | 1728 | 1729 | 0 1730 | 0 1731 | 1732 | 1733 | 1734 | 1735 | 0 1736 | 0 1737 | 1738 | 1739 | 1740 | 1741 | 9 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 1749 | 1750 | 1751 | All 1752 | 1753 | 1754 | 1755 | 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 0 1763 | 0 1764 | 1765 | 1766 | 1767 | 1768 | 0 1769 | 0 1770 | 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | QFrame::Box 1777 | 1778 | 1779 | QFrame::Plain 1780 | 1781 | 1782 | 1783 | 1784 | 1785 | 1786 | 0 1787 | 0 1788 | 1789 | 1790 | 1791 | 1792 | 0 1793 | 0 1794 | 1795 | 1796 | 1797 | 1798 | 9 1799 | 1800 | 1801 | 1802 | 1803 | 1804 | 1805 | 1806 | 1807 | 1808 | Write BW 1809 | 1810 | 1811 | true 1812 | 1813 | 1814 | 1815 | 1816 | 1817 | 1818 | 1819 | 0 1820 | 0 1821 | 1822 | 1823 | 1824 | 1825 | 0 1826 | 0 1827 | 1828 | 1829 | 1830 | 1831 | 9 1832 | 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | 1839 | 1840 | 1841 | Total 1842 | 1843 | 1844 | true 1845 | 1846 | 1847 | 1848 | 1849 | 1850 | 1851 | 1852 | 0 1853 | 0 1854 | 1855 | 1856 | 1857 | 1858 | 0 1859 | 0 1860 | 1861 | 1862 | 1863 | 1864 | 9 1865 | 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | All 1875 | 1876 | 1877 | 1878 | 1879 | 1880 | 1881 | 1882 | 1883 | 1884 | 1885 | 0 1886 | 0 1887 | 1888 | 1889 | 1890 | 1891 | 0 1892 | 0 1893 | 1894 | 1895 | 1896 | 1897 | 1898 | 1899 | QFrame::Box 1900 | 1901 | 1902 | QFrame::Plain 1903 | 1904 | 1905 | 1906 | 1907 | 1908 | 1909 | 0 1910 | 0 1911 | 1912 | 1913 | 1914 | 1915 | 0 1916 | 0 1917 | 1918 | 1919 | 1920 | 1921 | 9 1922 | 1923 | 1924 | 1925 | 1926 | 1927 | 1928 | 1929 | 1930 | 1931 | Write LAT 1932 | 1933 | 1934 | true 1935 | 1936 | 1937 | 1938 | 1939 | 1940 | 1941 | 1942 | 0 1943 | 0 1944 | 1945 | 1946 | 1947 | 1948 | 0 1949 | 0 1950 | 1951 | 1952 | 1953 | 1954 | 9 1955 | 1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 1964 | Peak 1965 | (max of 1966 | clat_max) 1967 | 1968 | 1969 | false 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 0 1978 | 0 1979 | 1980 | 1981 | 1982 | 1983 | 0 1984 | 0 1985 | 1986 | 1987 | 1988 | 1989 | 9 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | All clat_avg 2000 | 2001 | 2002 | true 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | Settings 2022 | 2023 | 2024 | 2025 | 2026 | Plot Area 2027 | 2028 | 2029 | 2030 | 2031 | 2032 | 2033 | PlotWidget 2034 | QGraphicsView 2035 |
pyqtgraph
2036 |
2037 |
2038 | 2039 | 2040 |
2041 | -------------------------------------------------------------------------------- /realtime_back.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | from select import select 3 | import subprocess 4 | import os 5 | import signal 6 | import itertools 7 | import threading 8 | import shlex 9 | import sys 10 | import time 11 | 12 | def start_fio(path, client, storage, exit_code): 13 | fio_args = list() 14 | fio_args.append("fio") 15 | remote_server = "" 16 | if client: 17 | fio_args.append("--client=" + client) 18 | fio_args.append("--output-format=terse") 19 | fio_args.append("--terse-version=3") 20 | fio_args.append("--eta=never") 21 | fio_args.append("--status-interval=1") 22 | fio_args.append(path) 23 | fio_process = subprocess.Popen(fio_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, preexec_fn=os.setpgrp) 24 | parsing_thread = threading.Thread(target=lambda: parse_fio_output(storage[0]['all'], storage[1]['all'], storage[2]['all'], storage[3]['all'], storage[4]['all'], storage[5]['all'], storage[0]['job_vals'], storage[1]['job_vals'], storage[2]['job_vals'], storage[3]['job_vals'], storage[4]['job_vals'], storage[5]['job_vals'], fio_process, get_jobs(path), exit_code), args=()) 25 | return parsing_thread, fio_process 26 | 27 | def parse_fio_output(riops, rbw, rlat, wiops, wbw, wlat, job_riops, job_rbw, job_rlat, job_wiops, job_wbw, job_wlat, fio_process, numjobs, exit_code): 28 | cur_job = 0 29 | while fio_process.poll() == None: 30 | try: 31 | if cur_job < numjobs: 32 | output = fio_process.stdout.readline() 33 | if not output.startswith("3;"): 34 | continue 35 | split = output.split(';') 36 | if len(split) < 129: 37 | continue 38 | job_riops[cur_job].append(int(split[7])) 39 | job_rbw[cur_job].append(int(split[6])) 40 | job_rlat[cur_job].append(float(split[15])) 41 | job_wiops[cur_job].append(float(split[48])) 42 | job_wbw[cur_job].append(int(split[47])) 43 | job_wlat[cur_job].append(float(split[56])) 44 | cur_job+=1 45 | elif cur_job == numjobs: 46 | cur_job = 0 47 | riops_tot = 0 48 | rbw_tot = 0 49 | wiops_tot = 0 50 | wbw_tot = 0 51 | w_lat_tmp = [] 52 | r_lat_tmp = [] 53 | 54 | for i in range(0, numjobs): 55 | r_lat_tmp.append(job_rlat[i][-1]) 56 | w_lat_tmp.append(job_wlat[i][-1]) 57 | riops_tot+=job_riops[i][-1] 58 | rbw_tot+=job_rbw[i][-1] 59 | wiops_tot+=job_wiops[i][-1] 60 | wbw_tot+=job_wbw[i][-1] 61 | riops.append(riops_tot) 62 | rbw.append(rbw_tot) 63 | rlat.append(max(r_lat_tmp)) 64 | wiops.append(wiops_tot) 65 | wbw.append(wbw_tot) 66 | wlat.append(max(w_lat_tmp)) 67 | 68 | except IndexError: 69 | poll_res = fio_process.poll() 70 | if poll_res != None: 71 | exit_code[0] = poll_res 72 | return poll_res 73 | 74 | def get_jobs(path): 75 | if path.endswith('ini'): 76 | cmds = subprocess.Popen(['fio', '--showcmd', path], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0].decode('utf-8').split(' --') 77 | for cmd in cmds: 78 | if cmd.startswith('numjobs'): 79 | return int(cmd.split('=')[1]) 80 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [bdist_wheel] 2 | # This flag says that the code is written to work on both Python 2 and Python 3 | # 3. If at all possible, it is good practice to do this. If you cannot, you 4 | # will need to generate wheels for each Python version that you support. 5 | universal=1 6 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | """\ 2 | Fio-Visualizer is a data visualization tool for FIO written in PyQtGraph. 3 | 4 | It requires to be run on behalf of the root user, since it requires to access 5 | block devices. 6 | """ 7 | 8 | # Always prefer setuptools over distutils 9 | from setuptools import setup, find_packages 10 | # To use a consistent encoding 11 | from codecs import open 12 | from os import path 13 | 14 | here = path.abspath(path.dirname(__file__)) 15 | 16 | # Get the long description from the relevant file 17 | with open(path.join(here, 'DESCRIPTION.rst'), encoding='utf-8') as f: 18 | long_description = f.read() 19 | 20 | setup( 21 | name='Fio-Visualizer', 22 | 23 | # Versions should comply with PEP440. For a discussion on single-sourcing 24 | # the version across setup.py and the project code, see 25 | # https://packaging.python.org/en/latest/single_source_version.html 26 | version='1.0', 27 | 28 | description='Data visualization tool for FIO', 29 | long_description=long_description, 30 | 31 | # The project's main homepage. 32 | url='http://01.org/fio-visualizer', 33 | 34 | # Author details 35 | author='Andrey Kudryavtsev', 36 | author_email='andrey.o.kudryavtsev@intel.com', 37 | 38 | # Choose your license 39 | license='intel', 40 | 41 | # See https://pypi.python.org/pypi?%3Aaction=list_classifiers 42 | classifiers=[ 43 | # How mature is this project? Common values are 44 | # 3 - Alpha 45 | # 4 - Beta 46 | # 5 - Production/Stable 47 | 'Development Status :: 4 - Beta', 48 | 49 | # Indicate who your project is intended for 50 | 'Intended Audience :: Science/Research', 51 | 'Topic :: Scientific Engineering :: Information Analysis', 52 | 53 | # Pick your license as you wish (should match "license" above) 54 | 'License :: OSI Approved :: Intel Open Source License', 55 | 56 | # Specify the Python versions you support here. In particular, ensure 57 | # that you indicate whether you support Python 2, Python 3 or both. 58 | 'Programming Language :: Python :: 2', 59 | 'Programming Language :: Python :: 2.6', 60 | 'Programming Language :: Python :: 2.7', 61 | 'Programming Language :: Python :: 3', 62 | 'Programming Language :: Python :: 3.2', 63 | 'Programming Language :: Python :: 3.3', 64 | 'Programming Language :: Python :: 3.4', 65 | ], 66 | 67 | # What does your project relate to? 68 | keywords='fio virtualization', 69 | 70 | # You can just specify the packages manually here if your project is 71 | # simple. Or you can use find_packages(). 72 | packages=['fiovisualizer'], 73 | #packages=find_packages('.'), 74 | #packages=find_packages(exclude=['tests*']), 75 | #package_dir={'': '.'}, 76 | 77 | # List run-time dependencies here. These will be installed by pip when 78 | # your project is installed. For an analysis of "install_requires" vs pip's 79 | # requirements files see: 80 | # https://packaging.python.org/en/latest/requirements.html 81 | #install_requires=['peppercorn'], 82 | 83 | # List additional groups of dependencies here (e.g. development 84 | # dependencies). You can install these using the following syntax, 85 | # for example: 86 | # $ pip install -e .[dev,test] 87 | #extras_require={ 88 | # 'dev': ['check-manifest'], 89 | # 'test': ['coverage'], 90 | #}, 91 | 92 | # If there are data files included in your packages that need to be 93 | # installed, specify them here. If using Python 2.6 or less, then these 94 | # have to be included in MANIFEST.in as well. 95 | package_data={ 96 | 'fiovisualizer': ['fio_visualizer.py', 'mainwindow.ui', 'Workloads/*/*'], 97 | }, 98 | 99 | # Although 'package_data' is the preferred approach, in some case you may 100 | # need to place data files outside of your packages. See: 101 | # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa 102 | # In this case, 'data_file' will be installed into '/my_data' 103 | #data_files=[('fio-visualizer.py', 'mainwindow.ui', 'README.txt', 'LICENSE.txt')], 104 | 105 | # To provide executable scripts, use entry points in preference to the 106 | # "scripts" keyword. Entry points provide cross-platform support and allow 107 | # pip to create the appropriate form of executable for the target platform. 108 | entry_points={ 109 | 'console_scripts': [ 110 | 'fio-visualizer=fiovisualizer.fio_visualizer:main', 111 | ], 112 | }, 113 | ) 114 | --------------------------------------------------------------------------------