Characterizing the I/O workload and performance of computational science applications has not been as well studied as other aspects of application performance. I/O studies are difficult because applications can use I/O for a variety of different purposes, such as initializing data structures, temporary storage of intermediate results that exceed memory capacity, recording or resuming the state of the computation, and saving the results of the computation, and these activities can produce significantly different workloads. Most studies to date rely on either recording I/O traces (e.g., Recorder~\cite{Recorder}), or characterizing I/O using statistical methods (e.g., Darshan~\cite{Darshan}), and then reproducing these with an I/O workload generator (e.g., IOR~\cite{IOR}). Both I/O trace and I/O characterization are limited to recording a specific run of a single application, and the I/O characterization technique throws away a lot of information, which makes it harder to regenerate an accurate workload. Additionally, generation of parallel I/O workloads typically requires more than just simulating read/write operations for each process, since there is usually some kind of synchronization involved between the processes as well. Unless these synchronization activities can also be simulated, the resulting I/O workload is unlikely to match the real workload with any accuracy. Benchmarking tools like IOR also focus mainly on sequential read and write performance using simple one-dimensional arrays of data. Although a large proportion of applications only use sequential I/O, not all do, and most employ complex multi-dimensional data structures rather than one-dimensional arrays.

MACSio is an effort to move up to higher layers of the I/O stack in order to better simulate a variety of different application I/O patterns for the purpose of assessing I/O performance. Rather than starting with low-level I/O primitives and adding additional delay and synchronization steps, MACSio begins by providing a framework that emulates a mesh-based computation using complex “real world” data structures such as those used for multi-physics applications like finite-element methods or computational fluid dynamics simulations. Various parameters are provided to control the structure of the mesh, how many variables are being simulated, and the volume and frequency of I/O operations, with the goal that this will approximate with some degree of accuracy the I/O behavior of real applications.