CMU-SAFARI / MQSim

MQSim is a fast and accurate simulator modeling the performance of modern multi-queue (MQ) SSDs as well as traditional SATA based SSDs. MQSim faithfully models new high-bandwidth protocol implementations, steady-state SSD conditions, and the full end-to-end latency of requests in modern SSDs. It is described in detail in the FAST 2018 paper by Arash Tavakkol et al., "MQSim: A Framework for Enabling Realistic Studies of Modern Multi-Queue SSD Devices" (https://people.inf.ethz.ch/omutlu/pub/MQSim-SSD-simulation-framework_fast18.pdf)
https://people.inf.ethz.ch/omutlu/pub/MQSim-SSD-simulation-framework_fast18.pdf
MIT License
273 stars 149 forks source link

simulation time does not equal to the 'stop time' defined in the workload.xml #13

Closed WaterccL closed 4 years ago

WaterccL commented 5 years ago

I use MQSim to run a Synthetic workload which generates random requests. In the workload.xml, the stop time is 10s. At first, we set the Read_Percentage to 0, and the total simulation time is 12s. Then we set the Read_Percentage to 100, and the total simulation time is 25s. Is this a normal phenomenon? I guess that the simulation time should correspond to the stop time of workload.xml.

arashta commented 5 years ago

Thanks for reporting the issue. This is certainly possible in cases that the arrival rate of the host I/O requests is higher than the maximum throughput of the modeled SSD device. In these cases, the host-side I/O request generator stops generating requests at the specified time, but too many I/O requests remain waiting in the host-side I/O queues. The modeled SSD device continues executing waiting I/O requests in the host-side queues until all of them are serviced. Can you please send us your input files for further investigation? We may change the configuration parameters' name to prevent confusion.

Mappouras commented 5 years ago

There is also a related bug where execution time is used to calculate IOPS. In file src/host/IO_Flow_Base.cpp, in line 493: val = std::to_string((double)STAT_generated_request_count / (Simulator->Time() / SIM_TIME_TO_SECONDS_COEFF));

should be changed to: val = std::to_string((double)STAT_generated_request_count / (Simulator->Time() /(double)SIM_TIME_TO_SECONDS_COEFF));

Otherwise, if your execution time is not an integer in seconds (e.g. 1.5 seconds) the result of the IOPS is wrong. Similar for lines 497 and 501 of the same file.