Showing preview only (1,226K chars total). Download the full file or copy to clipboard to get everything.
Repository: facebookincubator/FioSynth
Branch: main
Commit: 9ae3678affe2
Files: 274
Total size: 1.1 MB
Directory structure:
gitextract_t0n2pfi3/
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── README-READHAMMER.txt
├── README.md
├── Release_Notes.txt
├── fiosynth.py
├── fiosynth_lib/
│ ├── __init__.py
│ ├── fio_json_parser.py
│ ├── fiosynth.py
│ ├── flash_config.py
│ └── health_tools.py
├── jobfiles/
│ ├── 70_30.fio
│ ├── 70_30_HE.fio
│ ├── 70_30_LE.fio
│ ├── 70_30_io_uring.fio
│ ├── 70_30_libfio_ws.fio
│ ├── DRAMwTRIM.fio
│ ├── FLeaf_noTRIM.fio
│ ├── FLeaf_wTRIM.fio
│ ├── FLeaf_wTRIM_1H22.fio
│ ├── FLeaf_wTRIM_1H25.fio
│ ├── FLeaf_wTRIM_2H19.fio
│ ├── HDD_70_30.fio
│ ├── HDD_randread.fio
│ ├── HDD_randwrite.fio
│ ├── HDD_seqread.fio
│ ├── HDD_seqwrite.fio
│ ├── Max_Latency_ReadTrim.fio
│ ├── Max_Latency_write.fio
│ ├── MyRocks_noTRIM.fio
│ ├── MyRocks_noTRIM_2H19.fio
│ ├── MyRocks_wTRIM.fio
│ ├── MyRocks_wTRIM_1H22.fio
│ ├── MyRocks_wTRIM_1H25.fio
│ ├── MyRocks_wTRIM_2H19.fio
│ ├── RR_SW_HE.fio
│ ├── RR_SW_LE.fio
│ ├── TypeVI.fio
│ ├── TypeVI90.fio
│ ├── TypeVI90_precon.fio
│ ├── TypeVIII_Messenger_Movement.fio
│ ├── TypeVIII_Messenger_Movement_precon.fio
│ ├── TypeVIII_Messenger_Movement_wTRIM.fio
│ ├── TypeVIII_Messenger_Movement_wTRIM_precon.fio
│ ├── TypeVI_Read.fio
│ ├── TypeVI_Read_1H22.fio
│ ├── TypeVIwTRIM.fio
│ ├── TypeVIwTRIM_1H22.fio
│ ├── TypeVIwTRIM_1H22_IOPS.fio
│ ├── TypeVIwTRIM_1H25.fio
│ ├── TypeVIwTRIM_2H19.fio
│ ├── TypeVIwTRIM_SIT.fio
│ ├── TypeVIwTRIM_precon.fio
│ ├── TypeVIwTRIM_precon_1H22.fio
│ ├── TypeVIwTRIM_precon_1H25.fio
│ ├── backup.fio
│ ├── backup_write_journal.fio
│ ├── bcache.fio
│ ├── bcache_1H22.fio
│ ├── bcache_1H25.fio
│ ├── bursttrim.fio
│ ├── coldstorage.fio
│ ├── drive_fill.fio
│ ├── gen.fio
│ ├── gen_prep_flash.fio
│ ├── gen_randread.fio
│ ├── gen_randrw.fio
│ ├── gen_randrw_70_30.fio
│ ├── gen_randwrite.fio
│ ├── gen_read.fio
│ ├── gen_write.fio
│ ├── idyno.fio
│ ├── idyno_sweep.fio
│ ├── neargpu_tlc_ssd.fio
│ ├── prep.fio
│ ├── prep_flash.fio
│ ├── prep_flash_io_uring.fio
│ ├── prep_flash_io_uring_1H25.fio
│ ├── prep_flash_rand.fio
│ ├── prep_flash_rand_io_uring.fio
│ ├── prep_flash_rand_libfio_ws.fio
│ ├── prep_io_uring.fio
│ ├── prep_libfio_ws.fio
│ ├── prep_neargpu_rand_write.fio
│ ├── prep_neargpu_seq_write.fio
│ ├── prep_rand.fio
│ ├── randread.fio
│ ├── randread_io_uring.fio
│ ├── randread_io_uring_1H26.fio
│ ├── randread_libfio_ws.fio
│ ├── randwrite.fio
│ ├── randwrite_io_uring.fio
│ ├── randwrite_libfio_ws.fio
│ ├── readhammer.fio
│ ├── rsw_burst.fio
│ ├── rsw_cp.fio
│ ├── rsw_cp_precon.fio
│ ├── rsw_cp_vtrim.fio
│ ├── rsw_cp_wtrim.fio
│ ├── search2.fio
│ ├── search3.fio
│ ├── searchdoc_noTRIM.fio
│ ├── searchdoc_wTRIM.fio
│ ├── searchindex_noTRIM.fio
│ ├── searchindex_wTRIM.fio
│ ├── searchindex_wTRIM_1H22.fio
│ ├── searchindex_wTRIM_1H25.fio
│ ├── searchlm_wTRIM.fio
│ ├── searchlm_wTRIM_1H22.fio
│ ├── searchlm_wTRIM_1H25.fio
│ ├── seqread.fio
│ ├── seqread_io_uring.fio
│ ├── seqread_libfio_ws.fio
│ ├── seqwrite.fio
│ ├── seqwrite_io_uring.fio
│ ├── seqwrite_libfio_ws.fio
│ ├── seqwrite_write_journal.fio
│ ├── stacking.fio
│ ├── trim.fio
│ ├── trim_libfio_ws.fio
│ ├── trimrate.fio
│ ├── twfeed.fio
│ ├── twi_iris.fio
│ ├── twi_iris_precon.fio
│ ├── twshared-pkg.fio
│ ├── twshared.fio
│ ├── udb_boot.fio
│ ├── wildcard.fio
│ ├── wildcard_normal.fio
│ ├── writehammer.fio
│ ├── ws_hxfs_hdd.fio
│ ├── ws_hxfs_hdd_heavy.fio
│ ├── ws_hxfs_ssd.fio
│ ├── ws_xfs_hdd.fio
│ ├── wscache_1H22.fio
│ ├── wscache_1H25.fio
│ ├── wsf-laser-ro_2H22.fio
│ ├── wsf-t.fio
│ ├── wsf-tl.fio
│ ├── wsf-tl_1H22.fio
│ ├── wsf-tl_1H25.fio
│ └── wsf-tl_2H21.fio
├── setup.cfg
├── setup.py
├── smartAll.sh
├── test-requirements.txt
├── tests/
│ ├── __init__.py
│ ├── sample_fio_results/
│ │ ├── sample-2017-11-21_16-40.csv
│ │ ├── sample_1_run1.json
│ │ └── sample_2_run1.json
│ └── test_fio_json_parser.py
├── tmp.fio
├── tox.ini
└── wkldsuites/
├── ALL_512K_Writes_wTRIM
├── ALL_Reads
├── Boot_SSD
├── BurstTrim
├── Cache
├── Cache_1H22
├── Cache_1H25
├── Cache_2H20
├── Cache_Sweep
├── Cache_Sweep_1H22
├── Cache_Sweep_1H25
├── Drive_fill
├── Fio_4C
├── Fio_4C_boot
├── HDDPeakWklds
├── HE_Flash
├── HE_Flash_Short
├── HE_Flash_Short_90
├── HE_Flash_Short_noTRIM
├── HE_Flash_Short_wTRIM
├── HE_Flash_Short_wTRIM_1H20
├── HE_Flash_Short_wTRIM_1H22
├── HE_Flash_Short_wTRIM_1H22_HW_char_9DWPD_highBW_gen5
├── HE_Flash_Short_wTRIM_1H22_HW_char_9DWPD_highBW_gen5_IOPS
├── HE_Flash_Short_wTRIM_1H25
├── HE_Flash_Short_wTRIM_2H19
├── HE_Flash_Short_wTRIM_2H20
├── HE_Flash_Short_wTRIM_RAM
├── HE_Flash_Short_wTRIM_SIT
├── HE_Flash_Short_wTRIM_Sweep
├── HE_Flash_Short_wTRIM_Sweep_1H22
├── HE_Flash_Short_wTRIM_Sweep_1H25
├── HE_Flash_noTRIM
├── HE_Flash_wTRIM
├── Idyno_Boot
├── Idyno_Boot_Full_Sweep
├── LE_Flash
├── LE_Flash_Short
├── LE_Flash_Short_wTRIM
├── LE_Flash_Short_wTRIM_SIT
├── LE_Flash_Single
├── Low_Latency_Short_wTRIM
├── Messenger_Movement_noTRIM
├── Messenger_Movement_wTRIM
├── MyRocks
├── MyRocks_Full_Sweep
├── MyRocks_Full_Sweep_1H22
├── NearGPU_16TB_2H27_4K
├── NearGPU_16TB_2H27_512B
├── NearGPU_2H26_4K
├── NearGPU_2H26_512B
├── NearGPU_8TB_2H27_4K
├── NearGPU_8TB_2H27_512B
├── Nvme_Cli_Wkld
├── PeakWklds
├── PeakWklds_1H22
├── PeakWklds_1H26
├── PeakWklds_Libfio_Ws
├── PeakWklds_RAM
├── RAIDPeakWklds
├── RSC_Sweep_1H24
├── RTL
├── RandRW_70_30_Fio4C
├── RandRW_Fio4C
├── RandRead_Fio4C
├── RandWrite_Fio4C
├── Read_Fio4C
├── Read_Write
├── Rsw_Cp
├── Rsw_Cp_wTRIM
├── Search
├── Search_1H22
├── Search_1H22_hw_char_gen5
├── Search_1H25
├── Search_2H19
├── Search_2H20
├── Search_Full_Sweep
├── Search_Full_Sweep_1H22
├── Search_Sweep
├── Search_Sweep_1H22
├── Search_Sweep_1H25
├── SpinCycle
├── SpinCycleFlash
├── SpinCycle_1H25
├── Stacking
├── TrimRate
├── Twfeed_Boot
├── Twi_Iris
├── Twshared_Boot
├── Twshared_Pkg_Boot
├── Twshared_Pkg_Boot_Full_Sweep
├── UBOOTT_Workload_loop
├── UDB_Boot
├── USSDT_Workload_loop
├── USSDT_Workload_loop_OCP2.6
├── WSCACHE_1H22
├── WSCACHE_1H25
├── WSCache_WSF_Stress
├── WSF
├── WSF_1H22
├── WSF_1H25
├── WSF_2H21
├── WSF_2H21_8TB
├── WSF_LASER_RO_2H22
├── Warmstorage_HDD
├── Warmstorage_HXFS_HDD
├── Warmstorage_HXFS_SSD
├── Wedge_Boot
├── Wildcard
├── Wildcard_Normal
├── Write_Fio4C
├── backup
├── iocost
├── precondition_full
├── prep
├── readhammer
├── write_journal
└── writehammer
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.py[cod]
# C extensions
*.so
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# Distribution / packaging
.Python
env/
bin/
build/
develop-eggs/
dist/
eggs/
lib/
lib64/
lib64
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
pyvenv.cfg
pip-selfcheck.json
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Sphinx documentation
docs/_build/
.mr.developer.cfg
.project
.idea
.pydevproject
*.swp
# Mac Desktop Service Store
*.DS_Store
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full text](https://code.facebook.com/codeofconduct) so that you can understand what actions will and will not be tolerated.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to fiosynth
We want to make contributing to this project as easy and transparent as
possible.
## Code of Conduct
The code of conduct is described in [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md).
## Our Development Process
### Unit Tests
```
$ pip install tox
$ tox
```
Note: You may require `sudo` if installing to System's Python environment
## Pull Requests
We actively welcome your pull requests.
1. Fork the repo and create your branch from `main`.
2. If you've added code that should be tested, add tests.
3. If you've changed APIs, update the documentation.
4. Ensure the test suite passes.
5. Make sure your code lints.
6. If you haven't already, complete the Contributor License Agreement ("CLA").
## Contributor License Agreement ("CLA")
In order to accept your pull request, we need you to submit a CLA. You only need
to do this once to work on any of Facebook's open source projects.
Complete your CLA here: <https://code.facebook.com/cla>
## Issues
We use GitHub issues to track public bugs. Please ensure your description is
clear and has sufficient instructions to be able to reproduce the issue.
Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe
disclosure of security bugs. In those cases, please go through the process
outlined on that page and do not file a public issue.
## Coding Style
* 4 spaces for indentation rather than tabs
* 80 character line length
* pep8
## License
By contributing to fiosynth, you agree that your contributions will be licensed
under the LICENSE file in the root directory of this source tree.
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) Facebook, Inc. and its affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: MANIFEST.in
================================================
include CODE_OF_CONDUCT.md
include CONTRIBUTING.md
include LICENSE
include README-READHAMMER.txt
include Release_Notes.txt
include smartAll.sh
recursive-include jobfiles *
recursive-include wkldsuites *
================================================
FILE: README-READHAMMER.txt
================================================
Currently the read hammer test will run for 14 days ( 336 hours) after the SSDs
are prepared. Increase the number of run cycles in the "readhammer" workload
profile file to run the test for longer.
Use the following steps to run the readhammer test.
1. Precondition a single device:
fb-FioSynthFlash -d /dev/sdc -w prep -f precondition
or
Precondition all devices:
fb-FioSynthFlash -d ALL -w prep -f precondition
2. Run readhammer test on a single device:
fb-FioSynthFlash -d /dev/sdc -w readhammer -f readhammer
or
Run readhammer test on all devices:
fb-FioSynthFlash -d ALL -w readhammer -f readhammer
3. All results are stored in a .csv file in the specified results directory.
Note: If you are running the read hammer test on more than one device, it
is recommended to increase the maximum number of active aio contexts.
echo "262144" > /proc/sys/fs/aio-max-nr
License
Copyright (c) Facebook, Inc. and its affiliates.
================================================
FILE: README.md
================================================
# fiosynth
FB fio Synthetic Benchmark Suite for Flash ver 3.6.0
## Examples
Run workload suite on a single device:
```
fiosynth -d /dev/sdc -w LE_Flash -f LE_Flash_sdc
```
Run workload suite on all data devices:
```
fiosynth -d ALL -w LE_Flash -f LE_Flash_noRAID
```
Run workload suite on all mdraid devices:
```
fiosynth -d ALLRAID -w LE_Flash -f LE_Flash_MDRAID
```
Run workload suite on all data devices while collecting smartctl logs
```
fiosynth -d ALL -w LE_Flash -f LE_Flash_noRAID -t "./smartAll.sh"
```
Run a dry run of workload suite for all mdraid devices:
```
fiosynth -d ALLRAID -w LE_Flash -f LE_Flash_MDRAID -r y
```
Run a workload suite across multiple servers:
```
fiosynth -d ALL -w LE_Flash -f LE_Flash_server -s <server1> -s <server2>
```
Run a workload suite from a server list:
```
fiosynth -d ALL -w LE_Flash -f LE_Flash_server -l '/path/servers.txt'
```
## Requirements
fiosynth should work
* Linux (CentOS, RedHat, Ubuntu)
## Installing fiosynth
To install fiosynth simply `git clone` this repo and have the latest
versions of pip with setuptools installed
### Installing into Python environment
```
$ git clone https://github.com/facebookincubator/FioSynth
$ sudo apt install python3 python3-pip fio
$ cd FioSynth
$ sudo python3 setup.py install
$ fiosynth -h
```
### Executing fiosynth without installing
Simply execute the `fiosynth.py` entry script.
```
$ cd FioSynth
$ python3 fiosynth.py -h
```
Note: You may require `sudo` if installing to System's Python environment
Note: We recommend using a `virtualenv` to avoid polluting the Systems dependencies.
## How fiosynth works
Requires the use of workload suite files (in JSON format). Workload
suite files can be edited to adjust the number of precondition cycles,
number of runs, number of workloads and individual workload parameters.
Use the dry run option to verify that benchmark suite executes as expected.
All workloads are normalized on a per TB bases. If capacity is not
specified, capacity will be based on capacity of the first specified device.
If specified, a vendor specific health monitor tool will be executed before
and after each benchmark suite executes and logged in "health.log" file.
Log can be used to calculate write amplification factor.
Raw results are stored in individual JSON files but are also parsed into
single a csv file for easy visualization in Excel.
Prefix for result filename must be specified. This will define the name
of the result files directory and csv filename.
```
Input arguments (3 of arguments are required):
-d
(Required) device path for single device target, ALL for all
all data devices, or ALLRAID for all mdraid devices
-w
(Required) filename for workload suite (default = )
-f
(Required) Results filename (default = )
-c
(Optional) specify capacity in TB (default = <device capacity>)
-r
(Optional) Set to y to do dry run (default = n)
-t
(Optional) Enter Health Monitoring Tool Syntax (default = )
-p
(Optional) Set to n to skip drive prep (default = y)
-n
(Optional) Specific the number of run cycles (default = 3 )
-g
(Optional) Set to y to enable flash configuration logging (default = n)
-s
(Optional) Add a server for workload to run on when in server mode.
For multiple servers add multiple times. (default = )
-l
(Optional) Add a text file listing a server on each line (default = )
```
### Workload suites
```
PeakWklds
Executes workloads to measure the peak small block random and large
block sequential performance of a single or multiple flash devices.
LE_Flash
Executes rate limited workloads with similar I/O characteristics to
applications that run on Type VIII (Low Flash) production hardware
on a single or multiple flash devices. Workloads use a combination
of read iops bins (low, medium, high) and write DWPD (Drive Writes
Per Day) bins that correlate to various Type VIII flash application
I/O profiles. Workload alias names are a combination of read I/O
block size, read iops bins and write DWPD bins.
HE_Flash
Executes rate limited workloads with similar I/O characteristics to
applications that run on Type VI and III (High Endurance Flash)
production hardware on a single or multiple flash devices.
Workloads use a combination of read iops bins (low, medium, high)
and write DWPD (Drive Writes Per Day) bins that correlate to various
Type VI flash application I/O profiles. Workload alias names are
a combination of read I/O block size, read iops bins and write DWPD
bins.
TrimRate
Executes a workload that evaluates the raw trim performance of a
flash device.
LE_Flash_Short
Short version of LE_Flash. Executes a limited set of rate limited
workloads to provide a high level view of performance in a few hours.
HE_Flash_Short
Short version of HE_Flash. Executes a limited set of rate limited
workloads to provide a high level view of performance in a few hours.
readhammer
Executes a workload that evaluates a flash device ability to
continually read from a small LBA range on a single or multiple
flash devices.
See README-READHAMMER.txt for more information.
prep
Executes two full capacity writes on a single or multiple flash
devices to get the flash close to steady state.
```
### Creating/Modifying Workload Suites
Workload suites are json formatted files with a list of run rules for fio.
Follow the formatting used in other workload suites. Generally, if all
parameters in the workload suite workload file is note defined, it will
not run.
The following parameters need to be defined globally:
```
run_cycles
Number of times the entire workload suite will run.
precondition_cycles
Number of times the flash will be preconditioned before each
run cycle. A full TRIM of the flash device will complete before
the flash is preconditioned. Each precondition consist of 2 full
sequential writes of the flash device.
devices_in_global
Specifies if the devices should be defined in the global field or
within jobs. Most fio job files should define devices_in_global
parameter to Y and can scale to multiple drives using the numjob fio
parameter. Some jobfiles will not run properly with the devices
defined in the global section. These jobfiles need to create
new job section for each device and the device_in_global parameter
should be set to N.
For more on fio job file format, see section 4 of
https://github.com/axboe/fio/blob/master/HOWTO
```
The following parameters are workload specific:
```
template
Fio jobfile name that should be used.
alias
Name of the workload. Use a name that describes the workload that
is being executed.
TIME
Sets the "runtime" parameter in the fio job file (where applicable).
BLKSIZE
Sets the "blocksize" and "blockalign" parameter in the fio job file
(where applicable).
DEPTH
Sets the "iodepth" parameter in the fio job file (where applicable).
RRATE
Sets the "rate_iops" parameter in the fio job file (where applicable).
SIZE
Sets the "size" parameter in the fio job file (where applicable).
W1THINK, W2THINK, W3THINK & W4THINK
Sets the "thinktime" parameter in the fio job file (where applicable).
W1THINK and W2THINK are the think time in between each write. The smaller
the number, the higher the write rate. 6pDWPD writes at a rate of about
72 MB/s per TB. W3THINK and W4THINK are typically used as the think
time in between each trim command.
```
### Client/Server Mode
To run in client/server mode, ensure that the following requirements are met:
* Both your client and all of your servers must have the same version of fio
* Any devices you want to test on the clients must be unmounted from the
filesystem
* You may want to prepend "nohup" to the command when you call this tool, that
way if your ssh session ends, the test will continue to run on your
devserver.
## Join the fiosynth community
See the CONTRIBUTING file for how to help out.
## License
MIT License
Copyright (c) Facebook, Inc. and its affiliates.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Release_Notes.txt
================================================
Copyright (c) Facebook, Inc. and its affiliates.
Version 3.1 Release Notes
1. Fixed bug in HE Flash workload profile. Data from workloads with 0DWPD are
now correct.
2. Added support for parsing fio TRIM results
3. Added support for parsing fio results without group reporting
4. Multiple json files are now parsed in order.
================================================
FILE: fiosynth.py
================================================
#!/usr/bin/env python3
# Copyright (c) Facebook, Inc. and its affiliates.
#
# AUTHOR = 'Darryl Gardner <darryleg@fb.com>'
#
# fiosynth.py - FB Fio Synthetic Benchmark Suite for Flash ver 3.5.43
#
# Requires the use of workload suite files (in JSON format). Workload
# suite files can be edited to adjust the number of precondition cycles,
# number of runs, number of workloads and individual workload parameters.
# Use the dry run option to verify that benchmark suite executes as expected.
# All workloads are normalized on a per TB bases. If capacity is not
# specified, capacity will be based on capacity of the first specified device.
# If specified, a vendor specific health monitor tool will be executed before
# and after each benchmark suite executes and logged in 'health.log' file.
# Log can be used to calculate write amplification factor.
# Raw results are stored in individual JSON files but are also parsed into
# single a csv file for easy visualization in Excel.
# Prefix for result filename must be specified. This will define the name
# of the result files directory and csv filename.
#
# Input arguments (3 of arguments are required):
# -d
# (Required) device path for single device target, ALL for all
# data devices, or ALLRAID for all mdraid devices
# -w
# (Required) filename for workload suite (default = )
# -f
# (Required) Results filename (default = )
# -c
# (Optional) specify capacity in TB (default = <device capacity>)
# -r
# (Optional) Set to y to do dry run (default = n)
# -t
# (Optional) Enter Health Monitoring Tool Syntax (default = )
# -p
# (Optional) Set to n to skip drive prep (default = y)
# -n
# (Optional) Specific the number of run cycles (default = 3 )
# -g
# (Optional) Set to y to enable flash configuration logging (default = n)
# -s
# (Optional) Set to a server name if you want to run in server mode,
# for multiple servers add multiple times
# -l
# (Optional) Set to name of text file with server name on each line
#
# Example run workload suite on a single device:
# fb-FioSynthFlash -d /dev/sdc -w LE_Flash -f LE_Flash_sdc
#
# Example run workload suite on all data devices:
# fb-FioSynthFlash -d ALL -w LE_Flash -f LE_Flash_noRAID
#
# Example run workload suite on all mdraid devices:
# fb-FioSynthFlash -d ALLRAID -w LE_Flash -f LE_Flash_MDRAID
#
# Example run workload suite across multiple servers:
#
# fb-FioSynthFlash -d ALL -w LE_Flash -f LE_Flash_server_noRAID -s <server>
# -s <otherserver>
#
# pyre-unsafe
from fiosynth_lib import fiosynth
def main() -> None:
fiosynth.main()
if __name__ == "__main__":
main() # pragma: no cover
================================================
FILE: fiosynth_lib/__init__.py
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
# pyre-unsafe
================================================
FILE: fiosynth_lib/fio_json_parser.py
================================================
#!/usr/bin/env python3
# pyre-unsafe
# Copyright (c) Facebook, Inc. and its affiliates.
#
# AUTHOR = 'Darryl Gardner <darryleg@fb.com>'
# fio_json_parser.py - script to parse fio workload results
# produced by fio in JSON format. By default the following values are written
# to a .csv file: Read_IOPS, Read_BW, Write_IOPS, Write_BW, Mean_Read_Latency,
# P50_Read_Latency, P70_Read_Latency, P99_Read_Latency, P99.9_Read_Latency,
# P99.99_Read_Latency, Mean_Write_Latency, P50_Write_Latency,
# P70_Write_Latency, P99_Write_Latency, P99.9_Write_latency,
# P99.99_Write_Latency
#
# input arguments (at least 1 argument is required):
# -j
# single fio JSON file to be parsed (default = )
# -k
# single fio JSON file path (default = .)'
# -n
# file path for multiple fio JSON files (default = )
# -l
# csv file path (default = .)
# -f
# csv file name (default = fio_fb_results.csv)
# -c
# path to directory of csv's from server/client mode that you want to
# combine
#
# example parse a single json file in the the results directory:
# FioFlashJsonParser.py -k results -j 4K_random_read.json results.csv
#
# example parse all json files in 'results' directory:
# FioFlashJsonParser.py -n results -f results.csv
#
# example create combined csv from csvs in a directory:
# FioFlashJsonParser.py -c /some_path/csv_directory
#
# @nolint
import argparse
import csv
import glob
import json
import os
import sys
from collections import OrderedDict
import itertools
TOOL_NAME = "fio-parse-json-flash"
tunnel2host = {}
def set_attributes():
#
# Attribute Table Definition
#
parser = argparse.ArgumentParser(description="fio JSON File Parser for Flash")
parser.add_argument(
"-j",
action="store",
dest="json_file",
type=str,
help="single fio JSON file to be parsed (default = )",
default="",
)
parser.add_argument(
"-k",
action="store",
dest="json_path",
type=str,
help="single fio JSON file path (default = .)",
default=".",
)
parser.add_argument(
"-n",
action="store",
dest="all_json",
type=str,
help="file path for multiple fio JSON files (default = )",
default="",
)
parser.add_argument(
"-l",
action="store",
dest="csv_path",
type=str,
help="csv file path (default = .)",
default=".",
)
parser.add_argument(
"-f",
action="store",
dest="csv_file",
type=str,
help="csv file name (default = fio_fb_results.csv)",
default="fio_fb_results.csv",
)
parser.add_argument(
"-s",
action="store",
dest="serverMode",
type=str,
help="denotes server mode: y for server mode, n for local mode",
default="n",
)
parser.add_argument(
"-c",
action="store",
dest="combine_csv_path",
type=str,
help=(
"path to directory holding multiple csvs from different that "
"will be combined"
),
default="",
)
args = parser.parse_args()
return args
def check_if_mounted(fn):
mounted = False
with open(fn) as f:
for line in f.readlines():
if "appears mounted, and 'allow_mounted_write' isn't set." in line:
print(line)
mounted = True
break
if mounted:
print("To run, please unmount the device and try again")
sys.exit(1)
def read_json(fn, serverMode=False):
data = ""
if not fn:
return None
if not os.path.isfile(fn):
print("%s does not exist" % fn)
sys.exit(1)
check_if_mounted(fn)
f = open(fn)
if serverMode:
f.seek(0)
jsonstr = f.read()
jsonstr = "{" + jsonstr[jsonstr.rfind('"fio version" : ') :]
try:
data = json.loads(jsonstr)
except ValueError:
print("serverMode {}; JSON decoding failed on {}, is file corrupt?".format(serverMode, fn))
f.close()
sys.exit(1)
else:
try:
data = json.load(f)
except ValueError:
print("serverMode {}; JSON decoding failed on {}, now trying to format json before parsing".format(serverMode, fn))
try:
f.seek(0)
jsonstr = f.read()
jsonstr = "{" + jsonstr[jsonstr.rfind('"fio version" : ') :]
data = json.loads(jsonstr)
except:
print("serverMode {}; JSON decoding failed on {}, is file corrupt?".format(serverMode, fn))
f.close()
sys.exit(1)
f.close()
return data
def read_extsmart(filename):
with open(filename) as f:
f_data = f.read()
return f_data
def new_csv(f, notStdPercentile1, notStdPercentile2, add_waf_header, add_lm_header, create_file=True):
if notStdPercentile1 or notStdPercentile2:
col_names = [
"Jobname",
"Read_IOPS",
"Read_BW",
"Write_IOPS",
"Write_BW",
"Trim_IOPS",
"Trim_BW",
"Mean_Read_Latency",
"Max_Read_Latency",
"P25_Read_Latency",
"P50_Read_Latency",
"P70_Read_Latency",
"P75_Read_Latency",
"P90_Read_Latency",
"P99_Read_Latency",
"P99.9_Read_Latency",
"P99.99_Read_Latency",
"P99.999_Read_Latency",
"P99.9999_Read_Latency",
"Mean_Write_Latency",
"Max_Write_Latency",
"P25_Write_Latency",
"P50_Write_Latency",
"P70_Write_Latency",
"P75_Write_Latency",
"P90_Write_Latency",
"P99_Write_Latency",
"P99.9_Write_Latency",
"P99.99_Write_Latency",
"P99.999_Write_Latency",
"P99.9999_Write_Latency",
"Mean_Trim_Latency",
"Max_Trim_Latency",
"P25_Trim_Latency",
"P50_Trim_Latency",
"P70_Trim_Latency",
"P75_Trim_Latency",
"P90_Trim_Latency",
"P99_Trim_Latency",
"P99.9_Trim_Latency",
"P99.99_Trim_Latency",
"P99.999_Trim_Latency",
"P99.9999_Trim_Latency",
]
else:
col_names = [
"Jobname",
"Read_IOPS",
"Read_BW",
"Write_IOPS",
"Write_BW",
"Trim_IOPS",
"Trim_BW",
"Mean_Read_Latency",
"Max_Read_Latency",
"P50_Read_Latency",
"P70_Read_Latency",
"P90_Read_Latency",
"P99_Read_Latency",
"P99.9_Read_Latency",
"P99.99_Read_Latency",
"P99.9999_Read_Latency",
"Mean_Write_Latency",
"Max_Write_Latency",
"P50_Write_Latency",
"P70_Write_Latency",
"P90_Write_Latency",
"P99_Write_Latency",
"P99.9_Write_Latency",
"P99.99_Write_Latency",
"P99.9999_Write_Latency",
"Mean_Trim_Latency",
"Max_Trim_Latency",
"P50_Trim_Latency",
"P70_Trim_Latency",
"P90_Trim_Latency",
"P99_Trim_Latency",
"P99.9_Trim_Latency",
"P99.99_Trim_Latency",
"P99.9999_Trim_Latency",
]
if add_waf_header:
col_names += [
"Total_FIO_Writes",
"Host_Writes_BEFORE",
"Host_Writes_AFTER",
"NAND_Writes_BEFORE",
"NAND_Writes_AFTER",
]
if add_lm_header:
col_names += [
"Max_Read_Latency_Counter_BEFORE",
"Max_Write_Latency_Counter_BEFORE",
"Max_Read_Latency_Measured_BEFORE",
"Max_Write_Latency_Measured_BEFORE",
"Max_Read_Latency_Counter_AFTER",
"Max_Write_Latency_Counter_AFTER",
"Max_Read_Latency_Measured_AFTER",
"Max_Write_Latency_Measured_AFTER",
]
if create_file:
try:
writer = csv.writer(f)
writer.writerow(col_names)
except OSError:
print("cannot write to ", f)
f.close()
sys.exit(1)
return col_names
def get_csv_line(jobname, json, index, data, version_str, serverMode, scale_by_TB=1):
clat = "clat"
con = 1
# clat -> clat_ns in version 3.0
clat = "clat_ns"
# convert nanoseconds to microseconds
con = 1000
if serverMode:
# Support for older and newer fio json formats
options1 = "percentile_list" in json["job options"]
options2 = "percentile_list" in json["global options"]
else:
options1 = "percentile_list" in json["jobs"][0]["job options"]
options2 = "percentile_list" in json["global options"]
iotype = ["read", "write", "trim"]
if options1 or options2:
percent = [
"25.000000",
"50.000000",
"70.000000",
"75.000000",
"90.000000",
"99.000000",
"99.900000",
"99.990000",
"99.999000",
"99.999900",
]
else:
percent = [
"50.000000",
"70.000000",
"90.000000",
"99.000000",
"99.900000",
"99.990000",
"99.999900",
]
line = [
jobname,
data["read"]["iops"] / scale_by_TB,
data["read"]["bw"] / scale_by_TB,
data["write"]["iops"] / scale_by_TB,
data["write"]["bw"] / scale_by_TB,
data["trim"]["iops"] / scale_by_TB,
data["trim"]["bw"] / scale_by_TB,
]
for io in iotype:
line.append(str(data[io][clat]["mean"] / con))
line.append(str(data[io][clat]["max"] / con))
if data[io]["iops"] > 0:
for p in percent:
if "percentile" in data[io][clat]:
line.append(str(data[io][clat]["percentile"][p] / con))
else: #if FIO bugged out and didnt report percentile
line.append(0)
else:
for _p in percent:
line.append(0)
return line
def get_fio_writes(data):
line = []
line.append(data['write']['io_bytes'])
return line
def get_smart_line(data):
sum = 0
smart_keys = [
'data_units_written',
]
if not data:
return []
# extract the correct key
try:
results = find(smart_keys, data)
for x in results:
for key, value in x.items():
if isinstance(value, int):
sum += value
else:
sum += int(value, 0) # autoguess the format
sum *= 512 * 1000
except:
return ["na"]
return [sum]
def get_extsmart_line(data):
sum = 0
extsmart_keys = [
'Physical media units written',
'Physical Media Units Written-TLC',
'Physical Media Units Written-SLC',
'NAND Writes TLC (Bytes)',
'NAND Writes SLC (Bytes)',
'Physical Media Units Written - TLC',
'Physical Media Units Written - SLC',
'physical_media_units_bytes_tlc',
'physical_media_units_bytes_slc',
'Physical Media Units Written - TLC (Bytes)',
'Physical Media Units Written - SLC (Bytes)',
]
if not data:
return []
# extract the correct key
try:
results = find(extsmart_keys, data)
for x in results:
for key, value in x.items():
if isinstance(value, int):
sum += value
else:
sum += int(value, 0) # autoguess the format
except:
return [0]
return [sum]
def get_lm_line(data, lm_mapping):
line = []
lm_log = {
"Active Bucket Counter": {
"Read": "na",
"Write": "na",
},
"Active Measured Latency": {
"Read": "na",
"Write": "na",
},
}
if isinstance(data, dict):
map = lm_mapping
elif all([data is None, lm_mapping]):
map = {}
elif all([data is None, not lm_mapping]):
return []
for metric, _ in lm_log.items():
for io_type, value in _.items():
for bucket, settings in map.items():
if io_type in settings["target"]:
lm_log[metric][io_type] = data["{}: {}".format(metric, bucket)][io_type]
for metric, _ in lm_log.items():
for io_type, value in _.items():
line += [value]
return line
def find(search, data):
matches = []
if isinstance(data, dict):
for key, value in data.items():
if key in search:
if isinstance(value, dict):
if 'lo' in value: # workaround for OCP plugin output schema
matches.append({key: value['lo']})
else:
matches.append({key: value})
else:
dive = find(search, value)
if dive:
matches.extend(dive)
elif isinstance(data, list):
for idx, x in enumerate(data):
sweep_result = find(search, x)
if sweep_result:
matches.extend(sweep_result)
else:
return None
return matches
def recursive_items(dictionary):
for key, value in dictionary.items():
if type(value) is dict:
yield from recursive_items(value)
else:
yield key
def get_target_line(col_names, job_targets):
target_list = []
target_dict = {}
col_names_filtered = col_names
for name in col_names:
target_dict[name] = "na"
if isinstance(job_targets, dict):
for metric, subdict1 in job_targets.items():
for iotype, subdict2 in subdict1.items():
for valuetype, value in subdict2.items():
target_list += [[metric, iotype, valuetype, value]]
for col in [x.split("_") for x in col_names_filtered]:
col_filtered = col
col_filtered = list(itertools.chain.from_iterable(["throughput", "MIN"] if x == "BW" else [x] for x in col_filtered))
col_filtered = list(itertools.chain.from_iterable(["iops", "MIN"] if x == "IOPS" else [x] for x in col_filtered))
col_filtered = list(itertools.chain.from_iterable(["latency"] if x == "Latency" else [x] for x in col_filtered))
col_filtered = list(itertools.chain.from_iterable(["read"] if x == "Read" else [x] for x in col_filtered))
col_filtered = list(itertools.chain.from_iterable(["write"] if x == "Write" else [x] for x in col_filtered))
col_filtered = list(itertools.chain.from_iterable(["trim"] if x == "Trim" else [x] for x in col_filtered))
col_filtered = list(itertools.chain.from_iterable(["MAX"] if x == "Max" else [x] for x in col_filtered))
for target in target_list:
target_param = target[0:3]
if all(item in target_param for item in col_filtered):
target_dict["_".join(col)] = target[-1]
return list(target_dict.values())
def print_csv_line(f, jobname, fio_data, col_names, only_targets, job_targets, scale_by_TB, smart_before_data, smart_after_data, extsmart_before_data, extsmart_after_data, lm_before_data, lm_after_data, lm_mapping, ver="", serverMode=False, ):
index = 0
lines = 1
line_parts = []
scale_by_TB_factor = 1
if job_targets:
if "throughput" in job_targets.keys():
if "scale_by_TB" in job_targets["throughput"].keys():
if job_targets["throughput"]["scale_by_TB"]["value"]:
scale_by_TB_factor = scale_by_TB
if only_targets:
lines = 1
elif not serverMode:
lines = len(fio_data["jobs"])
ver = fio_data["fio version"]
while index != lines:
data = fio_data
if only_targets:
try:
line_parts = []
line_parts += [jobname + "_targets"]
line_parts += get_target_line([x for x in col_names if x != "Jobname"], job_targets)
rdr = list(csv.reader(f))
f.seek(0)
for row, line in enumerate(rdr):
for col in line:
if any([x in col for x in ["Jobname", "targets"]]):
idx = row
rdr.insert(idx+1, line_parts)
wrtr = csv.writer(f)
wrtr.writerows(rdr)
except OSError:
print("cannot write to ", f)
f.close()
sys.exit(1)
break
if not serverMode:
data = fio_data["jobs"][index]
try:
line_parts = []
line_parts += get_csv_line(jobname, fio_data, index, data, ver, serverMode, scale_by_TB_factor)
if smart_before_data:
line_parts += get_fio_writes(data)
line_parts += get_smart_line(smart_before_data)
line_parts += get_smart_line(smart_after_data)
line_parts += get_extsmart_line(extsmart_before_data)
line_parts += get_extsmart_line(extsmart_after_data)
line_parts += get_lm_line(lm_before_data, lm_mapping)
line_parts += get_lm_line(lm_after_data, lm_mapping)
wrtr = csv.writer(f)
wrtr.writerow(line_parts)
except OSError:
print("cannot write to ", f)
f.close()
sys.exit(1)
index += 1
def print_csv_line_generic(filename, content):
with open(filename, "a") as f:
try:
wrtr = csv.writer(f)
wrtr.writerow(content)
except OSError:
print("cannot write to ", filename)
f.close()
sys.exit(1)
def parseServerResults(json_path, csv_dir):
if not os.path.isdir(csv_dir):
os.mkdir(csv_dir)
write_server_csv_files(csv_dir, json_path)
def write_server_csv_files(csv_dir, json_path):
"""Writes fio server mode json results into CSV files.
One CSV file is written per hostname.
"""
data = read_json(json_path, serverMode=True)
version_str = data["fio version"]
jobname = os.path.splitext(os.path.basename(json_path))[0]
hostname_data_dict = get_hostname_to_data_dict(data)
for hostname in hostname_data_dict:
host_csv_path = os.path.join(csv_dir, "%s.csv" % hostname)
is_new_file = not os.path.isfile(host_csv_path)
with open(host_csv_path, "a") as csv_out:
jb_data = hostname_data_dict[hostname]
jb = jb_data[0]
jb["global options"] = data["global options"]
if is_new_file:
new_csv(
csv_out,
("percentile_list" in jb["job options"]),
("percentile_list" in data["global options"]),
)
print_csv_line(csv_out, jobname, jb, version_str, serverMode=True)
for jb in jb_data[1:]:
jb["global options"] = data["global options"]
print_csv_line(csv_out, jobname, jb, version_str, serverMode=True)
def get_hostname_to_data_dict(fio_data):
"""Create dictionary mapping hostname to its fio data.
Returns:
Dict[str, List[dict]] - hostname to its fio data
"""
hostname_data_dict = {}
for jb in fio_data["client_stats"]:
if jb["jobname"] == "All clients":
continue
if len(tunnel2host) == 0:
hostname = jb["hostname"]
else:
hostname = tunnel2host[jb["port"]]
if hostname not in hostname_data_dict:
hostname_data_dict[hostname] = [jb]
else:
hostname_data_dict[hostname].append(jb)
return hostname_data_dict
def get_combined_stats(stats):
combined_stats = OrderedDict()
for job in stats.keys():
combined_stats[job] = OrderedDict()
for stat in stats[job].keys():
currStat = [float(val) for val in stats[job][stat]]
if "_IOPS" in stat or "_BW" in stat:
combined_stats[job][stat + "_TOTAL"] = sum(currStat)
combined_stats[job][stat + "_MIN"] = min(currStat)
combined_stats[job][stat + "_AVG"] = sum(currStat) / len(currStat)
combined_stats[job][stat + "_MAX"] = max(currStat)
return combined_stats
def combineCsv(csvFolder, fname, dut_list):
csvName = "Combined_Results-%s.csv" % fname
csvPath = os.path.join(csvFolder, csvName)
stats = OrderedDict() # Using OrderedDict to preserve job and stat ordering
try:
os.remove(csvPath) # Remove it if it already exists
except OSError:
pass
csvList = glob.glob(os.path.join(csvFolder, "*.csv"))
reader = csv.reader(open(csvList[0]))
col_names = next(reader)
for row in reader:
stats[row[0]] = OrderedDict()
for c in col_names[1:]: # remove "jobname" column
stats[row[0]][c] = []
for c in csvList:
with open(c) as fd:
creader = csv.reader(fd)
next(creader)
for row in creader:
for i in range(1, len(row)):
stats[row[0]][col_names[i]].append(row[i])
combined_stats = get_combined_stats(stats)
with open(csvPath, "a") as csv_out:
writer = csv.writer(csv_out)
server_list = ";".join([dut.serverName for dut in dut_list])
writer.writerow([fname] + [server_list])
stats_headers = combined_stats[list(combined_stats.keys())[0]].keys()
writer.writerow(["Jobname"] + list(stats_headers))
for job in combined_stats.keys():
row = [job]
for stat in combined_stats[job].keys():
row.append(combined_stats[job][stat])
writer.writerow(row)
def get_json_files(dir_path):
"""Returns list of files under `dir_path` with a `.json` extension."""
json_files = []
for f in sorted(os.listdir(dir_path)):
if f.endswith(".json"):
json_files.append(os.path.join(dir_path, f))
return json_files
def write_csv_file(csv_filepath, fio_json_files, only_targets, job_targets, scale_by_TB, smart_before_json, smart_after_json, extsmart_before_json, extsmart_after_json, lm_before_json, lm_after_json, lm_mapping):
"""Converts and writes each fio json file into a single CSV file."""
is_new_file = not os.path.isfile(csv_filepath)
first_file = fio_json_files[0]
fio_jobname = os.path.splitext(os.path.basename(first_file))[0] #gen_write_run1
if only_targets:
with open(csv_filepath, "r+") as csv_out:
col_names = list(csv.reader(csv_out))[0]
csv_out.seek(0)
print_csv_line(csv_out, fio_jobname, None, col_names, only_targets, job_targets, 1, None, None, None, None, None, None, None)
for f in fio_json_files[1:]: # Continue from second element, if any
fio_jobname = os.path.splitext(os.path.basename(f))[0]
print_csv_line(csv_out, fio_jobname, None, col_names, only_targets, job_targets, 1, None, None, None, None, None, None, None)
else:
with open(csv_filepath, "a+") as csv_out:
fio_data = read_json(first_file)
smart_before_data = read_json(smart_before_json)
smart_after_data = read_json(smart_after_json)
extsmart_before_data = read_json(extsmart_before_json)
extsmart_after_data = read_json(extsmart_after_json)
lm_before_data = read_json(lm_before_json)
lm_after_data = read_json(lm_after_json)
col_names = new_csv(
csv_out,
("percentile_list" in fio_data["jobs"][0]["job options"]),
"percentile_list" in fio_data["global options"],
bool(smart_before_json),
bool(lm_mapping),
is_new_file,
)
print_csv_line(csv_out, fio_jobname, fio_data, col_names, only_targets, job_targets, scale_by_TB, smart_before_data, smart_after_data, extsmart_before_data, extsmart_after_data, lm_before_data, lm_after_data, lm_mapping)
for f in fio_json_files[1:]: # Continue from second element, if any
fio_jobname = os.path.splitext(os.path.basename(f))[0]
fio_data = read_json(f)
print_csv_line(csv_out, fio_jobname, fio_data, col_names, only_targets, job_targets, scale_by_TB, smart_before_data, smart_after_data, extsmart_before_data, extsmart_after_data, lm_before_data, lm_after_data, lm_mapping)
def main(args):
if args.combine_csv_path != "":
combineCsv(args.combine_csv_path)
return
if args.all_json:
json_files = get_json_files(args.all_json)
else:
json_files = [args.json_file]
if json_files:
csv_filepath = os.path.join(args.csv_path, args.csv_file)
write_csv_file(csv_filepath, json_files, args.only_targets, args.job_targets, args.scale_by_TB, args.smart_before_file, args.smart_after_file, args.extsmart_before_file, args.extsmart_after_file, args.lm_before_file, args.lm_after_file, args.lm_mapping)
def cli_main():
args = set_attributes()
main(args)
if __name__ == "__main__":
cli_main()
================================================
FILE: fiosynth_lib/fiosynth.py
================================================
#!/usr/bin/env python3
# Copyright (c) Facebook, Inc. and its affiliates.
#
# AUTHOR = 'Darryl Gardner <darryleg@fb.com>'
# @nolint
# pyre-unsafe
import argparse
import datetime
import json
import os
import os.path
import shutil
import socket
import subprocess
import sys
import re
import shlex
from random import randint
from subprocess import PIPE, Popen
from . import fio_json_parser, flash_config, health_tools
class Parser:
def __init__(self, jname, cname, only_targets=False, job_targets={}, scale_by_TB=1, smart_before_jname="", smart_after_jname="", extsmart_before_jname="", extsmart_after_jname="", lm_before_file="", lm_after_file="", lm_mapping=None):
self.json_file = jname
self.json_path = "."
self.only_targets = only_targets
self.job_targets = job_targets
self.scale_by_TB = scale_by_TB
self.smart_before_file = smart_before_jname
self.smart_after_file = smart_after_jname
self.extsmart_before_file = extsmart_before_jname
self.extsmart_after_file = extsmart_after_jname
self.lm_before_file = lm_before_file
self.lm_after_file = lm_after_file
self.lm_mapping = lm_mapping
self.all_json = ""
self.csv_path = "."
self.csv_file = cname
self.serverMode = "n"
self.combine_csv_path = ""
def parseLocalResults(args):
fio_json_parser.main(args)
def set_attributes():
#
# Attribute Table Definition
#
parser = argparse.ArgumentParser(
description="FB fio Synthetic Benchmark Suite for storage ver 3.7.0"
)
parser.add_argument(
"-d",
action="store",
dest="device",
type=str,
help=(
"(Required) device path for single device target, ALL for all"
"data devices, or ALLRAID for all mdraid devices"
),
required=True,
default="",
)
parser.add_argument(
"-c",
action="store",
dest="factor",
type=float,
help="(Optional) specify capacity in TB (default = <device capacity>)",
default=-1.0,
)
parser.add_argument(
"-w",
action="store",
dest="wklds",
type=str,
help="(Required) filename for workload suite (default = )",
required=True,
default="",
)
parser.add_argument(
"-f",
action="store",
dest="fname",
type=str,
help="(Required) Results filename (default = )",
required=True,
default=".",
)
parser.add_argument(
"-r",
action="store",
dest="dryrun",
type=str,
help="(Optional) Set to y to do dry run (default = n)",
default="n",
)
parser.add_argument(
"-t",
action="store",
dest="health",
type=str,
help="(Optional) Enter Health Monitoring Tool Syntax (default = )",
default="",
)
parser.add_argument(
"-p",
action="store",
dest="prep",
type=str,
help="(Optional) Set to n to skip drive prep, o to prep on first cycle "
"only (default = y)",
default="y",
)
parser.add_argument(
"-n",
action="store",
dest="cycles",
type=int,
help="(Optional) Specific the number of run cycles (default = 3 )",
default=-1,
)
parser.add_argument(
"-g",
action="store",
dest="getflash",
type=str,
help="(Optional) Set to y to enable flash configuration logging "
"(default = n)",
default="n",
)
parser.add_argument(
"-s",
action="append",
dest="servers",
type=str,
help="(Optional) Add a server to the list for client/server mode",
default=[],
)
parser.add_argument(
"-l",
action="store",
dest="server_file",
type=str,
help="(Optional) Path to a text file with a server name on each line",
default="",
)
parser.add_argument(
"-j",
action="store",
dest="job_scale",
type=int,
help="(Optional) Scale by jobs (default = 1 job per drive)",
default=1,
)
parser.add_argument(
"-x",
action="store_true",
dest="exitall",
help="(Optional) Pass --exitall to fio",
)
parser.add_argument(
"-z",
action="store_true",
dest="deterministic",
help="(Optional) Static file and directory names",
)
parser.add_argument(
"-m",
action="store",
dest="misc",
type=str,
help="(Optional) Set a misc variable in a workload suite" "(default = )",
default="",
)
parser.add_argument(
"-e",
action="store",
dest="expert",
type=str,
help="(Optional) Pass this string directly to fio command line invocation and attach just before jobfile argument"
"(default = )",
default="",
)
parser.add_argument(
"-u",
action="store",
dest="user",
type=str,
help="(Optional) The user to login as on the server when running fiosynth in client/server mode (default = root)",
default="root",
)
parser.add_argument(
"-y",
action="store",
dest="tunneling",
type=str,
help="(Optional) Set to y to perform server/client mode fio via SSH tunnels. (default = n)",
default="n",
)
parser.add_argument(
"--waf",
action="store_true",
dest="calc_waf",
help="(Optional) Set to use calculate WAF (Write Amplification Factor) based on OCP SMART / Health Inforamtion Extended (Log Identifier C0h) data. OCP compliant devices only. (default = disabled)",
)
parser.add_argument(
"--lm",
action="store_true",
dest="check_lm",
help="(Optional) Set to use OCP Latency Monitor to check max read and max write latencies if targets avaiable. OCP 2.0 compliant devices only. (default = disabled)",
)
parser.add_argument(
"--targets",
action="store_true",
dest="show_targets",
help="(Optional) Set to add performance targets in the output CSV file. Targets are taken from workload file. (default = disabled)",
)
parser.add_argument(
"--scale-by-TB",
action="store_true",
dest="scale_by_TB",
help="(Optional) Set to scale BW and IOPs by device capacity in the output CSV file. Workload must have store_by_TB set to true. (default = disabled)",
)
parser.add_argument(
"--ioengine",
action="store",
dest="ioengine",
type=str,
help="(Optional) Specify either io_uring or libaio ioengine. For 1H25 and later wkldsuites. (default = io_uring)",
default="io_uring",
)
parser.add_argument(
"--tmp-directory",
action="store_true",
dest="tmp_directory",
help="(Optional) Use current directory for temporary files required to run benchmark (default temporary directory = /tmp)",
)
parser.add_argument("-v", action="version", version=parser.description)
args = parser.parse_args()
return args
def cmdline(cmd):
process = Popen(args=cmd, stdout=PIPE, shell=True)
return process.communicate()[0]
def checkMounted(device, dut):
cmd = "grep -c %s /proc/mounts" % device
if not dut.inLocalMode():
dutSsh = getSshProc(dut)
out, err = dutSsh.communicate(cmd)
mount = out.strip()
else:
mount = cmdline(cmd)
if int(mount) > 0:
return True
else:
return False
def getAllDataDrives(data, command, profile, dut):
# getAllDataDrives creates a list of devices separated by a ':'.
# An example of the string that is created in this function is
# '/dev/sdb:/dev/sdc:/dev/sdd:/dev/sde:/dev/sdf:'.
# If devices_in_global option is 'N' each device will be listed
# on a separate line.
if command == "ALL":
device = "disk"
# Skip boot device (sda)
else:
device = getRaidLevel(data)
dev_path = ""
dev_list = set()
for dev in data[device]:
if checkFileExist(dev, dut) is True:
if checkMounted(dev, dut) is False:
if profile["devices_in_global"] == "N":
dev_path += "[%s]\n" % dev
dev_path += "filename=%s\n" % dev
dut.device += "%s:" % dev
else:
if dev not in dev_list:
dev_list.add(dev)
dev_path += "%s:" % dev
return dev_path
def createTempJobTemplate(dut, jobname):
# (Used to be called createTempJobFile, renamed for clarity)
# Creates a temporary job template
dst_file = "tmp.fio"
shutil.copyfile(jobname, dst_file)
with open(dst_file, "a") as tmp_file:
try:
tmp_file.write(dut.dev_list)
except OSError:
print("cannot write to %s" % tmp_file)
sys.exit(1)
return dst_file
def getTotalDataCapacity(data):
VAL = 1
data_cap = int(data["disk"][VAL])
return data_cap
# For checking devices, but can also be used for checking files
def checkFileExist(path, dut):
valid_path_pattern = r'^[a-zA-Z0-9/_.-]+$'
if not re.match(valid_path_pattern, path):
print(f"Invalid path: {path}. Path contains invalid characters.")
sys.exit(1)
if dut.inLocalMode():
try:
os.stat(path)
except OSError:
print("%s does not exist " % path)
return False
return True
else:
proc = getSshProc(dut)
safe_path = shlex.quote(path)
cmdStr = f"stat {safe_path} 2> /dev/null | wc -l"
out, err = proc.communicate(cmdStr)
result = out.strip()
if int(result) > 0:
return True
else:
print("{} does not exist on server {} ".format(path, dut.serverName))
return False
def getNumJobs(data, command, dut):
# getNumJobs checks the number of devices in the system and
# subtracts by 1 to avoid counting the boot device if using
# ALL option. If using ALLRAID option, it will could the
# number of unique mdraid devices. Number of jobs is used
# to scale fio jobfiles for multiple devices.
if command == "ALL":
jobs = len(data["disk"]) - 1
else:
dev_list = set()
raid = getRaidLevel(data)
for dev in data[raid]:
if checkFileExist(dev, dut) is True:
dev_list.add(dev)
jobs = len(dev_list)
return jobs
def getSshProc(dut):
sshProc = subprocess.Popen(
["ssh", dut.sshUser + "@" + dut.serverName, "/bin/bash"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
universal_newlines=True,
)
return sshProc
def getMultiplier(capacity):
factor = float(capacity) / 1e12
return max(round(factor, 1), 0.1)
def getJobVars(dut, profile, scale_factor):
vars_static = [
"SIZE",
"TIME",
"RAMPTIME",
"RATE1",
"RATE2",
"BLKSIZE",
"DEPTH1",
"DEPTH2",
"MISC",
"MD",
"DIRECT",
"RANDRW",
"RWMIXREAD",
"IOENGINE",
"RAMP",
"NUMJOBS",
]
vars_scaleup = ["RRATE", "DEPTH", "OFFSET2"]
vars_scaledown = ["W1THINK", "W2THINK", "W3THINK", "W4THINK", "W5THINK"]
job_vars = {}
for var in vars_static:
if var in profile:
job_vars[var] = profile[var]
for var in vars_scaleup:
if var in profile:
if var == "OFFSET2":
job_vars["OFFSET2"] = int(
profile["OFFSET2"] * getMultiplier(dut.capacity)
)
else:
job_vars[var] = int(profile[var] * scale_factor)
if job_vars[var] < 1:
job_vars[var] = 1
for var in vars_scaledown:
if var in profile:
job_vars[var] = int(int(profile[var]) / scale_factor)
if job_vars[var] < 1:
job_vars[var] = 1
job_vars["DEV"] = dut.device
job_vars["JOBS"] = dut.numjobs
if "JOBS" in profile:
job_vars["JOBS"] *= profile["JOBS"]
job_vars["OFFSET1"] = dut.offset
job_vars["INCREMENT"] = dut.increment
return job_vars
def run_fio(p, VAL, dut_list, args, run, rtype):
resultsFileName = "%s/%s_run%d.json" % (FioDUT.fname, p[rtype][VAL]["alias"], run)
exitall_flag = " "
if args.exitall:
exitall_flag = " --exitall "
fioCmd = "fio --output-format=json{}--output={} ".format(
exitall_flag,
resultsFileName,
)
fioCmd += " " + args.expert.lstrip().rstrip() + " "
currDir = os.getcwd()
tmpJobDir = ""
if not dut_list[0].inLocalMode():
tmpJobDir = os.path.join(currDir, "tmpJobFiles")
cmdline("rm -rf %s" % (tmpJobDir))
cmdline("mkdir %s" % (tmpJobDir))
for dut in dut_list:
template = os.path.join(FioDUT.jobfiles, p[rtype][VAL]["template"])
f = dut.factor
jobVars = getJobVars(dut, p[rtype][VAL]["values"], f)
if args.misc != "":
jobVars["MISC"] = args.misc
if args.ioengine != "":
jobVars["IOENGINE"] = args.ioengine
if p["devices_in_global"] == "N":
template = createTempJobTemplate(dut, template)
if dut.inLocalMode():
for k, v in jobVars.items():
fioCmd = k + "=" + str(v) + " " + fioCmd
fioCmd = fioCmd + template
else:
f = open(template)
tmpJbStr = f.read()
f.close()
for var in jobVars.keys():
tmpJbStr = tmpJbStr.replace("${%s}" % str(var), str(jobVars[var]))
tmpJbFileName = dut.serverName + "tmpJbFile"
tmpJbFilePath = os.path.join(tmpJobDir, tmpJbFileName)
cmdline("touch %s" % tmpJbFilePath)
try:
tmpFile = open(tmpJbFilePath, "w")
tmpFile.write(tmpJbStr)
finally:
tmpFile.close()
if dut.tunnel:
fioCmd = fioCmd + (
" --client=ip6:localhost,%d %s" % (dut.sshTunnelPort, tmpJbFilePath)
)
else:
fioCmd = fioCmd + (
" --client=ip6:{} {}".format(dut.serverName, tmpJbFilePath)
)
if args.dryrun == "n":
cmdline(fioCmd)
else:
print(fioCmd)
return resultsFileName
def isPortAvailable(port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.bind(("127.0.0.1", port))
except OSError:
return False
finally:
sock.close()
return True
class FioDUT:
# FioDUT (Device Under Test) represents a single machine that runs fio jobs
jobfiles = "/usr/local/fb-FioSynthFlash/jobfiles"
wkldsuites = "/usr/local/fb-FioSynthFlash/wkldsuites"
fname = ""
prep = "prep"
csvfname = ""
nextTunnelPort = 8765
def __init__(self, sName="", user=""):
self.factor = 0.0
self.numjobs = 1
self.offset = 0
self.increment = 30
self.dev_list = "" # String, not a list!
self.device = "" # This replaces args.device
self.capacity = 0
self.serverName = sName # If blank string, then local mode
self.sshUser = user
self.sshTunnelPort = 0
self.tunnel = None
def __del__(self):
if isinstance(self.tunnel, Popen):
self.tunnel.terminate()
def inLocalMode(self):
return self.serverName == ""
@classmethod
def getTunnelPort(cls):
port = -1
while cls.nextTunnelPort < 65535:
try:
if not isPortAvailable(cls.nextTunnelPort):
continue
else:
port = cls.nextTunnelPort
break
finally:
cls.nextTunnelPort += 1
return port
def drivesToJson(dut):
drives = {}
TYPE = 5
DEVICE = 0
maxcol = max(TYPE, DEVICE)
output = None
if dut.inLocalMode():
proc = subprocess.Popen(["/bin/lsblk", "-rnbp"], stdout=subprocess.PIPE)
output = proc.stdout.read()
output = output.decode("utf-8")
else:
sshProc = getSshProc(dut)
output, err = sshProc.communicate("/bin/lsblk -rnbp\n")
for line in output.splitlines():
bits = line.split()
if len(bits) > maxcol:
# drive_type = bits[TYPE].decode("utf-8")
drive_type = bits[TYPE]
# drive_device = bits[DEVICE].decode("utf-8")
drive_device = bits[DEVICE]
drives.setdefault(drive_type, [])
drives[drive_type].append(drive_device)
return json.dumps(drives)
def createOffsetFile(dut, dst_file):
if dut.inLocalMode():
try:
tmp_file = open(dst_file, "w")
tmp_file.write(str(dut.offset))
except OSError:
print("cannot write to %s" % tmp_file)
sys.exit(1)
finally:
tmp_file.close()
return
else:
dutSsh = getSshProc(dut)
dutSsh.communicate('echo "{}" > {}'.format(str(dut.offset), dst_file))
return
def readOffsetFile(dut, dst_file):
if checkFileExist(dst_file, dut):
tmp_file = open(dst_file)
try:
dut.offset = int(tmp_file.readline().strip())
except OSError:
print("cannot read from %s" % tmp_file)
sys.exit(1)
tmp_file.close()
else:
if dut.inLocalMode():
print("offset file (%s) does not exist" % dst_file)
else:
print(
"offset file (%s) does not exist on server %s"
% (dst_file, dut.server_name)
)
print("Device has not been preconditioned yet")
sys.exit(1)
def getRaidLevel(data):
raid = None
raidLevels = ["raid0", "raid1", "raid5", "raid6"]
for x in data:
for y in raidLevels:
if x.startswith(y):
raid = x
break
if raid:
return raid
else:
print("No mdraid arrays found")
sys.exit(1)
def setDutCapacity(dut, cmd, profile):
if not cmd:
if not dut.inLocalMode():
host = " on %s" % dut.serverName
else:
host = ""
sys.exit("No devices available or device is mounted%s." % host)
if profile["devices_in_global"] != "N":
dut.device = dut.dev_list
if not dut.inLocalMode():
dutSsh = getSshProc(dut)
out, err = dutSsh.communicate(cmd)
dut.capacity = out.strip()
else:
# set capacity to the smallest device under test
cmd_filtered = cmd.replace("ng", "nvme")
capacity = cmdline(cmd_filtered)
if (int(capacity) < int(dut.capacity)) or (int(dut.capacity) == 0):
dut.capacity = capacity
def loadDevList(dut_list, args, profile):
prefix = "lsblk -bno SIZE "
suffix = " | head -n 1"
command = args.device
if (command == "ALL") or (command == "ALLRAID"):
for dut in dut_list:
cmd = None
devices = drivesToJson(dut)
data = json.loads(devices)
dut.dev_list = getAllDataDrives(data, command, profile, dut)
devs = None
if command == "ALL":
devs = data["disk"]
else:
devs = data[getRaidLevel(data)]
for dev in devs:
if checkFileExist(dev, dut) and not checkMounted(dev, dut):
cmd = prefix + dev + suffix
setDutCapacity(dut, cmd, profile)
dut.numjobs = getNumJobs(data, command, dut)
else:
devs = command.split(":")
ndevs = len(devs)
for dut in dut_list:
for dev in devs:
cmd = None
if checkFileExist(dev, dut) and not checkMounted(dev, dut):
cmd = prefix + dev + suffix
if profile["devices_in_global"] == "N":
dut.dev_list += "[%s]\n" % dev
dut.dev_list += "filename=%s\n" % dev
setDutCapacity(dut, cmd, profile)
dut.device = command
dut.numjobs = ndevs
def startAoeServer(dut):
sshProc = getSshProc(dut)
ipAddr, err = sshProc.communicate("killall fio -q; hostname -i")
fioSvrCmd = (
"nohup fio --server=ip6:%s " % (ipAddr.rstrip())
+ "> /tmp/fio.log 2> /tmp/fio.err &\n"
)
sshProc = getSshProc(dut)
sshProc.stdin.write(fioSvrCmd)
sshProc.stdin.close()
sshProc.stdout.close()
def startSshTunnel(dut):
dut.sshTunnelPort = FioDUT.getTunnelPort()
if dut.sshTunnelPort <= 0:
print(
"Unable to find an available port for ssh tunneling for host %s."
% dut.serverName
)
sys.exit(1)
cmd = [
"ssh",
"{}@{}".format(dut.sshUser, dut.serverName),
"-N",
"-L",
"%d:%s:8765" % (dut.sshTunnelPort, dut.serverName),
]
dut.tunnel = Popen(cmd, stdout=subprocess.DEVNULL)
def clearDriveData(dut_list, dryrun="n"):
cmd = ""
if dut_list[0].inLocalMode():
cmd = "fio --name=trim --filename=%s --rw=trim --bs=1G" % (dut_list[0].device)
else:
cmd = "fio --name=trim --rw=trim --bs=1G "
for dut in dut_list:
if dut.tunnel:
cmd = cmd + "--client=ip6:localhost,%d --filename=%s" % (
dut.sshTunnelPort,
dut.device,
)
else:
cmd = cmd + "--client=ip6:{} --filename={}".format(
dut.serverName,
dut.device,
)
if dryrun == "n":
cmdline(cmd)
def getServers(servers, server_file, user):
dut_list = [] # list of machines running tests
if len(servers) == 0 and server_file == "":
dut_list.append(FioDUT())
else:
if len(servers) > 0:
for server in servers:
dut_list.append(FioDUT(sName=server, user=user))
if not server_file == "":
try:
sf = open(server_file)
for server in sf.read().split():
server = server.strip()
dut_list.append(FioDUT(sName=server, user=user))
except OSError:
print("Can't open server file")
finally:
sf.close()
return dut_list
def prepServers(dut_list, args, profile):
# The increment variable is used to set the "offset_increment" fio option
# for the readhammer workload. Setting this option allows the workload to
# read from 32 equally
# spaced regions on the flash device in parallel.
# The offset_increment is calculated by converting the flash device
# capacity from bytes to MiB then dividing by 32, representing 1/32
# of the total flash device capacity. Offet is in MiB.
for dut in dut_list:
if not dut.inLocalMode():
startAoeServer(dut)
if args.tunneling == "y":
startSshTunnel(dut)
fio_json_parser.tunnel2host[dut.sshTunnelPort] = dut.serverName
if dut.capacity:
dut.increment = int(float(dut.capacity) / 2**20 / 32)
dut.offset = randint(0, dut.increment)
dut.numjobs *= args.job_scale
if args.factor <= 0.0:
if profile["scale_by_capacity"] != "N":
dut.factor = getMultiplier(dut.capacity)
else:
dut.factor = 1.0
else:
dut.factor = args.factor
def runHealthMon(fname, health="", flash=None):
if health != "":
runHealthTool = health_tools.HealthTools()
runHealthTool.logger(health)
if flash == "y":
filename = os.path.join(fname, "flashconfig.csv")
runGetFlashConfig = flash_config.GetFlashConfig()
config_as_json, tool = runGetFlashConfig.get_json()
runGetFlashConfig.json_to_csv(".", config_as_json, filename, tool)
def getSmart(device, output_filename):
smart_cmds = [
'nvme smart-log {} -o json | tee {}'.format(device, output_filename),
]
smart_dict = {}
for cmd in smart_cmds:
try:
cmd_output = cmdline(cmd)
try:
smart_dict = json.loads(cmd_output)
except:
for line in cmd_output.split('\n'):
key = line.split(':')[0].strip()
value = line.split(':')[-1].strip()
smart_dict[key] = value
with open(output_filename, 'w') as f:
json.dump(smart_dict, f)
except:
pass
else:
break
def getVID(device):
cmd = 'nvme id-ctrl %s -o json' % (device)
cmd_output = cmdline(cmd)
idctrl_dict = json.loads(cmd_output)
return idctrl_dict["vid"]
def getOCP(device):
OCP_map = {
"OCP Datacenter NVMe SSD Specification Version 2.0": {
"Log Page Version": 0x3,
"Log Page GUID": 0xAFD514C97C6F4F9CA4f2BFEA2810AFC5,
"calc_waf": True,
"check_lm": True,
},
"OCP NVMe Cloud SSD Specification Version 1.0": {
"Log Page Version": 0x2,
"Log Page GUID": 0xAFD514C97C6F4F9CA4f2BFEA2810AFC5,
"calc_waf": True,
"check_lm": False,
},
"OCP Hyperscale NVMe Boot SSD Specification Version 1.0": {
"Log Page Version": 0x1,
"Log Page GUID": 0xC46DD7920F1E4266A178D8AC78884365,
"calc_waf": True,
"check_lm": False,
},
"No OCP Compliance": {
"Log Page Version": 0x0,
"Log Page GUID": 0x0,
"calc_waf": False,
"check_lm": False,
},
}
cmd = 'nvme get-log %s --log-id=0xC0 --log-len=512 -b' % (device)
cmd_output = cmdline(cmd) # bytes type
if not cmd_output:
return OCP_map["No OCP Compliance"]
version = cmd_output[494:496]
guid = cmd_output[496:512]
for spec, content in OCP_map.items():
if version == content["Log Page Version"].to_bytes(2, 'little'):
if guid == content["Log Page GUID"].to_bytes(16, 'little'):
print("{} supports {}. Setting calc_waf:{} and check_lm:{}".format(device, spec, content["calc_waf"], content["check_lm"]))
return content
return OCP_map["No OCP Compliance"]
def getExtSmart(device, output_filename):
vid = getVID(device)
vid_extsmart_dict = {
# VID : EXT SMART CMD
'': 'nvme ocp smart-add-log {} -o json | tee {}'.format(device, output_filename),
}
extsmart_dict = {}
cmd_list = []
cmd_list += [vid_extsmart_dict['']]
cmd_list += [vid_extsmart_dict[hex(vid)] for key in vid_extsmart_dict.keys() if key==hex(vid)]
for cmd in cmd_list:
try:
cmd_output = cmdline(cmd)
try:
extsmart_dict = json.loads(cmd_output)
except:
for line in cmd_output.split('\n'):
key = line.split(':')[0].strip()
value = line.split(':')[-1].strip()
extsmart_dict[key] = value
with open(output_filename, 'w') as f:
json.dump(extsmart_dict, f)
except:
pass
else:
break
def setupLM(drive, job_targets, enable_lm):
lm_mapping = {
"Bucket 0":
{
"target": [],
"threshold": 0x0, # minimum value allowed by LM
},
"Bucket 1":
{
"target": [],
"threshold": 0x1, # minimum value allowed by LM
},
"Bucket 2":
{
"target": [],
"threshold": 0x2, # minimum value allowed by LM
},
"Bucket 3":
{
"target": [],
"threshold": 0x3, # minimum value allowed by LM
},
}
if job_targets:
enable = enable_lm
for io_type in ["Read", "Write"]:
threshold = job_targets["latency"][io_type.lower()]["MAX"] / 1000 / 5 - 1 # convert us to ms zero based
for bucket, value in list(lm_mapping.items())[:-1]:
if value["threshold"] == threshold:
value["target"] += [io_type]
break
else:
lm_mapping["Bucket 3"]["target"] += [io_type]
lm_mapping["Bucket 3"]["threshold"] = threshold
continue
else:
print("No max latency target found. Disabling LM setup.")
enable = 0
setLM(
drive=drive,
threshold_a = lm_mapping["Bucket 0"]["threshold"],
threshold_b = lm_mapping["Bucket 1"]["threshold"],
threshold_c = lm_mapping["Bucket 2"]["threshold"],
threshold_d = lm_mapping["Bucket 3"]["threshold"],
enable_lm = enable,
)
return lm_mapping
def setLM(drive, threshold_a, threshold_b, threshold_c, threshold_d, enable_lm):
# LM Rules:
# Log data no more than 10 minutes old
# Bucket Thresholds must be A<B<C<D
cmd_options = [
"nvme ocp set-latency-monitor-feature",
"%s" % (drive),
"--active_bucket_timer_threshold=%d" % (2016), # 5 min increments; default is 07E0h or 2016 which is 1 week
"--active_threshold_a=%d" % (threshold_a), # 5 ms increments; default is 05h which is 30 ms
"--active_threshold_b=%d" % (threshold_b), # 5 ms increments; default is 13h which is 100 ms
"--active_threshold_c=%d" % (threshold_c), # 5 ms increments; default is 1Eh which is 155 ms
"--active_threshold_d=%d" % (threshold_d), # 5 ms increments; default is 2Eh which is 235 ms
"--active_latency_config=%s" % ("0x0fff"), # default is 0FFFh
"--active_latency_minimum_window=%d" % (0), # set to 0 to disable
"--debug_log_trigger_enable=%d" % (0), # set to 0 to disable
"--discard_debug_log=%d" % (1), # set to 1 to discard log and reset LM with this cmd's settings
"--latency_monitor_feature_enable=%d" % (enable_lm), #set to 1 to enable
]
cmd_output = cmdline(" ".join(cmd_options))
return cmd_output
def getLM(drive, output_filename):
cmd = "nvme ocp latency-monitor-log {} -o json | tee {}".format(drive, output_filename)
cmd_output = cmdline(cmd)
return json.loads(cmd_output) # TODO save as file
def getLMbinary(drive, output_filename):
cmd = "nvme get-log {} -i 0xC3 -l 512 -b | tee {}".format(drive, output_filename)
cmdline(cmd)
return
def runTest(dut_list, profile, args, csvFolderPath, rtype, index, rcycle, only_targets=False):
job_targets = None
smart_before_filename = ""
smart_after_filename = ""
extsmart_before_filename = ""
extsmart_after_filename = ""
lm_before_filename = ""
lm_after_filename = ""
fio_jfile = ""
ocp_support = getOCP(dut_list[0].device)
args.calc_waf = args.calc_waf and ocp_support["calc_waf"]
args.check_lm = args.check_lm and ocp_support["check_lm"]
lm_mapping = args.check_lm
if args.scale_by_TB:
scale_by_TB = dut_list[0].factor
else:
scale_by_TB = 1
if "targets" in profile[rtype][index]:
job_targets = profile[rtype][index]["targets"]
elif args.check_lm:
job_targets = {}
if all([args.calc_waf, not only_targets]):
smart_before_filename = "%s/%s_run%d_smart_before.log" % (FioDUT.fname, profile[rtype][index]["alias"], rcycle)
smart_after_filename = "%s/%s_run%d_smart_after.log" % (FioDUT.fname, profile[rtype][index]["alias"], rcycle)
extsmart_before_filename = "%s/%s_run%d_extsmart_before.log" % (FioDUT.fname, profile[rtype][index]["alias"], rcycle)
extsmart_after_filename = "%s/%s_run%d_extsmart_after.log" % (FioDUT.fname, profile[rtype][index]["alias"], rcycle)
getSmart(dut_list[0].device, smart_before_filename)
getExtSmart(dut_list[0].device, extsmart_before_filename)
if all([args.check_lm, job_targets, not only_targets]):
lm_before_filename = "%s/%s_run%d_lm_before.log" % (FioDUT.fname, profile[rtype][index]["alias"], rcycle)
lm_after_filename = "%s/%s_run%d_lm_after.log" % (FioDUT.fname, profile[rtype][index]["alias"], rcycle)
lmbinary_before_filename = "%s/%s_run%d_lmbinary_before.log" % (FioDUT.fname, profile[rtype][index]["alias"], rcycle)
lmbinary_after_filename = "%s/%s_run%d_lmbinary_after.log" % (FioDUT.fname, profile[rtype][index]["alias"], rcycle)
lm_mapping = setupLM(dut_list[0].device, job_targets, enable_lm=1)
getLM(dut_list[0].device, lm_before_filename)
getLMbinary(dut_list[0].device, lmbinary_before_filename)
if not only_targets:
fio_jfile = run_fio(profile, index, dut_list, args, rcycle, rtype)
elif only_targets:
fio_jfile = profile[rtype][index]["alias"]
if all([args.calc_waf, not only_targets]):
getSmart(dut_list[0].device, smart_after_filename)
getExtSmart(dut_list[0].device, extsmart_after_filename)
if all([args.check_lm, job_targets, not only_targets]):
getLM(dut_list[0].device, lm_after_filename)
getLMbinary(dut_list[0].device, lmbinary_after_filename)
setupLM(dut_list[0].device, job_targets, enable_lm=0)
if args.dryrun == "n":
if dut_list[0].inLocalMode(): # Health tools only works locally
runHealthMon(dut_list[0].fname, args.health, args.getflash)
results = Parser(
jname = fio_jfile,
cname = "{}/{}.csv".format(FioDUT.fname, FioDUT.fname),
only_targets = only_targets,
job_targets = job_targets,
scale_by_TB = scale_by_TB,
smart_before_jname = smart_before_filename,
smart_after_jname = smart_after_filename,
extsmart_before_jname = extsmart_before_filename,
extsmart_after_jname = extsmart_after_filename,
lm_before_file = lm_before_filename,
lm_after_file = lm_after_filename,
lm_mapping = lm_mapping)
parseLocalResults(results)
else:
fio_json_parser.parseServerResults(fio_jfile, csvFolderPath)
else:
print("parse file: %s" % fio_jfile)
def runCycles(dut_list, profile, args, rc, pc, lp, csvFolderPath):
for rcycle in range(1, rc + 1):
if "pre" in profile and pc > 0 and lp > 0:
lp -= 1
for _pcycle in range(1, pc + 1):
for index in range(len(profile["pre"])):
clearDriveData(dut_list, args.dryrun)
runTest(
dut_list, profile, args, csvFolderPath, "pre", index, rcycle, False
)
for index in range(len(profile["def"])):
runTest(dut_list, profile, args, csvFolderPath, "def", index, rcycle, False)
if rcycle == rc and args.show_targets:
print("Adding workload targets to the CSV file")
for index in range(len(profile["def"])):
runTest(dut_list, profile, args, csvFolderPath, "def", index, rcycle, True)
def runSuite(args):
dut_list = getServers(args.servers, args.server_file, args.user)
# Use absolute path for workload suite files
wklds = os.path.join(FioDUT.wkldsuites, args.wklds)
profile = fio_json_parser.read_json(wklds)
if args.tmp_directory:
currDir = os.getcwd()
dst_file = os.path.join(currDir, "offset.txt")
else:
dst_file = "/tmp/offset.txt"
loadDevList(dut_list, args, profile)
prepServers(dut_list, args, profile)
timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M")
if args.deterministic:
FioDUT.fname = args.fname
else:
FioDUT.fname = "-".join([args.fname, timestamp])
FioDUT.csvfname = "-".join([FioDUT.fname, "compiled_results"])
csvFolderPath = os.path.join(os.getcwd(), FioDUT.csvfname)
print("Results are in directory: %s" % FioDUT.fname)
if not os.path.isdir(FioDUT.fname):
os.mkdir(FioDUT.fname)
if args.cycles == -1:
rc = profile["run_cycles"]
else:
rc = args.cycles
if "precondition_first_cycle_only" not in profile:
profile["precondition_first_cycle_only"] = None
if profile["precondition_first_cycle_only"] == "Y":
lp = 1
else:
lp = 1000
if args.prep == "n":
pc = 0
if dut_list[0].inLocalMode():
for dut in dut_list:
dut.offset = readOffsetFile(dut, dst_file)
elif args.prep == "o":
lp = 1 # The number of loops that will be prepared
pc = profile["precondition_cycles"]
for dut in dut_list:
createOffsetFile(dut, dst_file)
else:
pc = profile["precondition_cycles"]
for dut in dut_list:
createOffsetFile(dut, dst_file)
runCycles(dut_list, profile, args, rc, pc, lp, csvFolderPath)
if dut_list[0].inLocalMode():
runHealthMon(dut_list[0].fname, args.health, args.getflash)
if args.dryrun == "n":
if not dut_list[0].inLocalMode():
fio_json_parser.combineCsv(csvFolderPath, FioDUT.fname, dut_list)
print("Your results are in: %s" % csvFolderPath)
def main():
args = set_attributes()
runSuite(args)
if __name__ == "__main__":
main()
================================================
FILE: fiosynth_lib/flash_config.py
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
#
# AUTHOR = "Darryl Gardner <darryleg@fb.com>"
#
# flash_config.py- Logs flash configuration information in .csv format
# By default, results will be stored in "flashconfig.csv" file.
#
# pyre-unsafe
import argparse
import csv
import json
import os
import re
import shlex
import subprocess
import sys
from subprocess import PIPE, Popen
from typing import Any, Dict, Optional, Union
def set_attributes():
#
# Attribute Table Definition
#
parser = argparse.ArgumentParser(
description="flash_config- Logs flash configuration in .csv file."
)
parser.add_argument(
"-f",
action="store",
dest="filename",
type=str,
help=("(Optional) Flash configuration filename (default = flashconfig.csv"),
default="flashconfig.csv",
)
args = parser.parse_args()
return args
def smartctlToJson(data):
# Skip boot device (sda)
index = 1
device = "disk"
smart = {}
KEY = 0
VALUE = 2
while index != len(data[device]):
syntax = "smartctl -i /dev/%s | grep :" % (data[device][index])
lb = subprocess.Popen(syntax, stdout=subprocess.PIPE, shell=True)
smart.setdefault(index, {})
device_path = "/dev/%s" % data[device][index]
smart[index].setdefault("Device Path:", device_path)
for line in lb.stdout:
bits = line.split()
a = "{} {}".format(bits[KEY].decode("utf-8"), bits[KEY + 1].decode("utf-8"))
try:
b = "{} {}".format(
bits[VALUE].decode("utf-8"),
bits[VALUE + 1].decode("utf-8"),
)
except IndexError:
b = "%s" % (bits[VALUE].decode("utf-8"))
smart.setdefault(index, {})
smart[index].setdefault(a, b)
index += 1
return json.dumps(smart)
def drivesToJson():
lb = subprocess.Popen(["/bin/lsblk", "-rnb"], stdout=subprocess.PIPE)
drives = {}
TYPE = 5
DEVICE = 0
maxcol = max(TYPE, DEVICE)
for line in lb.stdout:
bits = line.split()
if len(bits) > maxcol:
drive_type = bits[TYPE].decode("utf-8")
drive_device = bits[DEVICE].decode("utf-8")
drives.setdefault(drive_type, [])
drives[drive_type].append(drive_device)
return json.dumps(drives)
def cmdline(cmd):
process = Popen(args=cmd, stdout=PIPE, shell=True)
return process.communicate()[0]
def new_csv(f):
try:
col_names = []
col_names = [
"Index",
"DevicePath",
"Capacity",
"ModelNumber",
"SerialNumber",
"Firmware",
"Hostname",
"KernelVersion",
]
writer = csv.writer(f)
writer.writerow(col_names)
except OSError:
print("cannot write to ", f)
f.close()
sys.exit(1)
def print_nvme_line(f, data, hostname, kernel):
CAPACITY_KEY = 3
for datum in data:
device = datum["DevicePath"]
index = datum.get("Index", None)
if not index:
index = int(re.search(r"nvme(\d+)n", device).group(1))
syntax = "lsblk -rnb %s | grep disk" % device
capacity = cmdline(syntax).split()[CAPACITY_KEY]
try:
writer = csv.writer(f)
row = (
index,
datum["DevicePath"],
capacity,
datum["ModelNumber"],
datum["SerialNumber"],
datum["Firmware"],
hostname,
kernel,
)
writer.writerow(row)
except OSError:
print("cannot write to ", f)
f.close()
sys.exit(1)
def print_flash_line(f, data, hostname, kernel):
# Use flash_manager for legacy flash card support.
card_id = "card.1"
try:
writer = csv.writer(f)
writer.writerow(
(
data[card_id]["pci_address"],
data[card_id]["logical_location"],
data[card_id]["size"],
data[card_id]["board_name"],
data[card_id]["sn"],
data[card_id]["firmware_version"],
hostname,
kernel,
)
)
except OSError:
print("cannot write to ", f)
sys.exit(1)
def print_smart_line(f, data, hostname, kernel):
KEY = "1"
index = 1
while index - 1 <= len(data[KEY]):
sidx = str(index)
if data[sidx]["Rotation Rate:"] == "Solid State":
try:
writer = csv.writer(f)
writer.writerow(
(
index,
data[sidx]["Device Path:"],
data[sidx]["User Capacity:"],
data[sidx]["Device Model:"],
data[sidx]["Serial Number:"],
data[sidx]["Firmware Version:"],
hostname,
kernel,
)
)
except OSError:
print("cannot write to ", f)
sys.exit(1)
index += 1
def convert_nvme_output(
new_output: Dict[str, Any],
) -> list[Optional[Dict[str, Union[str, int]]]]:
"""
Convert the new nvme list -o json output to old format
Args:
new_output: nvme list -o json output in new format
Return:
old_format_list: old format
"""
controllers = new_output.get("Controllers", [])
old_format_list = []
for controller in controllers:
if "Namespaces" in controller and controller["Namespaces"]:
for namespace_info in controller["Namespaces"]:
# Create the old output format
old_format = {
"NameSpace": namespace_info.get("NSID"),
"DevicePath": f"/dev/{namespace_info.get('NameSpace')}",
"Firmware": controller.get("Firmware"),
"Index": int(controller.get("Controller").replace("nvme", "")),
"ModelNumber": controller.get("ModelNumber"),
"SerialNumber": controller.get("SerialNumber"),
"UsedBytes": namespace_info.get("UsedBytes"),
"MaximumLBA": namespace_info.get("MaximumLBA"),
"PhysicalSize": namespace_info.get("PhysicalSize"),
"SectorSize": namespace_info.get("SectorSize"),
}
old_format_list.append(old_format)
return old_format_list
def print_csv_line(f, data, tool):
hostname = cmdline("uname -n").decode("utf-8").rstrip()
kernel = cmdline("uname -r").decode("utf-8").rstrip()
# nvme tool will work for all NVMe flash devices
if tool == "nvme":
nvme_data = data["Devices"]
entry_list = []
for dr in nvme_data:
if "DevicePath" not in dr:
for output in dr.get("Subsystems", []):
entry_list.extend(convert_nvme_output(output))
nvme_data = entry_list or nvme_data
print_nvme_line(f, nvme_data, hostname, kernel)
elif tool == "flash_manager":
print_flash_line(f, data, hostname, kernel)
elif tool == "smartctl":
print_smart_line(f, data, hostname, kernel)
else:
sys.stderr.write(f"Error: tool '{tool}' not found.\n")
sys.exit(1)
def command_exist(cmd):
if cmd.split()[0] not in ["nvme", "flash_manager", "smartctl"]:
return False
args = shlex.split(cmd)
try:
subprocess.call(
args, stdout=open(os.devnull, "wb"), stderr=open(os.devnull, "wb")
)
except OSError:
print("%s command not installed" % cmd)
return False
test = cmdline(cmd)
if test.decode("UTF-8") == "":
return False
else:
return True
class GetFlashConfig:
def get_json(self):
if command_exist("nvme list"):
syntax = "nvme list -o json"
tool = "nvme"
args = shlex.split(syntax)
config = subprocess.check_output(args)
elif command_exist("flash_manager status"):
syntax = "flash_manager status --json"
tool = "flash_manager"
args = shlex.split(syntax)
config = subprocess.check_output(args)
elif command_exist("smartctl -i /dev/sdb"):
tool = "smartctl"
devices = drivesToJson()
data = json.loads(devices)
config = smartctlToJson(data)
else:
print("Flash configuration tool not found.")
sys.exit(1)
config_as_json = json.loads(config)
return config_as_json, tool
def json_to_csv(self, path, config, csv_file, tool):
out_file = os.path.join(path, csv_file)
with open(out_file, "w") as csv_out:
new_csv(csv_out)
print_csv_line(csv_out, config, tool)
print('Flash configuration filename is "%s"' % csv_file)
def main():
args = set_attributes()
config = GetFlashConfig()
config_as_json, tool = config.get_json()
config.json_to_csv(".", config_as_json, args.filename, tool)
if __name__ == "__main__":
main()
================================================
FILE: fiosynth_lib/health_tools.py
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
#
# AUTHOR = "Darryl Gardner <darryleg@fb.com>"
#
# health_tools.py- Logs Flash Health Tool Output to "health.log" file.
#
# A vendor specific health monitor tool will be executed and logged in
# "health.log" file. Log can be used to calculate write amplification factor.
#
# Input arguments:
# -s
# (Required) Enter Health Monitoring Tool Syntax
#
# pyre-unsafe
import argparse
import re
import shlex
import subprocess
def set_attributes():
#
# Attribute Table Definition
#
parser = argparse.ArgumentParser(
description='Logs Flash Health Tool Output to "health.log" file'
)
parser.add_argument(
"-s",
action="store",
dest="syntax",
type=str,
help="(Required) Enter Health Monitoring Tool Syntax (default = )",
required=True,
default="",
)
args = parser.parse_args()
return args
class HealthTools:
def logger(self, syntax):
allowed_commands = [
r"^smartctl\s+.*\s+/dev/[a-zA-Z0-9]+$",
r"^nvme\s+.*\s+/dev/[a-zA-Z0-9]+$",
]
try:
args = shlex.split(syntax)
except ValueError:
raise ValueError(f"Invalid syntax format: {syntax}")
command_str = " ".join(args)
if not any(re.match(pattern, command_str) for pattern in allowed_commands):
raise ValueError(f"Invalid or unauthorized command: {syntax}")
FILENAME = "health.log"
with open(FILENAME, "a") as file_:
subprocess.Popen(["date"], stdout=file_)
subprocess.Popen(args, stdout=file_)
def main():
args = set_attributes()
health = HealthTools()
health.logger(args.syntax)
if __name__ == "__main__":
main()
================================================
FILE: jobfiles/70_30.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randrw
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=${DEPTH}
rwmixread=70
rwmixwrite=30
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
numjobs=4
================================================
FILE: jobfiles/70_30_HE.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randrw
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=32
rwmixread=70
rwmixwrite=30
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=${JOBS}
rate_iops=17500,7500
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
[job1]
filename=${DEV}
[job2]
filename=${DEV}
[job3]
filename=${DEV}
================================================
FILE: jobfiles/70_30_LE.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randrw
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=32
rwmixread=70
rwmixwrite=30
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=${JOBS}
rate_iops=5250,1750
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
[job1]
filename=${DEV}
[job2]
filename=${DEV}
[job3]
filename=${DEV}
================================================
FILE: jobfiles/70_30_io_uring.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randrw
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=io_uring
iodepth=${DEPTH}
rwmixread=70
rwmixwrite=30
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
numjobs=4
================================================
FILE: jobfiles/70_30_libfio_ws.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[job]
rw=randrw
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=64m
ioengine=./libfio_ws_sn.so
iodepth=${DEPTH}
rwmixread=70
rwmixwrite=30
direct=1
loops=10000
invalidate=0
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=6
create_on_open=1
unlink=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gflags=--num_mounts=6 --num_chunks=100 --target_ip=${MISC} --target_port=12345 --target_parent_tier=ws.test --is_ssd_test=true --sn_fast_path --sn_read_bypass_cache
================================================
FILE: jobfiles/DRAMwTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
rate_iops=${RRATE},
rw=randread
iodepth=${DEPTH}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=100m
filename=${DEV}
================================================
FILE: jobfiles/FLeaf_noTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
rate_iops=${RRATE},
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
loops=2
[job0]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job2]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job3]
rw=randwrite
percentage_random=0,2,0
thinktime=${W1THINK}
thinktime_blocks=25
blocksize=512K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/FLeaf_wTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
rate_iops=${RRATE},
numjobs=${JOBS}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job2]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job4]
rw=randwrite
percentage_random=0,2,0
thinktime=${W1THINK}
thinktime_blocks=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job5]
rw=trim
size=10%
thinktime=${W2THINK}
thinktime_blocks=3
blocksize=2300M
filename=${DEV}
================================================
FILE: jobfiles/FLeaf_wTRIM_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=io_uring
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
rate=${RRATE}m,
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
loops=2
[job0]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job2]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job4]
rw=randwrite
percentage_random=0,2,0
thinktime=${W1THINK}
thinktime_blocks=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job5]
rw=trim
size=10%
thinktime=${W2THINK}
thinktime_blocks=3
blocksize=2300M
filename=${DEV}
================================================
FILE: jobfiles/FLeaf_wTRIM_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=${IOENGINE}
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
rate=${RRATE}m,
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
loops=2
[job0]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job2]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job4]
rw=randwrite
percentage_random=0,2,0
thinktime=${W1THINK}
thinktime_blocks=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job5]
rw=trim
size=10%
thinktime=${W2THINK}
thinktime_blocks=3
blocksize=2300M
filename=${DEV}
================================================
FILE: jobfiles/FLeaf_wTRIM_2H19.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
rate=${RRATE}m,
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
loops=2
[job0]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job2]
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job4]
rw=randwrite
percentage_random=0,2,0
thinktime=${W1THINK}
thinktime_blocks=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job5]
rw=trim
size=10%
thinktime=${W2THINK}
thinktime_blocks=3
blocksize=2300M
filename=${DEV}
================================================
FILE: jobfiles/HDD_70_30.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randrw
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=${DEPTH}
rwmixread=70
rwmixwrite=30
direct=1
loops=10000
invalidate=1
time_based
ramp_time=${RAMPTIME}
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/HDD_randread.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=${RAMPTIME}
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/HDD_randwrite.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=${RAMPTIME}
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/HDD_seqread.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=read
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=${RAMPTIME}
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/HDD_seqwrite.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=${RAMPTIME}
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/Max_Latency_ReadTrim.fio
================================================
[global]
direct=1
ioengine=libaio
time_based
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[trim-job]
rw=trim
bs=1m
iodepth=12
numjobs=1
offset=0
size=1G
offset_increment=0
[read-job]
rw=randread
bs=4k
iodepth=832
numjobs=4
offset=0
size=10G
offset_increment=0
[write-job]
rw=randwrite
bs=4k
iodepth=180
numjobs=1
offset=16G
size=${SIZE}
offset_increment=0
================================================
FILE: jobfiles/Max_Latency_write.fio
================================================
[global]
direct=1
ioengine=libaio
time_based
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[read-job]
rw=randread
bs=4k
iodepth=512
numjobs=2
offset=0
size=16G
offset_increment=0
[write-job]
rw=randwrite
bs=4k
iodepth=512
numjobs=1
offset=16G
size=${SIZE}
offset_increment=0
================================================
FILE: jobfiles/MyRocks_noTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
size=${SIZE}
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
iodepth=${DEPTH}
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
rate_iops=${RRATE},
[job1A]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=4K
filename=${DEV}
[job1B]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=32K
filename=${DEV}
[job1C]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=64
blocksize=64K
filename=${DEV}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=42
blocksize=512K
filename=${DEV}
================================================
FILE: jobfiles/MyRocks_noTRIM_2H19.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=80%
[job1A]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=4K
filename=${DEV}
size=${SIZE}
[job1B]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=32K
filename=${DEV}
size=${SIZE}
[job1C]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=64
blocksize=64K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=42
blocksize=512K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/MyRocks_wTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
rate_iops=${RRATE},
size=80%
[job1A]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=4K
filename=${DEV}
size=${SIZE}
[job1B]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=32K
filename=${DEV}
size=${SIZE}
[job1C]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=64
blocksize=64K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=42
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=3
thinktime_blocks=3
blocksize=1M
filename=${DEV}
[job4A]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=5
blocksize=8M
filename=${DEV}
[job4B]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=5
blocksize=16M
filename=${DEV}
================================================
FILE: jobfiles/MyRocks_wTRIM_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=io_uring
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=80%
[job1A]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=4K
filename=${DEV}
size=${SIZE}
[job1B]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=32K
filename=${DEV}
size=${SIZE}
[job1C]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=64
blocksize=64K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=42
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=3
thinktime_blocks=3
blocksize=1M
filename=${DEV}
[job4A]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=5
blocksize=8M
filename=${DEV}
[job4B]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=5
blocksize=16M
filename=${DEV}
================================================
FILE: jobfiles/MyRocks_wTRIM_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=${IOENGINE}
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=80%
[job1A]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=4K
filename=${DEV}
size=${SIZE}
[job1B]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=32K
filename=${DEV}
size=${SIZE}
[job1C]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=64
blocksize=64K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=42
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=3
thinktime_blocks=3
blocksize=1M
filename=${DEV}
[job4A]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=5
blocksize=8M
filename=${DEV}
[job4B]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=5
blocksize=16M
filename=${DEV}
================================================
FILE: jobfiles/MyRocks_wTRIM_2H19.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=80%
[job1A]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=4K
filename=${DEV}
size=${SIZE}
[job1B]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=32
blocksize=32K
filename=${DEV}
size=${SIZE}
[job1C]
rw=randwrite
percentage_random=0,33,0
thinktime=${W1THINK}
thinktime_blocks=64
blocksize=64K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=42
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=3
thinktime_blocks=3
blocksize=1M
filename=${DEV}
[job4A]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=5
blocksize=8M
filename=${DEV}
[job4B]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=5
blocksize=16M
filename=${DEV}
================================================
FILE: jobfiles/RR_SW_HE.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=${SIZE}
ioengine=libaio
iodepth=32
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
group_reporting=1
rate_iops=25000,
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
numjobs=${JOBS}
[job0]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
[job1]
rw=write
thinktime=1000000
thinktime_blocks=256
blocksize=512K
filename=${DEV}
[job2]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
[job3]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
[job4]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
================================================
FILE: jobfiles/RR_SW_LE.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=${SIZE}
ioengine=libaio
iodepth=32
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
rate_iops=7000,
numjobs=${JOBS}
[job0]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
[job1]
rw=write
thinktime=1000000
thinktime_blocks=256
blocksize=512K
filename=${DEV}
[job2]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
[job3]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
[job4]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
================================================
FILE: jobfiles/TypeVI.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=${SIZE}
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
rate_iops=${RRATE},
numjobs=${JOBS}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
rw=randread
iodepth=${DEPTH}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
================================================
FILE: jobfiles/TypeVI90.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
loops=2
[job0]
rate_iops=${RRATE},
rw=randread
iodepth=${DEPTH}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
size=${SIZE}
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/TypeVI90_precon.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
ss=bw_slope:0.1%
ss_dur=300
ss_ramp=${TIME}
loops=20
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/TypeVIII_Messenger_Movement.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
rate_iops=${RRATE},
rw=randread
iodepth=${DEPTH}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
size=${SIZE}
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=write
percentage_random=0,0,0
thinktime=${W3THINK}
thinktime_blocks=64
percentage_random=0
blocksize=524288
filename=${DEV}
size=${SIZE}
[job4]
rw=write
percentage_random=0,0,0
thinktime=${W3THINK}
thinktime_blocks=64
percentage_random=0
blocksize=1048576
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/TypeVIII_Messenger_Movement_precon.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
ss=bw_slope:0.1%
ss_dur=300
ss_ramp=${TIME}
loops=20
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=write
percentage_random=0,0,0
thinktime=${W3THINK}
thinktime_blocks=64
percentage_random=0
blocksize=524288
filename=${DEV}
size=${SIZE}
[job4]
rw=write
percentage_random=0,0,0
thinktime=${W3THINK}
thinktime_blocks=64
percentage_random=0
blocksize=1048576
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/TypeVIII_Messenger_Movement_wTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
rate_iops=${RRATE},
offset=${OFFSET2}m
rw=randread
iodepth=${DEPTH}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=write
percentage_random=0,0,0
thinktime=${W3THINK}
thinktime_blocks=64
percentage_random=0
blocksize=524288
filename=${DEV}
size=${SIZE}
[job4]
rw=write
percentage_random=0,0,0
thinktime=${W3THINK}
thinktime_blocks=64
percentage_random=0
blocksize=1048576
filename=${DEV}
size=${SIZE}
[job5]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=3
blocksize=4096K
filename=${DEV}
[job6]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=1
blocksize=4K
filename=${DEV}
[job7]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=1
blocksize=98304K
filename=${DEV}
[job8]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=2
blocksize=32768K
filename=${DEV}
[job9]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=3
blocksize=12288K
filename=${DEV}
================================================
FILE: jobfiles/TypeVIII_Messenger_Movement_wTRIM_precon.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
ss=bw_slope:0.1%
ss_dur=300
ss_ramp=${TIME}
loops=20
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=write
percentage_random=0,0,0
thinktime=${W3THINK}
thinktime_blocks=64
percentage_random=0
blocksize=524288
filename=${DEV}
size=${SIZE}
[job4]
rw=write
percentage_random=0,0,0
thinktime=${W3THINK}
thinktime_blocks=64
percentage_random=0
blocksize=1048576
filename=${DEV}
size=${SIZE}
[job5]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=3
blocksize=4096K
filename=${DEV}
[job6]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=1
blocksize=4K
filename=${DEV}
[job7]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=1
blocksize=98304K
filename=${DEV}
[job8]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=2
blocksize=32768K
filename=${DEV}
[job9]
startdelay=2s
rw=trim
size=10%
thinktime=${W4THINK}
iodepth=1
thinktime_blocks=3
blocksize=12288K
filename=${DEV}
================================================
FILE: jobfiles/TypeVI_Read.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=${SIZE}
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
rate_iops=${RRATE},
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
rw=randread
iodepth=${DEPTH}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
================================================
FILE: jobfiles/TypeVI_Read_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=${SIZE}
ioengine=io_uring
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
rate_iops=${RRATE}m,
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
rw=randread
iodepth=${DEPTH}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
numjobs=${JOBS}
loops=2
[job0]
offset=${OFFSET2}m
rate_iops=${RRATE},
rw=randread
iodepth=${DEPTH}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=io_uring
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
offset=${OFFSET2}m
rate=${RRATE}m,
rw=randread
percentage_random=65
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM_1H22_IOPS.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=io_uring
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
offset=${OFFSET2}m
rate=${RRATE}m,
rw=randread
percentage_random=65
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=2500
percentage_random=25
blocksize=${MISC}
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=2500
blocksize=${MISC}
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=${IOENGINE}
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
offset=${OFFSET2}m
rate=${RRATE}m,
rw=randread
percentage_random=65
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM_2H19.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
numjobs=${JOBS}
loops=2
[job0]
offset=${OFFSET2}m
rate=${RRATE}m,
rw=randread
percentage_random=65
iodepth=${DEPTH}
bssplit=${BLKSIZE}
filename=${DEV}
size=80%
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM_SIT.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
numjobs=${JOBS}
[job0]
rate_iops=${RRATE},
rw=randread
iodepth=${DEPTH}
bssplit=4k/50:16k/30:32k/20
filename=${DEV}
size=${SIZE}
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM_precon.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
ss=bw_slope:0.1%
ss_dur=300
ss_ramp=${TIME}
loops=20
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM_precon_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=io_uring
direct=1
invalidate=1
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
ss=bw_slope:0.1%
ss_dur=300
ss_ramp=${TIME}
loops=20
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/TypeVIwTRIM_precon_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=${IOENGINE}
direct=1
invalidate=1
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
ss=bw_slope:0.1%
ss_dur=300
ss_ramp=${TIME}
loops=20
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
startdelay=2s
rw=trim
size=10%
thinktime=${W3THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job4]
rw=trim
size=10%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/backup.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
size=${SIZE}
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[backup]
numjobs=1
iodepth=${DEPTH1}
rw=randwrite
percentage_random=,11,
blocksize=256k
rate=${RATE1}
[restore]
numjobs=30
iodepth=${DEPTH2}
percentage_random=99,,
rw=randread
bssplit=4k/1:16k/1:32k/1:64k/2:128k/89:256k/6
rate=${RATE2}
================================================
FILE: jobfiles/backup_write_journal.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=${SIZE}
ioengine=libaio
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[writes]
iodepth=${DEPTH1}
percentage_random=,50,
bssplit=,4k/9:8k/1:16k/1:32k/4:64k/64:128k/21
rw=write
filename=${DEV}
rate=${RATE1}
[trims]
iodepth=${DEPTH2}
rw=trim
bssplit=,,512k/1:2m/2:4m/1:8m/4:16m/6:32m/15:64m/70:128m/1
filename=${DEV}
rate=${RATE2}
================================================
FILE: jobfiles/bcache.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[BigC_read_main]
rate=${RRATE}m
rw=randread
percentage_random=94,0,0
iodepth=${DEPTH}
bssplit = ${BLKSIZE}
filename=${DEV}
size=95%
[BigC_read_burst]
rw=randread
percentage_random=94,0,0
thinktime=${W1THINK}
thinktime_blocks=600
blocksize=128K
filename=${DEV}
size=${SIZE}
[BigC_write_1]
rw=randwrite
percentage_random=0,10,0
thinktime=${W2THINK}
thinktime_blocks=32
blocksize=2M
filename=${DEV}
size=${SIZE}
[BigC_write_2]
startdelay=2s
rw=randwrite
percentage_random=0,10,0
thinktime=${W3THINK}
thinktime_blocks=32
blocksize=2M
filename=${DEV}
size=${SIZE}
[kworker]
startdelay=30s
rw=randwrite
percentage_random=0,10,0
thinktime=${W4THINK}
thinktime_blocks=3000
blocksize=128K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/bcache_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=io_uring
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[BigC_read_main]
rate=${RRATE}m
rw=randread
percentage_random=94,0,0
iodepth=${DEPTH}
bssplit = ${BLKSIZE}
filename=${DEV}
size=95%
[BigC_read_burst]
rw=randread
percentage_random=94,0,0
thinktime=${W1THINK}
thinktime_blocks=600
blocksize=128K
filename=${DEV}
size=${SIZE}
[BigC_write_1]
rw=randwrite
percentage_random=0,10,0
thinktime=${W2THINK}
thinktime_blocks=32
blocksize=2M
filename=${DEV}
size=${SIZE}
[BigC_write_2]
startdelay=2s
rw=randwrite
percentage_random=0,10,0
thinktime=${W3THINK}
thinktime_blocks=32
blocksize=2M
filename=${DEV}
size=${SIZE}
[kworker]
startdelay=30s
rw=randwrite
percentage_random=0,10,0
thinktime=${W4THINK}
thinktime_blocks=3000
blocksize=128K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/bcache_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=${IOENGINE}
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[BigC_read_main]
rate=${RRATE}m
rw=randread
percentage_random=94,0,0
iodepth=${DEPTH}
bssplit = ${BLKSIZE}
filename=${DEV}
size=95%
[BigC_read_burst]
rw=randread
percentage_random=94,0,0
thinktime=${W1THINK}
thinktime_blocks=600
blocksize=128K
filename=${DEV}
size=${SIZE}
[BigC_write_1]
rw=randwrite
percentage_random=0,10,0
thinktime=${W2THINK}
thinktime_blocks=32
blocksize=2M
filename=${DEV}
size=${SIZE}
[BigC_write_2]
startdelay=2s
rw=randwrite
percentage_random=0,10,0
thinktime=${W3THINK}
thinktime_blocks=32
blocksize=2M
filename=${DEV}
size=${SIZE}
[kworker]
startdelay=30s
rw=randwrite
percentage_random=0,10,0
thinktime=${W4THINK}
thinktime_blocks=3000
blocksize=128K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/bursttrim.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=0
size=${SIZE}
ioengine=libaio
direct=1
invalidate=1
time_based
runtime=${TIME}
ramp_time=30s
norandommap
randrepeat=0
buffer_compress_percentage=0
group_reporting=1
numjobs=${JOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[writer]
rate_iops=${RRATE}
rw=randwrite
iodepth=8
blocksize=4k
filename=${DEV}
[trimmer]
rw=randtrim
bssplit=${BLKSIZE}
iodepth=${DEPTH}
thinktime=${W4THINK}
thinktime_blocks=${DEPTH}
filename=${DEV}
================================================
FILE: jobfiles/coldstorage.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
size=100%
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[job0]
numjobs=1
iodepth=26
rw=randrw
rwmixread=94
percentage_random=9,27,
bssplit=4k/11:8k/4:16k/1:64k/2:128k/1:256k/2:512k/29:1m/50,4k/29:8k/3:64k/1:128k/1:256k/4:512k/21:1m/41
================================================
FILE: jobfiles/drive_fill.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
# Drive fill template for preconditioning
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=1
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/gen.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=${RANDRW}
rwmixread=${RWMIXREAD}
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=${IOENGINE}
iodepth=${DEPTH}
direct=1
loops=1
invalidate=1
time_based
ramp_time=${RAMP}
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=${NUMJOBS}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/gen_prep_flash.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=200%
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=1
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/gen_randread.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=1
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/gen_randrw.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randrw
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=1
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/gen_randrw_70_30.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randrw
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
rwmixread=70
rwmixwrite=30
direct=1
loops=1
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/gen_randwrite.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=1
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/gen_read.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=read
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=1
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/gen_write.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=1
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/idyno.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
filename=${DEV}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[pkg_proxy_read]
numjobs=1
iodepth=5
offset=10%
rw=randread
percentage_random=41,0
bssplit=16k/1:32k/2:64k/32:128k/6:256k/43:512k/6:1m/10,
rate=${RATE1}m
[pkg_proxy_write]
numjobs=1
iodepth=2
rw=randwrite
percentage_random=0,14
bssplit=,64k/10:128k/5:256k/60:512k/10:1m/15,
thinktime=${W1THINK}
thinktime_blocks=40
[pkg_proxy_write_burst]
numjobs=1
iodepth=1
rw=randwrite
percentage_random=0,14
bssplit=,16k/1:32k/2:64k/6:128k/5:256k/61:512k/12:1m/13,
thinktime=${W2THINK}
thinktime_blocks=2400
startdelay=30s
[rocksdb_low_read]
numjobs=1
iodepth=53
offset=10%
rw=randread
percentage_random=97,0
bssplit=4k/29:8k/26:16k/19:32k/11:64k/7:128k/5:256k/3
thinktime=${W2THINK}
thinktime_blocks=3400
startdelay=60s
[rocksdb_low_write]
numjobs=1
iodepth=1
rw=randwrite
percentage_random=0,2
bssplit=,32k/1:64k/1:128k/2:256k/73:1024k/22
thinktime=${W2THINK}
thinktime_blocks=214
startdelay=59s
[fs-transacti]
numjobs=1
iodepth=5
rw=randwrite
percentage_random=0,92
bssplit=,32k/40:64k/30:128k/15:256k/15
thinktime=${W3THINK}
thinktime_blocks=40
[kworker]
numjobs=1
iodepth=1
rw=randwrite
percentage_random=0,50
bssplit=,4k/10:16k/10:32k/60:256k/10:512k/10
thinktime=${W1THINK}
thinktime_blocks=10
[trims]
numjobs=1
iodepth=1
size=10%
rw=trim
bssplit=,,32K/100
thinktime=${W1THINK}
thinktime_blocks=4
================================================
FILE: jobfiles/idyno_sweep.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
filename=${DEV}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[pkg_proxy_read]
numjobs=1
iodepth=5
offset=10%
rw=randread
percentage_random=41,0
bssplit=16k/1:32k/2:64k/32:128k/6:256k/43:512k/6:1m/10,
rate=${RATE1}m
[pkg_proxy_write]
numjobs=1
iodepth=2
rw=randwrite
percentage_random=0,14
bssplit=,64k/10:128k/5:256k/60:512k/10:1m/15,
thinktime=${W1THINK}
thinktime_blocks=40
[pkg_proxy_write_burst]
numjobs=1
iodepth=1
rw=randwrite
percentage_random=0,14
bssplit=,16k/1:32k/2:64k/6:128k/5:256k/61:512k/12:1m/13,
thinktime=${W2THINK}
thinktime_blocks=2400
startdelay=30s
[rocksdb_low_read]
numjobs=1
iodepth=53
offset=10%
rw=randread
percentage_random=97,0
bssplit=4k/29:8k/26:16k/19:32k/11:64k/7:128k/5:256k/3
thinktime=${W4THINK}
thinktime_blocks=3400
startdelay=60s
[rocksdb_low_write]
numjobs=1
iodepth=1
rw=randwrite
percentage_random=0,2
bssplit=,32k/1:64k/1:128k/2:256k/74:1024k/22
thinktime=${W2THINK}
thinktime_blocks=214
startdelay=59s
[fs-transacti]
numjobs=1
iodepth=5
rw=randwrite
percentage_random=0,92
bssplit=,32k/40:64k/30:128k/15:256k/15
thinktime=${W3THINK}
thinktime_blocks=40
[kworker]
numjobs=1
iodepth=1
rw=randwrite
percentage_random=0,50
bssplit=,4k/10:16k/10:32k/60:256k/10:512k/10
thinktime=${W1THINK}
thinktime_blocks=10
[trims]
numjobs=1
iodepth=1
size=10%
rw=trim
bssplit=,,32K/100
thinktime=${W5THINK}
thinktime_blocks=4
================================================
FILE: jobfiles/neargpu_tlc_ssd.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
# Near-GPU TLC SSD generic workload template
[global]
rw=${RANDRW}
blocksize=${BLKSIZE}
size=${SIZE}
ioengine=io_uring
iodepth=${DEPTH}
direct=${DIRECT}
time_based
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
numjobs=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/prep.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=2
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/prep_flash.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=2
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/prep_flash_io_uring.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=2
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/prep_flash_io_uring_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=${IOENGINE}
iodepth=${DEPTH}
direct=1
loops=2
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/prep_flash_rand.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=2
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/prep_flash_rand_io_uring.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=2
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/prep_flash_rand_libfio_ws.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[job]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=64m
ioengine=./libfio_ws_sn.so
iodepth=${DEPTH}
direct=1
loops=2
invalidate=0
group_reporting=1
runtime=120
time_based=1
do_verify=0
numjobs=6
create_on_open=1
unlink=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gflags=--num_mounts=6 --num_chunks=100 --target_ip=${MISC} --target_port=12345 --target_parent_tier=ws.test --is_ssd_test=true --sn_fast_path --sn_read_bypass_cache
================================================
FILE: jobfiles/prep_io_uring.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=2
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/prep_libfio_ws.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[job]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=64m
ioengine=./libfio_ws_sn.so
iodepth=${DEPTH}
direct=1
loops=2
invalidate=0
group_reporting=1
numjobs=6
create_on_open=1
unlink=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gflags=--num_mounts=6 --num_chunks=100 --target_ip=${MISC} --target_port=12345 --target_parent_tier=ws.test --is_ssd_test=true --sn_fast_path --sn_read_bypass_cache
================================================
FILE: jobfiles/prep_neargpu_rand_write.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
# Near-GPU TLC SSD preconditioning 2x random write (4KB)
[global]
rw=randwrite
blocksize=4K
size=100%
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=2
group_reporting=1
numjobs=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/prep_neargpu_seq_write.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
# Near-GPU TLC SSD preconditioning sequential write (256KB)
[global]
rw=write
blocksize=256K
size=${SIZE}
ioengine=io_uring
iodepth=${DEPTH}
direct=1
group_reporting=1
numjobs=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/prep_rand.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=100%
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=2
invalidate=1
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/randread.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/randread_io_uring.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/randread_io_uring_1H26.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=8
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/randread_libfio_ws.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[job]
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=./libfio_ws_sn.so
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=0
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=6
create_on_open=1
unlink=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gflags=--num_mounts=6 --num_chunks=100 --target_ip=${MISC} --target_port=12345 --target_parent_tier=ws.test --is_ssd_test=true --sn_fast_path --sn_read_bypass_cache
================================================
FILE: jobfiles/randwrite.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/randwrite_io_uring.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/randwrite_libfio_ws.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[job]
rw=randwrite
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=./libfio_ws_sn.so
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=0
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
numjobs=6
create_on_open=1
unlink=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gflags=--num_mounts=6 --num_chunks=100 --target_ip=${MISC} --target_port=12345 --target_parent_tier=ws.test --is_ssd_test=true --sn_fast_path --sn_read_bypass_cache
================================================
FILE: jobfiles/readhammer.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
# Read from 32 different regions of a flash device.
# Each job will read continuously from a 16MB logical
# region of the flash device.
[global]
bs=${BLKSIZE}
direct=1
rw=read
ioengine=libaio
iodepth=${DEPTH}
loops=1000000000
time_based
runtime=3600s
group_reporting=1
offset=${OFFSET1}m
offset_increment=${INCREMENT}m
numjobs=32
size=128M
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/rsw_burst.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[background]
numjobs=2
iodepth=1
rw=randrw
rwmixwrite=94
percentage_random=99,96
bssplit=,4k/87:8k/10:32K/1:64K/1:128K/1,
rate=3k,44k
[burst]
numjobs=1
iodepth=10
rw=randread
percentage_random=97
bssplit=4k/88:8k/1:16K/1:32K/1:64K/4:128K/5,
thinktime=${W1THINK}
thinktime_blocks=33700
================================================
FILE: jobfiles/rsw_cp.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=100%
ioengine=libaio
direct=1
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[swap]
rw=randwrite
iodepth=60
blocksize=4k
rate_iops=${RATE1}
[cp_read]
iodepth=1
rw=randrw
rwmixread=100
percentage_random=70
bssplit=4k/10:256k/90
rate=${RATE2}m
[cp_write]
iodepth=1
rw=randrw
rwmixread=0
percentage_random=20
bssplit=4k/100
rate=${DEPTH1}m
numjobs=4
================================================
FILE: jobfiles/rsw_cp_precon.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=100%
ioengine=libaio
direct=1
loops=10000
invalidate=1
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
group_reporting=1
random_generator=tausworthe64
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
loops=1
[swap]
rw=randwrite
iodepth=60
blocksize=4k
rate_iops=${RATE1}
[cp_read]
iodepth=1
rw=randrw
rwmixread=100
percentage_random=70
bssplit=4k/10:256k/90
rate=${RATE2}m
[cp_write]
iodepth=1
rw=randrw
rwmixread=0
percentage_random=20
bssplit=4k/100
rate=${DEPTH1}m
numjobs=4
================================================
FILE: jobfiles/rsw_cp_vtrim.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[swap]
rw=randwrite
iodepth=60
blocksize=4k
rate_iops=${RATE1}
size=100%
[cp_read]
offset=10%
iodepth=1
rw=randrw
rwmixread=100
percentage_random=70
bssplit=4k/10:256k/90
rate=${RATE2}m
size=${SIZE}
[cp_write]
iodepth=1
rw=randrw
rwmixread=0
percentage_random=20
bssplit=4k/100
rate=${DEPTH1}m
numjobs=4
size=100%
[trim1]
numjobs=4
iodepth=4
rw=trim
size=10%
bssplit=${MISC}
thinktime=${W1THINK}
thinktime_blocks=240
[trim2]
iodepth=1
rw=trim
size=10%
bssplit=,,8M/25:32M/75
thinktime=${W2THINK}
thinktime_blocks=4
================================================
FILE: jobfiles/rsw_cp_wtrim.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[swap]
rw=randwrite
iodepth=60
blocksize=4k
thinktime=${W3THINK}
thinktime_blocks=130
size=100%
[cp_read]
offset=10%
iodepth=1
rw=randrw
rwmixread=100
percentage_random=70
bssplit=4k/10:256k/90
rate=${RATE2}m
numjobs=3
size=${SIZE}
[cp_write]
iodepth=3
rw=randwrite
percentage_random=100
bssplit=256K/33:512K/33:2M/33
thinktime=${W4THINK}
thinktime_blocks=3
numjobs=4
size=100%
[trim1]
numjobs=4
iodepth=4
rw=trim
size=10%
bssplit=,,4K/12:8K/6:16K/3:64K/1:512K/1:8M/22:16M/20:32M/21:64M/14
thinktime=${W1THINK}
thinktime_blocks=240
[trim2]
iodepth=1
rw=trim
size=10%
bssplit=,,8M/25:32M/75
thinktime=${W2THINK}
thinktime_blocks=4
================================================
FILE: jobfiles/search2.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
size=${SIZE}
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate_iops=${RRATE}
[job1]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
percentage_random=25
blocksize=512K
filename=${DEV}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
================================================
FILE: jobfiles/search3.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
size=${SIZE}
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
iodepth=${DEPTH}
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
rate_iops=${RRATE},
[job1]
numjobs=10
iodepth=100
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=1024
blocksize=8K
filename=${DEV}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
blocksize=512K
filename=${DEV}
[job3]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
================================================
FILE: jobfiles/searchdoc_noTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
iodepth=${DEPTH}
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
rate_iops=${RRATE},
size=${SIZE}
[job1]
numjobs=10
iodepth=100
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=1024
blocksize=8K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/searchdoc_wTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
rate_iops=${RRATE},
size=95%
[job1]
offset=${OFFSET2}m
numjobs=10
iodepth=100
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=1024
blocksize=8K
filename=${DEV}
size=95%
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job4]
startdelay=2s
rw=trim
size=5%
thinktime=${W5THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job5]
rw=trim
size=5%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/searchindex_noTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[job0]
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=${SIZE}
[job1]
numjobs=10
iodepth=100
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=1024
blocksize=8K
filename=${DEV}
size=${SIZE}
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
================================================
FILE: jobfiles/searchindex_wTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=95%
[job1]
offset=${OFFSET2}m
numjobs=10
iodepth=100
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=1024
blocksize=8K
filename=${DEV}
size=95%
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job4]
startdelay=2s
rw=trim
size=5%
thinktime=${W5THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job5]
rw=trim
size=5%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/searchindex_wTRIM_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=io_uring
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=95%
[job1]
offset=${OFFSET2}m
numjobs=10
iodepth=100
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=1024
blocksize=8K
filename=${DEV}
size=95%
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job4]
startdelay=2s
rw=trim
size=5%
thinktime=${W5THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job5]
rw=trim
size=5%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/searchindex_wTRIM_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=${IOENGINE}
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=95%
[job1]
offset=${OFFSET2}m
numjobs=10
iodepth=100
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=1024
blocksize=8K
filename=${DEV}
size=95%
[job2]
rw=randwrite
percentage_random=0,25,0
thinktime=${W1THINK}
thinktime_blocks=128
blocksize=512K
filename=${DEV}
size=${SIZE}
[job3]
rw=randwrite
percentage_random=0,25,0
thinktime=${W2THINK}
thinktime_blocks=160
blocksize=512K
filename=${DEV}
size=${SIZE}
[job4]
startdelay=2s
rw=trim
size=5%
thinktime=${W5THINK}
iodepth=10
thinktime_blocks=10
blocksize=64M
filename=${DEV}
[job5]
rw=trim
size=5%
thinktime=${W4THINK}
thinktime_blocks=1
blocksize=2G
filename=${DEV}
================================================
FILE: jobfiles/searchlm_wTRIM.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=95%
[job1]
offset=${OFFSET2}m
numjobs=5
iodepth=50
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=256
bssplit=${BLKSIZE}
filename=${DEV}
size=95%
[job2]
rw=randwrite
percentage_random=0,2,0
thinktime=${W2THINK}
thinktime_blocks=150
blocksize=512K
filename=${DEV}
size=${SIZE}
[job4]
startdelay=30s
rw=trim
size=5%
thinktime=${W1THINK}
thinktime_blocks=15
blocksize=64M
filename=${DEV}
[job5]
startdelay=35s
rw=trim
size=5%
thinktime=${W1THINK}
thinktime_blocks=3
blocksize=1G
filename=${DEV}
================================================
FILE: jobfiles/searchlm_wTRIM_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=io_uring
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=95%
[job1]
offset=${OFFSET2}m
numjobs=5
iodepth=50
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=256
bssplit=${BLKSIZE}
filename=${DEV}
size=95%
[job2]
rw=randwrite
percentage_random=0,2,0
thinktime=${W2THINK}
thinktime_blocks=150
blocksize=512K
filename=${DEV}
size=${SIZE}
[job4]
startdelay=30s
rw=trim
size=5%
thinktime=${W1THINK}
thinktime_blocks=15
blocksize=64M
filename=${DEV}
[job5]
startdelay=35s
rw=trim
size=5%
thinktime=${W1THINK}
thinktime_blocks=3
blocksize=1G
filename=${DEV}
================================================
FILE: jobfiles/searchlm_wTRIM_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=${IOENGINE}
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[job0]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=95%
[job1]
offset=${OFFSET2}m
numjobs=5
iodepth=50
rw=randread
percentage_random=100,0,0
thinktime=${W3THINK}
thinktime_blocks=256
bssplit=${BLKSIZE}
filename=${DEV}
size=95%
[job2]
rw=randwrite
percentage_random=0,2,0
thinktime=${W2THINK}
thinktime_blocks=150
blocksize=512K
filename=${DEV}
size=${SIZE}
[job4]
startdelay=30s
rw=trim
size=5%
thinktime=${W1THINK}
thinktime_blocks=15
blocksize=64M
filename=${DEV}
[job5]
startdelay=35s
rw=trim
size=5%
thinktime=${W1THINK}
thinktime_blocks=3
blocksize=1G
filename=${DEV}
================================================
FILE: jobfiles/seqread.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=read
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/seqread_io_uring.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=read
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/seqread_libfio_ws.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[job]
rw=read
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=./libfio_ws_sn.so
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=0
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=6
create_on_open=1
unlink=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gflags=--num_mounts=6 --num_chunks=100 --target_ip=${MISC} --target_port=12345 --target_parent_tier=ws.test --is_ssd_test=true --sn_fast_path --sn_read_bypass_cache
================================================
FILE: jobfiles/seqwrite.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=libaio
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/seqwrite_io_uring.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=io_uring
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=1
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=4
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/seqwrite_libfio_ws.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[job]
rw=write
blocksize=${BLKSIZE}
blockalign=${BLKSIZE}
size=${SIZE}
ioengine=./libfio_ws_sn.so
iodepth=${DEPTH}
direct=1
loops=10000
invalidate=0
time_based
ramp_time=30s
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
numjobs=6
create_on_open=1
unlink=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gflags=--num_mounts=6 --num_chunks=100 --target_ip=${MISC} --target_port=12345 --target_parent_tier=ws.test --is_ssd_test=true --sn_fast_path --sn_read_bypass_cache
================================================
FILE: jobfiles/seqwrite_write_journal.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
size=${SIZE}
ioengine=libaio
direct=1
loops=10000
invalidate=1
ramp_time=30s
time_based
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
numjobs=${JOBS}
[writes]
iodepth=${DEPTH1}
percentage_random=,63,
bssplit=,4k/1:32k/1:64k/49:128k/49
rw=write
filename=${DEV}
rate=${RATE1}
[trims]
iodepth=${DEPTH2}
rw=trim
bssplit=,,2m/1:4m/1:8m/2:16m/8:32m/17:64m/54:128m/17
filename=${DEV}
rate=${RATE2}
================================================
FILE: jobfiles/stacking.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
ioengine=libaio
direct=1
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
group_reporting=1
random_generator=tausworthe64
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
[rd-hashd]
offset=10%
rw=randread
iodepth=60
bssplit=4K/60:8K/7:16K/9:32K/9:64K/7:128K/7:256K/1
rate=${RATE1}m
size=90%
[kswapd]
iodepth=2
rw=randrw
rwmixread=0
percentage_random=0
blocksize=4K
size=${SIZE}
thinktime=${W1THINK}
thinktime_blocks=500
[kworker_write]
iodepth=80
rw=randrw
rwmixread=0
percentage_random=20
bssplit=4k/26:8K/6:16K/1:32K/2:64K/3:128K/7:256K/21:512K/12:1M/22
numjobs=1
size=100%
thinktime=${W2THINK}
thinktime_blocks=500
[trim1]
numjobs=4
iodepth=2
rw=trim
size=10%
bssplit=,,64MB
thinktime=${W3THINK}
thinktime_blocks=1
[trim2]
iodepth=1
rw=trim
size=10%
bssplit=,,2M/75:4M/25
thinktime=${W4THINK}
thinktime_blocks=4
================================================
FILE: jobfiles/trim.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
rw=trim
bs=${BLKSIZE}
loops=2
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/trim_libfio_ws.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[job]
rw=trim
bs=${BLKSIZE}
loops=2
size=${SIZE}
invalidate=0
numjobs=6
create_on_open=1
ioengine=./libfio_ws_sn.so
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gflags=--num_mounts=6 --num_chunks=100 --target_ip=${MISC} --target_port=12345 --target_parent_tier=ws.test --is_ssd_test=true --sn_fast_path --sn_read_bypass_cache
================================================
FILE: jobfiles/trimrate.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
bs=${BLKSIZE}
rw=randtrim
time_based
runtime=1m
group_reporting=1
numjobs=${JOBS}
size=100%
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
[job0]
filename=${DEV}
================================================
FILE: jobfiles/twfeed.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[small_writes]
numjobs=1
iodepth=1
rw=randwrite
blocksize=,4k,
rate=,2275,
[trims]
numjobs=1
iodepth=1
rw=trim
size=10%
bssplit=,,4k/58:8k/33:16k/5:32K/1:64K/1:128K/1:2048k/1
rate_iops=,1,
[background]
numjobs=1
iodepth=24
rw=randwrite
bssplit=,4k/81:8k/10:16k/2:32k/1:64k/2:128k/1:1024k/1,
rate=,144k,
[burst]
numjobs=1
iodepth=1
rw=write
blocksize=,4k/15:1024k:85,
thinktime_blocks=100
thinktime=${W1THINK}
================================================
FILE: jobfiles/twi_iris.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
ramp_time=${RAMPTIME}
offset=10%
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[loop_num]
numjobs=3
iodepth=3
rw=randrw
rwmixread=100
percentage_random=92
bssplit=4k/4:8k/1:16k/1:32k/1:36k-60k/29:64k/8:68k-124k/42:132k-252k/8:256k/1:260k-508k/3
rate_iops=${RATE1}
[btrfs]
numjobs=10
iodepth=3
rw=randwrite
bssplit=,4k/1:16k/29:32k/26:36k-60k/6:64k/8:68k-124k/8:132k-252k/4:256k/13:260k-508k/2,
thinktime=${W1THINK}
thinktime_blocks=125
[rocksdb]
numjobs=1
iodepth=56
rw=randrw
rwmixread=52
percentage_random=77,54
bssplit=4k/25:8k/13:12k/8:16k/6:20k-28k/9:32k/4:36k-60k/5:64k-128k/4:132k-512k/9:516k-1m/16:1m/1,4k/3:16k/5:20k-28k/4:32k/19:36k-64k/2:68k-256k/2:260k-512k/2:516k-1m/61:1m/2
rate=${RATE2}
[squashfuse_ll]
startdelay=15s
iodepth=20
rw=randrw
rwmixread=100
percentage_random=95
bssplit=4k/28:8k/12:12k/7:16k/6:20k-28k/10:32k/3:36k-60k/10:64k-128k/14:132k-256k/4:260k-512k/2:516k-1m/3:1m/1
thinktime=${W3THINK}
thinktime_blocks=200
[fbpkg]
numjobs=3
iodepth=4
rw=randrw
rwmixread=74
percentage_random=66,97
bssplit=16k/75:20k-128/4:132k-256k/2:260k-508k/3:512k/12:516k-1m/3:1m/1,16k/56:32k/3:36k-60k/2:64k/2:68k-124k/4:128k/1:132k-256k/16:260k-508k/4:512k/8:516k-1m/4
rate=${DEPTH2}
[trims]
numjobs=10
iodepth=8
offset=0
size=10%
rw=trim
bssplit=,,4k/12:8k/19:16k/9:32k/35:64k/13:128k/4:256k/7:512k/1
thinktime=${W2THINK}
thinktime_blocks=150
================================================
FILE: jobfiles/twi_iris_precon.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
offset=10%
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
loops=1
[btrfs]
numjobs=2
iodepth=3
rw=randwrite
bssplit=,4k/1:16k/29:32k/26:36k-60k/6:64k/8:68k-124k/8:132k-252k/4:256k/13:260k-508k/2,
thinktime=${W1THINK}
thinktime_blocks=125
[rocksdb]
numjobs=1
iodepth=56
rw=randrw
rwmixread=0
percentage_random=77,54
bssplit=4k/25:8k/13:12k/8:16k/6:20k-28k/9:32k/4:36k-60k/5:64k-128k/4:132k-512k/9:516k-1m/16:1m/1,4k/3:16k/5:20k-28k/4:32k/19:36k-64k/2:68k-256k/2:260k-512k/2:516k-1m/61:1m/2
rate=${RATE2}
[fbpkg]
numjobs=1
iodepth=4
rw=randrw
rwmixread=0
percentage_random=66,97
bssplit=16k/75:20k-128/4:132k-256k/2:260k-508k/3:512k/12:516k-1m/3:1m/1,16k/56:32k/3:36k-60k/2:64k/2:68k-124k/4:128k/1:132k-256k/16:260k-508k/4:512k/8:516k-1m/4
rate=${DEPTH2}
[trims]
numjobs=4
iodepth=8
offset=0
size=10%
rw=trim
bssplit=,,4k/12:8k/19:16k/9:32k/35:64k/13:128k/4:256k/7:512k/1
thinktime=${W2THINK}
thinktime_blocks=150
================================================
FILE: jobfiles/twshared-pkg.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[pkg_fetch_read]
numjobs=1
iodepth=5
offset=10%
rw=randread
percentage_random=44,0
bssplit=16k/70:32k/2:64k/3:128k/4:256k/4:512k/17
thinktime=${W1THINK}
thinktime_blocks=600
[kworker_read]
numjobs=1
iodepth=1
offset=10%
rw=randread
percentage_random=62,0
bssplit=16k/40:32k/1:64k/2:128k/3:256k/3:512k/50:1024k/1
rate=${RATE1}m
[kworker_write]
numjobs=1
iodepth=1
rw=randwrite
percentage_random=0,99
bssplit=,16k/17:32k/8:64k/32:128k/29:256k/12:512k/2
thinktime=${W2THINK}
thinktime_blocks=600
[trims]
startdelay=2s
numjobs=1
iodepth=1
size=10%
rw=trim
bssplit=,,4k/1:8k/3:16k/54:32k/14:64k/11:128k/4:256k/7:512k/5:1m/1
thinktime=${W3THINK}
thinktime_blocks=1000
================================================
FILE: jobfiles/twshared.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[read_write]
numjobs=1
iodepth=3
offset=10%
rw=randrw
rwmixwrite=49
percentage_random=81,86
bssplit=4k/21:8k/11:16k/44:32k/8:64k/4:128k/3:256k/3:512k/3:1024k/3,4k/20:8k/6:16k/23:32k/13:64k/7:128k/4:256k/9:512k/5:1024k/13,
rate=${RATE1}
[trims]
numjobs=1
iodepth=1
size=10%
rw=trim
bssplit=,,4k/7:8k/4:16k/45:32k/20:64k/8:128k/4:256k/9:512k/1:4m/1:64m/1
thinktime=${W1THINK}
thinktime_blocks=750
================================================
FILE: jobfiles/udb_boot.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[writes]
rw=randwrite
percentage_random=,92,
iodepth=128
bssplit=,4k/69:8k/4:12k-16k/5.:20k-28k/3:32k-60k/3:64k-124k/2:128k-252k/1:256k-508k/6:512k-1000k/1:1m/6,
thinktime_blocks=1000
thinktime=${W1THINK}
[reads]
rw=randread
percentage_random=75,,
offset=10%
bssplit=4k/44:8k/5:12k/3:16k/5:20k-30k/4:32k/2:36k-60k/5:64k/1:68k-124k/10:128k/17:132k-256k/4,,
thinktime_blocks=5000
thinktime=${W2THINK}
[trims]
numjobs=1
iodepth=1
size=10%
rw=trim
bssplit=,,4k/51:8k/30:16k/10:32k/1:64k/1:256k/1:512k/1:1m/1:2m/2:4m/1:8m/1
thinktime=${W1THINK}
thinktime_blocks=20
================================================
FILE: jobfiles/wildcard.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[read_thread_poo1]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
percentage_random=84,0,0
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=${SIZE}
[read_thread_poo2]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
percentage_random=84,0,0
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=${SIZE}
[xfsaild]
rw=randwrite
percentage_random=0,55,0
thinktime=30000000
thinktime_blocks=50
numjobs=4
iodepth=50
bssplit=4K/50:8K/50
filename=${DEV}
size=${SIZE}
[rocksdb]
rw=randwrite
percentage_random=0,55,0
thinktime=${W1THINK}
thinktime_blocks=1
blocksize=1M
filename=${DEV}
size=${SIZE}
[kworker]
rw=randwrite
percentage_random=0,2,0
thinktime=5000000
thinktime_blocks=30
iodepth=30
blocksize=1M
filename=${DEV}
[rlog]
rw=randwrite
percentage_random=0,44,0
thinktime=${W3THINK}
thinktime_blocks=8
blocksize=1M
filename=${DEV}
size=${SIZE}
[trim_small]
rw=trim
size=10%
thinktime=${W2THINK}
thinktime_blocks=1
blocksize=8M
filename=${DEV}
[trim_med]
startdelay=1s
rw=trim
size=10%
thinktime=${W3THINK}
thinktime_blocks=1
blocksize=64M
filename=${DEV}
[trim_large]
startdelay=720s
rw=trim
size=10%
rate=200m
blocksize=20M
================================================
FILE: jobfiles/wildcard_normal.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
runtime=${TIME}
group_reporting=1
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
filename=${DEV}
numjobs=${JOBS}
ramp_time=30s
[read_thread_poo1]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
percentage_random=84,0,0
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=${SIZE}
[read_thread_poo2]
offset=${OFFSET2}m
iodepth=${DEPTH}
rw=randread
percentage_random=84,0,0
bssplit=${BLKSIZE}
rate=${RRATE}m,
size=${SIZE}
[xfsaild]
rw=randwrite
percentage_random=0,55,0
thinktime=30000000
thinktime_blocks=50
numjobs=4
iodepth=50
bssplit=4K/50:8K/50
filename=${DEV}
size=${SIZE}
[rocksdb]
rw=randwrite
percentage_random=0,55,0
thinktime=${W1THINK}
thinktime_blocks=1
blocksize=1M
filename=${DEV}
size=${SIZE}
[kworker]
rw=randwrite
percentage_random=0,2,0
thinktime=5000000
thinktime_blocks=15
iodepth=15
blocksize=1M
filename=${DEV}
[rlog]
rw=randwrite
percentage_random=0,44,0
thinktime=${W3THINK}
thinktime_blocks=8
blocksize=1M
filename=${DEV}
size=${SIZE}
[trim_small]
rw=trim
size=10%
thinktime=${W2THINK}
thinktime_blocks=1
blocksize=8M
filename=${DEV}
[trim_med]
startdelay=1s
rw=trim
size=10%
thinktime=${W3THINK}
thinktime_blocks=1
blocksize=64M
filename=${DEV}
================================================
FILE: jobfiles/writehammer.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
# Write to 32 different regions of a flash device.
# Each job will write continuously from a 16MB logical
# region of the flash device.
[global]
bs=${BLKSIZE}
direct=1
rw=write
ioengine=libaio
iodepth=${DEPTH}
loops=1000000000
time_based
runtime=14400s
group_reporting=1
offset=${OFFSET1}m
offset_increment=${INCREMENT}m
numjobs=32
size=16M
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
================================================
FILE: jobfiles/ws_hxfs_hdd.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
size=100%
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
[job0]
rw=randrw
rwmixread=62
percentage_random=64,52,
numjobs=${DEPTH1}
rate=${RATE1}
bssplit=${BLKSIZE}
filename=${DEV}
================================================
FILE: jobfiles/ws_hxfs_hdd_heavy.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
size=100%
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
runtime=${TIME}
group_reporting=1
[job0]
rw=randrw
rwmixread=90
percentage_random=20,47,
numjobs=${DEPTH1}
rate=${RATE1}
bssplit=${BLKSIZE}
filename=${DEV}
================================================
FILE: jobfiles/ws_hxfs_ssd.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
runtime=${TIME}
group_reporting=1
filename=${DEV}
[job0]
numjobs=2
iodepth=24
rw=randwrite
bssplit=,4k/54:8k/46,
thinktime=30s
thinktime_blocks=${W1THINK}
[job1]
numjobs=3
iodepth=1
rw=randread
bssplit=4k/30:8k/70,,
rate=${RATE1}
[job2]
numjobs=12
iodepth=121
rw=randwrite
bssplit=,4k/57:8k/43,
thinktime=30s
thinktime_blocks=${W2THINK}
[job3]
numjobs=27
iodepth=1
rw=randwrite
percentage_random=,98,
bssplit=,4k/27:8k/62:16k/11,
rate=${RATE2}
================================================
FILE: jobfiles/ws_xfs_hdd.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
size=100%
loops=10000
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[job1]
numjobs=20
iodepth=10
rw=randrw
rwmixread=69
percentage_random=44,18,
bssplit=4k/8:8k/7:16k/2:32k/2:64k/15:128k/3:256k/6:512k/57,4k/2:8k/6:16k/1:32k/2:64k/4:128k/1:256k/2:512k/82
rate=610k,360k
[job2]
numjobs=1
iodepth=70
rw=randwrite
bssplit=,4k/63:8k/34:16k/3
rate_iops=15
[job3]
numjobs=8
iodepth=40
rw=randwrite
bssplit=4k/55:8k/40:16k/5
rate=10k
================================================
FILE: jobfiles/wscache_1H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[navy_reader]
rate=${RRATE}k
numjobs=48
iodepth=${DEPTH}
rw=randread
percentage_random=99,0
bssplit=128K/97:256K/3
offset=0%
offset_align=4K
size=${SIZE}
[navy_writer]
numjobs=32
iodepth=7
offset=0%
size=${SIZE}
rw=randwrite
percentage_random=0,45
bssplit=128K/97:256K/3
thinktime=${W1THINK}
thinktime_blocks=58
[trimmer]
numjobs=1
iodepth=1
offset=71%
size=28%
rw=trim
bssplit=8M/100
thinktime=${W2THINK}
thinktime_blocks=1
================================================
FILE: jobfiles/wscache_1H25.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=${IOENGINE}
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[navy_reader]
rate=${RRATE}k
numjobs=48
iodepth=${DEPTH}
rw=randread
percentage_random=99,0
bssplit=128K/97:256K/3
offset=0%
offset_align=4K
size=${SIZE}
[navy_writer]
numjobs=32
iodepth=7
offset=0%
size=${SIZE}
rw=randwrite
percentage_random=0,45
bssplit=128K/97:256K/3
thinktime=${W1THINK}
thinktime_blocks=58
[trimmer]
numjobs=1
iodepth=1
offset=71%
size=28%
rw=trim
bssplit=8M/100
thinktime=${W2THINK}
thinktime_blocks=1
================================================
FILE: jobfiles/wsf-laser-ro_2H22.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
group_reporting=1
filename=${DEV}
[poll_alow]
rate=${RRATE}m
numjobs=4
iodepth=${DEPTH}
iodepth_batch=32
rw=randread
percentage_random=100,0
bssplit=4K/48:8K/51:16K/1
offset=0%
offset_align=4K
offset_increment=25%
size=${SIZE}
[IO_mnt]
rate=120k
numjobs=6
iodepth=32
iodepth_batch=32
rw=randread
percentage_random=55,0
bssplit=4K/1:64K/3:128K/1:256K/75:1M/20
offset=0%
offset_align=4K
offset_increment=16%
size=3%
================================================
FILE: jobfiles/wsf-t.fio
================================================
# Copyright (c) Facebook, Inc. and its affiliates.
[global]
direct=1
ioengine=libaio
random_generator=tausworthe64
invalidate=1
time_based
norandommap
randrepeat=0
ramp_time=${RAMPTIME}
runtime=${TIME}
percentile_list=1:5:10:20:25:30:40:50:60:70:75:80:90:95:99:99.9:99.95:99.99:99.999:99.9999
gro
gitextract_t0n2pfi3/
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── README-READHAMMER.txt
├── README.md
├── Release_Notes.txt
├── fiosynth.py
├── fiosynth_lib/
│ ├── __init__.py
│ ├── fio_json_parser.py
│ ├── fiosynth.py
│ ├── flash_config.py
│ └── health_tools.py
├── jobfiles/
│ ├── 70_30.fio
│ ├── 70_30_HE.fio
│ ├── 70_30_LE.fio
│ ├── 70_30_io_uring.fio
│ ├── 70_30_libfio_ws.fio
│ ├── DRAMwTRIM.fio
│ ├── FLeaf_noTRIM.fio
│ ├── FLeaf_wTRIM.fio
│ ├── FLeaf_wTRIM_1H22.fio
│ ├── FLeaf_wTRIM_1H25.fio
│ ├── FLeaf_wTRIM_2H19.fio
│ ├── HDD_70_30.fio
│ ├── HDD_randread.fio
│ ├── HDD_randwrite.fio
│ ├── HDD_seqread.fio
│ ├── HDD_seqwrite.fio
│ ├── Max_Latency_ReadTrim.fio
│ ├── Max_Latency_write.fio
│ ├── MyRocks_noTRIM.fio
│ ├── MyRocks_noTRIM_2H19.fio
│ ├── MyRocks_wTRIM.fio
│ ├── MyRocks_wTRIM_1H22.fio
│ ├── MyRocks_wTRIM_1H25.fio
│ ├── MyRocks_wTRIM_2H19.fio
│ ├── RR_SW_HE.fio
│ ├── RR_SW_LE.fio
│ ├── TypeVI.fio
│ ├── TypeVI90.fio
│ ├── TypeVI90_precon.fio
│ ├── TypeVIII_Messenger_Movement.fio
│ ├── TypeVIII_Messenger_Movement_precon.fio
│ ├── TypeVIII_Messenger_Movement_wTRIM.fio
│ ├── TypeVIII_Messenger_Movement_wTRIM_precon.fio
│ ├── TypeVI_Read.fio
│ ├── TypeVI_Read_1H22.fio
│ ├── TypeVIwTRIM.fio
│ ├── TypeVIwTRIM_1H22.fio
│ ├── TypeVIwTRIM_1H22_IOPS.fio
│ ├── TypeVIwTRIM_1H25.fio
│ ├── TypeVIwTRIM_2H19.fio
│ ├── TypeVIwTRIM_SIT.fio
│ ├── TypeVIwTRIM_precon.fio
│ ├── TypeVIwTRIM_precon_1H22.fio
│ ├── TypeVIwTRIM_precon_1H25.fio
│ ├── backup.fio
│ ├── backup_write_journal.fio
│ ├── bcache.fio
│ ├── bcache_1H22.fio
│ ├── bcache_1H25.fio
│ ├── bursttrim.fio
│ ├── coldstorage.fio
│ ├── drive_fill.fio
│ ├── gen.fio
│ ├── gen_prep_flash.fio
│ ├── gen_randread.fio
│ ├── gen_randrw.fio
│ ├── gen_randrw_70_30.fio
│ ├── gen_randwrite.fio
│ ├── gen_read.fio
│ ├── gen_write.fio
│ ├── idyno.fio
│ ├── idyno_sweep.fio
│ ├── neargpu_tlc_ssd.fio
│ ├── prep.fio
│ ├── prep_flash.fio
│ ├── prep_flash_io_uring.fio
│ ├── prep_flash_io_uring_1H25.fio
│ ├── prep_flash_rand.fio
│ ├── prep_flash_rand_io_uring.fio
│ ├── prep_flash_rand_libfio_ws.fio
│ ├── prep_io_uring.fio
│ ├── prep_libfio_ws.fio
│ ├── prep_neargpu_rand_write.fio
│ ├── prep_neargpu_seq_write.fio
│ ├── prep_rand.fio
│ ├── randread.fio
│ ├── randread_io_uring.fio
│ ├── randread_io_uring_1H26.fio
│ ├── randread_libfio_ws.fio
│ ├── randwrite.fio
│ ├── randwrite_io_uring.fio
│ ├── randwrite_libfio_ws.fio
│ ├── readhammer.fio
│ ├── rsw_burst.fio
│ ├── rsw_cp.fio
│ ├── rsw_cp_precon.fio
│ ├── rsw_cp_vtrim.fio
│ ├── rsw_cp_wtrim.fio
│ ├── search2.fio
│ ├── search3.fio
│ ├── searchdoc_noTRIM.fio
│ ├── searchdoc_wTRIM.fio
│ ├── searchindex_noTRIM.fio
│ ├── searchindex_wTRIM.fio
│ ├── searchindex_wTRIM_1H22.fio
│ ├── searchindex_wTRIM_1H25.fio
│ ├── searchlm_wTRIM.fio
│ ├── searchlm_wTRIM_1H22.fio
│ ├── searchlm_wTRIM_1H25.fio
│ ├── seqread.fio
│ ├── seqread_io_uring.fio
│ ├── seqread_libfio_ws.fio
│ ├── seqwrite.fio
│ ├── seqwrite_io_uring.fio
│ ├── seqwrite_libfio_ws.fio
│ ├── seqwrite_write_journal.fio
│ ├── stacking.fio
│ ├── trim.fio
│ ├── trim_libfio_ws.fio
│ ├── trimrate.fio
│ ├── twfeed.fio
│ ├── twi_iris.fio
│ ├── twi_iris_precon.fio
│ ├── twshared-pkg.fio
│ ├── twshared.fio
│ ├── udb_boot.fio
│ ├── wildcard.fio
│ ├── wildcard_normal.fio
│ ├── writehammer.fio
│ ├── ws_hxfs_hdd.fio
│ ├── ws_hxfs_hdd_heavy.fio
│ ├── ws_hxfs_ssd.fio
│ ├── ws_xfs_hdd.fio
│ ├── wscache_1H22.fio
│ ├── wscache_1H25.fio
│ ├── wsf-laser-ro_2H22.fio
│ ├── wsf-t.fio
│ ├── wsf-tl.fio
│ ├── wsf-tl_1H22.fio
│ ├── wsf-tl_1H25.fio
│ └── wsf-tl_2H21.fio
├── setup.cfg
├── setup.py
├── smartAll.sh
├── test-requirements.txt
├── tests/
│ ├── __init__.py
│ ├── sample_fio_results/
│ │ ├── sample-2017-11-21_16-40.csv
│ │ ├── sample_1_run1.json
│ │ └── sample_2_run1.json
│ └── test_fio_json_parser.py
├── tmp.fio
├── tox.ini
└── wkldsuites/
├── ALL_512K_Writes_wTRIM
├── ALL_Reads
├── Boot_SSD
├── BurstTrim
├── Cache
├── Cache_1H22
├── Cache_1H25
├── Cache_2H20
├── Cache_Sweep
├── Cache_Sweep_1H22
├── Cache_Sweep_1H25
├── Drive_fill
├── Fio_4C
├── Fio_4C_boot
├── HDDPeakWklds
├── HE_Flash
├── HE_Flash_Short
├── HE_Flash_Short_90
├── HE_Flash_Short_noTRIM
├── HE_Flash_Short_wTRIM
├── HE_Flash_Short_wTRIM_1H20
├── HE_Flash_Short_wTRIM_1H22
├── HE_Flash_Short_wTRIM_1H22_HW_char_9DWPD_highBW_gen5
├── HE_Flash_Short_wTRIM_1H22_HW_char_9DWPD_highBW_gen5_IOPS
├── HE_Flash_Short_wTRIM_1H25
├── HE_Flash_Short_wTRIM_2H19
├── HE_Flash_Short_wTRIM_2H20
├── HE_Flash_Short_wTRIM_RAM
├── HE_Flash_Short_wTRIM_SIT
├── HE_Flash_Short_wTRIM_Sweep
├── HE_Flash_Short_wTRIM_Sweep_1H22
├── HE_Flash_Short_wTRIM_Sweep_1H25
├── HE_Flash_noTRIM
├── HE_Flash_wTRIM
├── Idyno_Boot
├── Idyno_Boot_Full_Sweep
├── LE_Flash
├── LE_Flash_Short
├── LE_Flash_Short_wTRIM
├── LE_Flash_Short_wTRIM_SIT
├── LE_Flash_Single
├── Low_Latency_Short_wTRIM
├── Messenger_Movement_noTRIM
├── Messenger_Movement_wTRIM
├── MyRocks
├── MyRocks_Full_Sweep
├── MyRocks_Full_Sweep_1H22
├── NearGPU_16TB_2H27_4K
├── NearGPU_16TB_2H27_512B
├── NearGPU_2H26_4K
├── NearGPU_2H26_512B
├── NearGPU_8TB_2H27_4K
├── NearGPU_8TB_2H27_512B
├── Nvme_Cli_Wkld
├── PeakWklds
├── PeakWklds_1H22
├── PeakWklds_1H26
├── PeakWklds_Libfio_Ws
├── PeakWklds_RAM
├── RAIDPeakWklds
├── RSC_Sweep_1H24
├── RTL
├── RandRW_70_30_Fio4C
├── RandRW_Fio4C
├── RandRead_Fio4C
├── RandWrite_Fio4C
├── Read_Fio4C
├── Read_Write
├── Rsw_Cp
├── Rsw_Cp_wTRIM
├── Search
├── Search_1H22
├── Search_1H22_hw_char_gen5
├── Search_1H25
├── Search_2H19
├── Search_2H20
├── Search_Full_Sweep
├── Search_Full_Sweep_1H22
├── Search_Sweep
├── Search_Sweep_1H22
├── Search_Sweep_1H25
├── SpinCycle
├── SpinCycleFlash
├── SpinCycle_1H25
├── Stacking
├── TrimRate
├── Twfeed_Boot
├── Twi_Iris
├── Twshared_Boot
├── Twshared_Pkg_Boot
├── Twshared_Pkg_Boot_Full_Sweep
├── UBOOTT_Workload_loop
├── UDB_Boot
├── USSDT_Workload_loop
├── USSDT_Workload_loop_OCP2.6
├── WSCACHE_1H22
├── WSCACHE_1H25
├── WSCache_WSF_Stress
├── WSF
├── WSF_1H22
├── WSF_1H25
├── WSF_2H21
├── WSF_2H21_8TB
├── WSF_LASER_RO_2H22
├── Warmstorage_HDD
├── Warmstorage_HXFS_HDD
├── Warmstorage_HXFS_SSD
├── Wedge_Boot
├── Wildcard
├── Wildcard_Normal
├── Write_Fio4C
├── backup
├── iocost
├── precondition_full
├── prep
├── readhammer
├── write_journal
└── writehammer
SYMBOL INDEX (96 symbols across 7 files)
FILE: fiosynth.py
function main (line 67) | def main() -> None:
FILE: fiosynth_lib/fio_json_parser.py
function set_attributes (line 55) | def set_attributes():
function check_if_mounted (line 124) | def check_if_mounted(fn):
function read_json (line 137) | def read_json(fn, serverMode=False):
function read_extsmart (line 175) | def read_extsmart(filename):
function new_csv (line 181) | def new_csv(f, notStdPercentile1, notStdPercentile2, add_waf_header, add...
function get_csv_line (line 296) | def get_csv_line(jobname, json, index, data, version_str, serverMode, sc...
function get_fio_writes (line 358) | def get_fio_writes(data):
function get_smart_line (line 364) | def get_smart_line(data):
function get_extsmart_line (line 388) | def get_extsmart_line(data):
function get_lm_line (line 421) | def get_lm_line(data, lm_mapping):
function find (line 453) | def find(search, data):
function recursive_items (line 476) | def recursive_items(dictionary):
function get_target_line (line 483) | def get_target_line(col_names, job_targets):
function print_csv_line (line 515) | def print_csv_line(f, jobname, fio_data, col_names, only_targets, job_ta...
function print_csv_line_generic (line 579) | def print_csv_line_generic(filename, content):
function parseServerResults (line 589) | def parseServerResults(json_path, csv_dir):
function write_server_csv_files (line 595) | def write_server_csv_files(csv_dir, json_path):
function get_hostname_to_data_dict (line 623) | def get_hostname_to_data_dict(fio_data):
function get_combined_stats (line 645) | def get_combined_stats(stats):
function combineCsv (line 659) | def combineCsv(csvFolder, fname, dut_list):
function get_json_files (line 699) | def get_json_files(dir_path):
function write_csv_file (line 708) | def write_csv_file(csv_filepath, fio_json_files, only_targets, job_targe...
function main (line 748) | def main(args):
function cli_main (line 763) | def cli_main():
FILE: fiosynth_lib/fiosynth.py
class Parser (line 26) | class Parser:
method __init__ (line 27) | def __init__(self, jname, cname, only_targets=False, job_targets={}, s...
function parseLocalResults (line 47) | def parseLocalResults(args):
function set_attributes (line 50) | def set_attributes():
function cmdline (line 250) | def cmdline(cmd):
function checkMounted (line 255) | def checkMounted(device, dut):
function getAllDataDrives (line 269) | def getAllDataDrives(data, command, profile, dut):
function createTempJobTemplate (line 296) | def createTempJobTemplate(dut, jobname):
function getTotalDataCapacity (line 310) | def getTotalDataCapacity(data):
function checkFileExist (line 317) | def checkFileExist(path, dut):
function getNumJobs (line 344) | def getNumJobs(data, command, dut):
function getSshProc (line 362) | def getSshProc(dut):
function getMultiplier (line 372) | def getMultiplier(capacity):
function getJobVars (line 377) | def getJobVars(dut, profile, scale_factor):
function run_fio (line 426) | def run_fio(p, VAL, dut_list, args, run, rtype):
function isPortAvailable (line 486) | def isPortAvailable(port):
class FioDUT (line 497) | class FioDUT:
method __init__ (line 506) | def __init__(self, sName="", user=""):
method __del__ (line 519) | def __del__(self):
method inLocalMode (line 523) | def inLocalMode(self):
method getTunnelPort (line 527) | def getTunnelPort(cls):
function drivesToJson (line 541) | def drivesToJson(dut):
function createOffsetFile (line 566) | def createOffsetFile(dut, dst_file):
function readOffsetFile (line 583) | def readOffsetFile(dut, dst_file):
function getRaidLevel (line 604) | def getRaidLevel(data):
function setDutCapacity (line 619) | def setDutCapacity(dut, cmd, profile):
function loadDevList (line 640) | def loadDevList(dut_list, args, profile):
function startAoeServer (line 676) | def startAoeServer(dut):
function startSshTunnel (line 690) | def startSshTunnel(dut):
function clearDriveData (line 709) | def clearDriveData(dut_list, dryrun="n"):
function getServers (line 730) | def getServers(servers, server_file, user):
function prepServers (line 751) | def prepServers(dut_list, args, profile):
function runHealthMon (line 779) | def runHealthMon(fname, health="", flash=None):
function getSmart (line 790) | def getSmart(device, output_filename):
function getVID (line 814) | def getVID(device):
function getOCP (line 821) | def getOCP(device):
function getExtSmart (line 867) | def getExtSmart(device, output_filename):
function setupLM (line 895) | def setupLM(drive, job_targets, enable_lm):
function setLM (line 947) | def setLM(drive, threshold_a, threshold_b, threshold_c, threshold_d, ena...
function getLM (line 970) | def getLM(drive, output_filename):
function getLMbinary (line 975) | def getLMbinary(drive, output_filename):
function runTest (line 980) | def runTest(dut_list, profile, args, csvFolderPath, rtype, index, rcycle...
function runCycles (line 1060) | def runCycles(dut_list, profile, args, rc, pc, lp, csvFolderPath):
function runSuite (line 1078) | def runSuite(args):
function main (line 1138) | def main():
FILE: fiosynth_lib/flash_config.py
function set_attributes (line 23) | def set_attributes():
function smartctlToJson (line 42) | def smartctlToJson(data):
function drivesToJson (line 71) | def drivesToJson():
function cmdline (line 87) | def cmdline(cmd):
function new_csv (line 92) | def new_csv(f):
function print_nvme_line (line 113) | def print_nvme_line(f, data, hostname, kernel):
function print_flash_line (line 141) | def print_flash_line(f, data, hostname, kernel):
function print_smart_line (line 163) | def print_smart_line(f, data, hostname, kernel):
function convert_nvme_output (line 189) | def convert_nvme_output(
function print_csv_line (line 225) | def print_csv_line(f, data, tool):
function command_exist (line 248) | def command_exist(cmd):
class GetFlashConfig (line 266) | class GetFlashConfig:
method get_json (line 267) | def get_json(self):
method json_to_csv (line 289) | def json_to_csv(self, path, config, csv_file, tool):
function main (line 297) | def main():
FILE: fiosynth_lib/health_tools.py
function set_attributes (line 23) | def set_attributes():
class HealthTools (line 44) | class HealthTools:
method logger (line 45) | def logger(self, syntax):
function main (line 66) | def main():
FILE: setup.py
function get_data_files (line 16) | def get_data_files():
FILE: tests/test_fio_json_parser.py
class TestFioJsonParser (line 14) | class TestFioJsonParser(unittest.TestCase):
method setUp (line 15) | def setUp(self):
method tearDown (line 25) | def tearDown(self):
method _assert_csv_format (line 30) | def _assert_csv_format(self, csv_filepath):
method test_write_csv_file_many_json_files (line 36) | def test_write_csv_file_many_json_files(self):
method test_write_csv_file_append_exisiting (line 41) | def test_write_csv_file_append_exisiting(self):
Condensed preview — 274 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,310K chars).
[
{
"path": ".gitignore",
"chars": 556,
"preview": "*.py[cod]\n\n# C extensions\n*.so\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n\n# Distribution / packagi"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 248,
"preview": "# Code of Conduct\nFacebook has adopted a Code of Conduct that we expect project participants to adhere to. Please [read "
},
{
"path": "CONTRIBUTING.md",
"chars": 1596,
"preview": "# Contributing to fiosynth\nWe want to make contributing to this project as easy and transparent as\npossible.\n\n## Code of"
},
{
"path": "LICENSE",
"chars": 1087,
"preview": "MIT License\n\nCopyright (c) Facebook, Inc. and its affiliates.\n\nPermission is hereby granted, free of charge, to any pers"
},
{
"path": "MANIFEST.in",
"chars": 204,
"preview": "include CODE_OF_CONDUCT.md\ninclude CONTRIBUTING.md\ninclude LICENSE\ninclude README-READHAMMER.txt\ninclude Release_Notes.t"
},
{
"path": "README-READHAMMER.txt",
"chars": 950,
"preview": "Currently the read hammer test will run for 14 days ( 336 hours) after the SSDs\nare prepared. Increase the number of ru"
},
{
"path": "README.md",
"chars": 9345,
"preview": "# fiosynth\nFB fio Synthetic Benchmark Suite for Flash ver 3.6.0\n\n## Examples\n\nRun workload suite on a single device:\n```"
},
{
"path": "Release_Notes.txt",
"chars": 328,
"preview": "Copyright (c) Facebook, Inc. and its affiliates.\n\nVersion 3.1 Release Notes\n\n1. Fixed bug in HE Flash workload profile. "
},
{
"path": "fiosynth.py",
"chars": 2703,
"preview": "#!/usr/bin/env python3\n# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# AUTHOR = 'Darryl Gardner <darryleg@fb.com>"
},
{
"path": "fiosynth_lib/__init__.py",
"chars": 66,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\n# pyre-unsafe\n"
},
{
"path": "fiosynth_lib/fio_json_parser.py",
"chars": 25612,
"preview": "#!/usr/bin/env python3\n\n# pyre-unsafe\n\n# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# AUTHOR = 'Darryl Gardner <"
},
{
"path": "fiosynth_lib/fiosynth.py",
"chars": 37870,
"preview": "#!/usr/bin/env python3\n# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# AUTHOR = 'Darryl Gardner <darryleg@fb.com>"
},
{
"path": "fiosynth_lib/flash_config.py",
"chars": 9357,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# AUTHOR = \"Darryl Gardner <darryleg@fb.com>\"\n#\n# flash_config.py- "
},
{
"path": "fiosynth_lib/health_tools.py",
"chars": 1793,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n#\n# AUTHOR = \"Darryl Gardner <darryleg@fb.com>\"\n#\n# health_tools.py- "
},
{
"path": "jobfiles/70_30.fio",
"chars": 432,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randrw\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=10"
},
{
"path": "jobfiles/70_30_HE.fio",
"chars": 515,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randrw\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=10"
},
{
"path": "jobfiles/70_30_LE.fio",
"chars": 514,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randrw\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=10"
},
{
"path": "jobfiles/70_30_io_uring.fio",
"chars": 434,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randrw\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=10"
},
{
"path": "jobfiles/70_30_libfio_ws.fio",
"chars": 630,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[job]\nrw=randrw\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=64m\ni"
},
{
"path": "jobfiles/DRAMwTRIM.fio",
"chars": 948,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/FLeaf_noTRIM.fio",
"chars": 772,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/FLeaf_wTRIM.fio",
"chars": 868,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/FLeaf_wTRIM_1H22.fio",
"chars": 866,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=io_uring\ndirect=1\ninvalidate=1\ntime_based\nruntime=$"
},
{
"path": "jobfiles/FLeaf_wTRIM_1H25.fio",
"chars": 869,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=${IOENGINE}\ndirect=1\ninvalidate=1\ntime_based\nruntim"
},
{
"path": "jobfiles/FLeaf_wTRIM_2H19.fio",
"chars": 864,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/HDD_70_30.fio",
"chars": 469,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randrw\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=10"
},
{
"path": "jobfiles/HDD_randread.fio",
"chars": 447,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randread\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize="
},
{
"path": "jobfiles/HDD_randwrite.fio",
"chars": 448,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize"
},
{
"path": "jobfiles/HDD_seqread.fio",
"chars": 413,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=read\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${SI"
},
{
"path": "jobfiles/HDD_seqwrite.fio",
"chars": 414,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${S"
},
{
"path": "jobfiles/Max_Latency_ReadTrim.fio",
"chars": 457,
"preview": "[global]\ndirect=1\nioengine=libaio\ntime_based\nruntime=${TIME}\ngroup_reporting=1\npercentile_list=1:5:10:20:25:30:40:50:60:"
},
{
"path": "jobfiles/Max_Latency_write.fio",
"chars": 374,
"preview": "[global]\ndirect=1\nioengine=libaio\ntime_based\nruntime=${TIME}\ngroup_reporting=1\npercentile_list=1:5:10:20:25:30:40:50:60:"
},
{
"path": "jobfiles/MyRocks_noTRIM.fio",
"chars": 913,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nsize="
},
{
"path": "jobfiles/MyRocks_noTRIM_2H19.fio",
"chars": 952,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/MyRocks_wTRIM.fio",
"chars": 1286,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/MyRocks_wTRIM_1H22.fio",
"chars": 1260,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=io_uring\nrandom_generator=tausworthe64\nloo"
},
{
"path": "jobfiles/MyRocks_wTRIM_1H25.fio",
"chars": 1263,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=${IOENGINE}\nrandom_generator=tausworthe64\n"
},
{
"path": "jobfiles/MyRocks_wTRIM_2H19.fio",
"chars": 1258,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/RR_SW_HE.fio",
"chars": 728,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=${SIZE}\nioengine=libaio\niodepth=32\ndirect=1\ninvalidate="
},
{
"path": "jobfiles/RR_SW_LE.fio",
"chars": 727,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=${SIZE}\nioengine=libaio\niodepth=32\ndirect=1\ninvalidate="
},
{
"path": "jobfiles/TypeVI.fio",
"chars": 711,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=${SIZE}\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_base"
},
{
"path": "jobfiles/TypeVI90.fio",
"chars": 737,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/TypeVI90_precon.fio",
"chars": 613,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\nnorandommap\nrandrepeat"
},
{
"path": "jobfiles/TypeVIII_Messenger_Movement.fio",
"chars": 1032,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/TypeVIII_Messenger_Movement_precon.fio",
"chars": 919,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nnorandommap"
},
{
"path": "jobfiles/TypeVIII_Messenger_Movement_wTRIM.fio",
"chars": 1647,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/TypeVIII_Messenger_Movement_wTRIM_precon.fio",
"chars": 1549,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/TypeVI_Read.fio",
"chars": 446,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=${SIZE}\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_base"
},
{
"path": "jobfiles/TypeVI_Read_1H22.fio",
"chars": 449,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=${SIZE}\nioengine=io_uring\ndirect=1\ninvalidate=1\ntime_ba"
},
{
"path": "jobfiles/TypeVIwTRIM.fio",
"chars": 965,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/TypeVIwTRIM_1H22.fio",
"chars": 960,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=io_uring\ndirect=1\ninvalidate=1\ntime_based\nruntime=$"
},
{
"path": "jobfiles/TypeVIwTRIM_1H22_IOPS.fio",
"chars": 968,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=io_uring\ndirect=1\ninvalidate=1\ntime_based\nruntime=$"
},
{
"path": "jobfiles/TypeVIwTRIM_1H25.fio",
"chars": 963,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=${IOENGINE}\ndirect=1\ninvalidate=1\ntime_based\nruntim"
},
{
"path": "jobfiles/TypeVIwTRIM_2H19.fio",
"chars": 958,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/TypeVIwTRIM_SIT.fio",
"chars": 916,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/TypeVIwTRIM_precon.fio",
"chars": 826,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\nnorandommap\nrandrepeat"
},
{
"path": "jobfiles/TypeVIwTRIM_precon_1H22.fio",
"chars": 828,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=io_uring\ndirect=1\ninvalidate=1\nnorandommap\nrandrepe"
},
{
"path": "jobfiles/TypeVIwTRIM_precon_1H25.fio",
"chars": 831,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=${IOENGINE}\ndirect=1\ninvalidate=1\nnorandommap\nrandr"
},
{
"path": "jobfiles/backup.fio",
"chars": 590,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nsize="
},
{
"path": "jobfiles/backup_write_journal.fio",
"chars": 533,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=${SIZE}\nioengine=libaio\ndirect=1\nloops=10000\ninvalidate"
},
{
"path": "jobfiles/bcache.fio",
"chars": 1021,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\ninvalidate=1\ntime_based\nruntime=${T"
},
{
"path": "jobfiles/bcache_1H22.fio",
"chars": 1023,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=io_uring\ndirect=1\ninvalidate=1\ntime_based\nruntime=$"
},
{
"path": "jobfiles/bcache_1H25.fio",
"chars": 1026,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=${IOENGINE}\ndirect=1\ninvalidate=1\ntime_based\nruntim"
},
{
"path": "jobfiles/bursttrim.fio",
"chars": 543,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=0\nsize=${SIZE}\nioengine=libaio\ndirect=1\ninvalidate=1\n"
},
{
"path": "jobfiles/coldstorage.fio",
"chars": 529,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nsize="
},
{
"path": "jobfiles/drive_fill.fio",
"chars": 359,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# Drive fill template for preconditioning\n[global]\nrw=write\nblocksize"
},
{
"path": "jobfiles/gen.fio",
"chars": 471,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=${RANDRW}\nrwmixread=${RWMIXREAD}\nblocksize=${BLKSIZE}\nblo"
},
{
"path": "jobfiles/gen_prep_flash.fio",
"chars": 317,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=200"
},
{
"path": "jobfiles/gen_randread.fio",
"chars": 429,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randread\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize="
},
{
"path": "jobfiles/gen_randrw.fio",
"chars": 427,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randrw\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${"
},
{
"path": "jobfiles/gen_randrw_70_30.fio",
"chars": 454,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randrw\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${"
},
{
"path": "jobfiles/gen_randwrite.fio",
"chars": 430,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize"
},
{
"path": "jobfiles/gen_read.fio",
"chars": 425,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=read\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${SI"
},
{
"path": "jobfiles/gen_write.fio",
"chars": 426,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${S"
},
{
"path": "jobfiles/idyno.fio",
"chars": 1627,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/idyno_sweep.fio",
"chars": 1627,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/neargpu_tlc_ssd.fio",
"chars": 372,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# Near-GPU TLC SSD generic workload template\n[global]\nrw=${RANDRW}\nbl"
},
{
"path": "jobfiles/prep.fio",
"chars": 294,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=100"
},
{
"path": "jobfiles/prep_flash.fio",
"chars": 319,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=100"
},
{
"path": "jobfiles/prep_flash_io_uring.fio",
"chars": 321,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=100"
},
{
"path": "jobfiles/prep_flash_io_uring_1H25.fio",
"chars": 324,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=100"
},
{
"path": "jobfiles/prep_flash_rand.fio",
"chars": 298,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize"
},
{
"path": "jobfiles/prep_flash_rand_io_uring.fio",
"chars": 300,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize"
},
{
"path": "jobfiles/prep_flash_rand_libfio_ws.fio",
"chars": 543,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[job]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=64"
},
{
"path": "jobfiles/prep_io_uring.fio",
"chars": 296,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=100"
},
{
"path": "jobfiles/prep_libfio_ws.fio",
"chars": 502,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[job]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=64m\nio"
},
{
"path": "jobfiles/prep_neargpu_rand_write.fio",
"chars": 324,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# Near-GPU TLC SSD preconditioning 2x random write (4KB)\n[global]\nrw="
},
{
"path": "jobfiles/prep_neargpu_seq_write.fio",
"chars": 320,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# Near-GPU TLC SSD preconditioning sequential write (256KB)\n[global]\n"
},
{
"path": "jobfiles/prep_rand.fio",
"chars": 321,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize"
},
{
"path": "jobfiles/randread.fio",
"chars": 410,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randread\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize="
},
{
"path": "jobfiles/randread_io_uring.fio",
"chars": 412,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randread\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize="
},
{
"path": "jobfiles/randread_io_uring_1H26.fio",
"chars": 412,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randread\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize="
},
{
"path": "jobfiles/randread_libfio_ws.fio",
"chars": 609,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[job]\nrw=randread\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${S"
},
{
"path": "jobfiles/randwrite.fio",
"chars": 411,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize"
},
{
"path": "jobfiles/randwrite_io_uring.fio",
"chars": 413,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize"
},
{
"path": "jobfiles/randwrite_libfio_ws.fio",
"chars": 610,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[job]\nrw=randwrite\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${"
},
{
"path": "jobfiles/readhammer.fio",
"chars": 486,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# Read from 32 different regions of a flash device. \n# Each job will"
},
{
"path": "jobfiles/rsw_burst.fio",
"chars": 614,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/rsw_cp.fio",
"chars": 623,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=100%\nioengine=libaio\ndirect=1\nloops=10000\ninvalidate=1\n"
},
{
"path": "jobfiles/rsw_cp_precon.fio",
"chars": 604,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=100%\nioengine=libaio\ndirect=1\nloops=10000\ninvalidate=1\n"
},
{
"path": "jobfiles/rsw_cp_vtrim.fio",
"chars": 859,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\nloops=10000\ninvalidate=1\ntime_based"
},
{
"path": "jobfiles/rsw_cp_wtrim.fio",
"chars": 974,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\nloops=10000\ninvalidate=1\ntime_based"
},
{
"path": "jobfiles/search2.fio",
"chars": 678,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nsize="
},
{
"path": "jobfiles/search3.fio",
"chars": 822,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nsize="
},
{
"path": "jobfiles/searchdoc_noTRIM.fio",
"chars": 861,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/searchdoc_wTRIM.fio",
"chars": 1102,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/searchindex_noTRIM.fio",
"chars": 846,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/searchindex_wTRIM.fio",
"chars": 1087,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/searchindex_wTRIM_1H22.fio",
"chars": 1089,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=io_uring\nrandom_generator=tausworthe64\nloo"
},
{
"path": "jobfiles/searchindex_wTRIM_1H25.fio",
"chars": 1092,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=${IOENGINE}\nrandom_generator=tausworthe64\n"
},
{
"path": "jobfiles/searchlm_wTRIM.fio",
"chars": 963,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/searchlm_wTRIM_1H22.fio",
"chars": 965,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=io_uring\nrandom_generator=tausworthe64\nloo"
},
{
"path": "jobfiles/searchlm_wTRIM_1H25.fio",
"chars": 968,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=${IOENGINE}\nrandom_generator=tausworthe64\n"
},
{
"path": "jobfiles/seqread.fio",
"chars": 376,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=read\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${SI"
},
{
"path": "jobfiles/seqread_io_uring.fio",
"chars": 378,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=read\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${SI"
},
{
"path": "jobfiles/seqread_libfio_ws.fio",
"chars": 575,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[job]\nrw=read\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${SIZE}"
},
{
"path": "jobfiles/seqwrite.fio",
"chars": 377,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${S"
},
{
"path": "jobfiles/seqwrite_io_uring.fio",
"chars": 379,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${S"
},
{
"path": "jobfiles/seqwrite_libfio_ws.fio",
"chars": 576,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[job]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${SIZE"
},
{
"path": "jobfiles/seqwrite_write_journal.fio",
"chars": 532,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nsize=${SIZE}\nioengine=libaio\ndirect=1\nloops=10000\ninvalidate"
},
{
"path": "jobfiles/stacking.fio",
"chars": 988,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nioengine=libaio\ndirect=1\nloops=10000\ninvalidate=1\ntime_based"
},
{
"path": "jobfiles/trim.fio",
"chars": 181,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=trim\nbs=${BLKSIZE}\nloops=2\npercentile_list=1:5:10:20:25:3"
},
{
"path": "jobfiles/trim_libfio_ws.fio",
"chars": 423,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[job]\nrw=trim\nbs=${BLKSIZE}\nloops=2\nsize=${SIZE}\ninvalidate=0\nnumjobs"
},
{
"path": "jobfiles/trimrate.fio",
"chars": 266,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nbs=${BLKSIZE}\nrw=randtrim\ntime_based\nruntime=1m\ngroup_report"
},
{
"path": "jobfiles/twfeed.fio",
"chars": 752,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/twi_iris.fio",
"chars": 1619,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/twi_iris_precon.fio",
"chars": 1169,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/twshared-pkg.fio",
"chars": 993,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/twshared.fio",
"chars": 724,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/udb_boot.fio",
"chars": 904,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/wildcard.fio",
"chars": 1447,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/wildcard_normal.fio",
"chars": 1377,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nloops"
},
{
"path": "jobfiles/writehammer.fio",
"chars": 487,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n# Write to 32 different regions of a flash device. \n# Each job will "
},
{
"path": "jobfiles/ws_hxfs_hdd.fio",
"chars": 456,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nsize="
},
{
"path": "jobfiles/ws_hxfs_hdd_heavy.fio",
"chars": 456,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nsize="
},
{
"path": "jobfiles/ws_hxfs_ssd.fio",
"chars": 725,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/ws_xfs_hdd.fio",
"chars": 710,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\nsize="
},
{
"path": "jobfiles/wscache_1H22.fio",
"chars": 755,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/wscache_1H25.fio",
"chars": 760,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=${IOENGINE}\nrandom_generator=tausworthe64\n"
},
{
"path": "jobfiles/wsf-laser-ro_2H22.fio",
"chars": 709,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/wsf-t.fio",
"chars": 977,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/wsf-tl.fio",
"chars": 972,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/wsf-tl_1H22.fio",
"chars": 1127,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "jobfiles/wsf-tl_1H25.fio",
"chars": 1132,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=${IOENGINE}\nrandom_generator=tausworthe64\n"
},
{
"path": "jobfiles/wsf-tl_2H21.fio",
"chars": 979,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\ndirect=1\nioengine=libaio\nrandom_generator=tausworthe64\ninval"
},
{
"path": "setup.cfg",
"chars": 142,
"preview": "# Copyright (c) 2017-present, Facebook, Inc.\n# All rights reserved.\n\n[nosetests]\ndetailed-errors = 1\nlogging-clear-handl"
},
{
"path": "setup.py",
"chars": 1888,
"preview": "#!/usr/bin/env python3\n# Copyright (c) Facebook, Inc. and its affiliates.\n\nimport codecs\nimport glob\nimport os\n\nfrom set"
},
{
"path": "smartAll.sh",
"chars": 146,
"preview": "#!/bin/bash\n# Copyright (c) Facebook, Inc. and its affiliates.\n\nfor i in $(sg_map -i -x | grep ATA | awk \"{print $7}\")\nd"
},
{
"path": "test-requirements.txt",
"chars": 93,
"preview": "# Copyright (c) 2017-present, Facebook, Inc.\n# All rights reserved.\n\nnose>=1.3\nflake8>=2.1.0\n"
},
{
"path": "tests/__init__.py",
"chars": 51,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n"
},
{
"path": "tests/sample_fio_results/sample-2017-11-21_16-40.csv",
"chars": 1265,
"preview": "Jobname,Read_IOPS,Read_BW,Write_IOPS,Write_BW,Mean_Read_Latency,Max_Read_Latency,P25_Read_Latency,P50_Read_Latency,P70_R"
},
{
"path": "tests/sample_fio_results/sample_1_run1.json",
"chars": 7280,
"preview": "{\n \"fio version\" : \"fio-3.1\",\n \"timestamp\" : 1511311277,\n \"timestamp_ms\" : 1511311277612,\n \"time\" : \"Tue Nov 21 16:4"
},
{
"path": "tests/sample_fio_results/sample_2_run1.json",
"chars": 7269,
"preview": "{\n \"fio version\" : \"fio-3.1\",\n \"timestamp\" : 1511311338,\n \"timestamp_ms\" : 1511311338261,\n \"time\" : \"Tue Nov 21 16:4"
},
{
"path": "tests/test_fio_json_parser.py",
"chars": 1803,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n\nimport os\nimport shutil\nimport tempfile\nimport unittest\n\nfrom fiosyn"
},
{
"path": "tmp.fio",
"chars": 408,
"preview": "# Copyright (c) Facebook, Inc. and its affiliates.\n[global]\nrw=write\nblocksize=${BLKSIZE}\nblockalign=${BLKSIZE}\nsize=${S"
},
{
"path": "tox.ini",
"chars": 990,
"preview": "# Copyright (c) 2017-present, Facebook, Inc.\n# All rights reserved.\n\n[tox]\nskipsdist = True\nenvlist = py{27,34,35,36}, f"
},
{
"path": "wkldsuites/ALL_512K_Writes_wTRIM",
"chars": 1128,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_1H22.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/ALL_Reads",
"chars": 1047,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_1H22.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/Boot_SSD",
"chars": 1804,
"preview": "{\n\"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/BurstTrim",
"chars": 452,
"preview": "{\n \"def\": [\n {\n \"template\": \"bursttrim.fio\",\n \"alias\": \"BurstTrim\",\n \"values\": {\n "
},
{
"path": "wkldsuites/Cache",
"chars": 1625,
"preview": "{\n \"pre\":[\n {\n \"template\":\"bcache.fio\",\n \"alias\":\"bcache_precondition1\",\n \"values\" : "
},
{
"path": "wkldsuites/Cache_1H22",
"chars": 2383,
"preview": "{\n \"pre\":[\n {\n \"template\":\"bcache_1H22.fio\",\n \"alias\":\"bcache_precondition1\",\n \"value"
},
{
"path": "wkldsuites/Cache_1H25",
"chars": 2383,
"preview": "{\n \"pre\":[\n {\n \"template\":\"bcache_1H25.fio\",\n \"alias\":\"bcache_precondition1\",\n \"value"
},
{
"path": "wkldsuites/Cache_2H20",
"chars": 2369,
"preview": "{\n \"pre\":[\n {\n \"template\":\"bcache.fio\",\n \"alias\":\"bcache_precondition1\",\n \"values\" : "
},
{
"path": "wkldsuites/Cache_Sweep",
"chars": 3994,
"preview": "{\n \"pre\":[\n {\n \"template\":\"bcache.fio\",\n \"alias\":\"bcache_precondition1\",\n \"values\" : "
},
{
"path": "wkldsuites/Cache_Sweep_1H22",
"chars": 4024,
"preview": "{\n \"pre\":[\n {\n \"template\":\"bcache_1H22.fio\",\n \"alias\":\"bcache_precondition1\",\n \"value"
},
{
"path": "wkldsuites/Cache_Sweep_1H25",
"chars": 4024,
"preview": "{\n \"pre\":[\n {\n \"template\":\"bcache_1H25.fio\",\n \"alias\":\"bcache_precondition1\",\n \"value"
},
{
"path": "wkldsuites/Drive_fill",
"chars": 306,
"preview": "{\n \"def\":[\n {\n \"template\":\"drive_fill.fio\",\n \"alias\":\"drive_fill\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/Fio_4C",
"chars": 3103,
"preview": "{\n \"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" "
},
{
"path": "wkldsuites/Fio_4C_boot",
"chars": 3408,
"preview": "{\n \"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"v"
},
{
"path": "wkldsuites/HDDPeakWklds",
"chars": 11599,
"preview": "{\n \"def\":[\n {\n \"template\":\"HDD_randread.fio\",\n \"alias\":\"RandomRead_QD001\",\n \"values\" "
},
{
"path": "wkldsuites/HE_Flash",
"chars": 19822,
"preview": "{\n \"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/HE_Flash_Short",
"chars": 2520,
"preview": "{\n \"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/HE_Flash_Short_90",
"chars": 2670,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVI90.fio\",\n \"alias\":\"T6_precondition1\",\n \"values\" : {\n"
},
{
"path": "wkldsuites/HE_Flash_Short_noTRIM",
"chars": 3418,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVI90.fio\",\n \"alias\":\"T6_precondition1\",\n \"values\" : {\n"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM",
"chars": 3522,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM.fio\",\n \"alias\":\"T6_precondition1\",\n \"values\" :"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_1H20",
"chars": 8045,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_2H19.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_1H22",
"chars": 8309,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_1H22.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_1H22_HW_char_9DWPD_highBW_gen5",
"chars": 160568,
"preview": "{\n \"pre\": [\n {\n \"template\": \"TypeVIwTRIM_1H22.fio\",\n \"alias\": \"T6_precondition1\",\n "
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_1H22_HW_char_9DWPD_highBW_gen5_IOPS",
"chars": 156095,
"preview": "{\n \"pre\": [\n {\n \"template\": \"TypeVIwTRIM_1H22.fio\",\n \"alias\": \"T6_precondition1\",\n "
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_1H25",
"chars": 8309,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_1H25.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_2H19",
"chars": 8078,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_2H19.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_2H20",
"chars": 8308,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_2H19.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_RAM",
"chars": 2431,
"preview": "{\n \"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_SIT",
"chars": 539,
"preview": "{\n \"def\":[\n {\n \"template\":\"TypeVIwTRIM.fio\",\n \"alias\":\"L2R6DWPD\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_Sweep",
"chars": 11502,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_2H19.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_Sweep_1H22",
"chars": 8802,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_1H22.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/HE_Flash_Short_wTRIM_Sweep_1H25",
"chars": 11502,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIwTRIM_1H25.fio\",\n \"alias\":\"T6_precondition1\",\n \"valu"
},
{
"path": "wkldsuites/HE_Flash_noTRIM",
"chars": 7729,
"preview": "{\n \"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/HE_Flash_wTRIM",
"chars": 12260,
"preview": "{\n\"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/Idyno_Boot",
"chars": 1433,
"preview": "{\n\"pre\":[\n {\n \"template\":\"idyno.fio\",\n \"alias\":\"idyno_precondition\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/Idyno_Boot_Full_Sweep",
"chars": 17587,
"preview": "{\n\"pre\":[\n {\n \"template\":\"idyno.fio\",\n \"alias\":\"idyno_precondition\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/LE_Flash",
"chars": 15834,
"preview": "{\n\"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/LE_Flash_Short",
"chars": 2534,
"preview": "{\n\"pre\":[\n {\n \"template\":\"prep_flash.fio\",\n \"alias\":\"prep_flash\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/LE_Flash_Short_wTRIM",
"chars": 3024,
"preview": "{\n\"pre\":[\n {\n \"template\":\"TypeVIwTRIM.fio\",\n \"alias\":\"T6_precondition1\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/LE_Flash_Short_wTRIM_SIT",
"chars": 1815,
"preview": "{\n \"def\":[\n {\n \"template\":\"TypeVIwTRIM.fio\",\n \"alias\":\"L2R0.5DWPD\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/LE_Flash_Single",
"chars": 525,
"preview": "{\n \"def\":[\n {\n \"template\":\"TypeVI.fio\",\n \"alias\":\"4K_L2R1.5DWPD\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/Low_Latency_Short_wTRIM",
"chars": 3445,
"preview": "{\n \"def\":[\n {\n \"template\":\"trimrate.fio\",\n \"alias\":\"3GTRIM\",\n \"values\" : {\n "
},
{
"path": "wkldsuites/Messenger_Movement_noTRIM",
"chars": 2070,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIII_Messenger_Movement.fio\",\n \"alias\":\"T8_Messenger_Movement_p"
},
{
"path": "wkldsuites/Messenger_Movement_wTRIM",
"chars": 4409,
"preview": "{\n \"pre\":[\n {\n \"template\":\"TypeVIII_Messenger_Movement_wTRIM_precon.fio\",\n \"alias\":\"T8_Messeng"
}
]
// ... and 74 more files (download for full content)
About this extraction
This page contains the full source code of the facebookincubator/FioSynth GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 274 files (1.1 MB), approximately 350.1k tokens, and a symbol index with 96 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.