diff --git a/README.md b/README.md index 8fb2bde..963d25f 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ I'm not responsible for the data stored using chunkdisk! ## Issues * winspd-x64.dll is not compatible with the original to workaround [an issue](https://github.com/billziss-gh/winspd/issues/10). Specifically, invoking `SpdStorageUnitSendResponse()` or `SpdIoctlTransact()` leads to an undefined behavior. It's fine with the current WinSpd binaries though. The source code is available [here](https://github.com/extratype/winspd). -* I/O performance is not great with SSDs. +* Random I/O performance is not great with SSDs. ## Notes and Tips diff --git a/chunkdisk.rc b/chunkdisk.rc index 1943912..178bf35 100644 --- a/chunkdisk.rc +++ b/chunkdisk.rc @@ -1,8 +1,8 @@ #include VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,9,0,0 - PRODUCTVERSION 0,9,0,0 + FILEVERSION 1,0,0,0 + PRODUCTVERSION 1,0,0,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -18,12 +18,12 @@ BEGIN BLOCK "040904b0" BEGIN VALUE "FileDescription", "chunkdisk" - VALUE "FileVersion", "0.9.0.0" + VALUE "FileVersion", "1.0.0.0" VALUE "InternalName", "chunkdisk.exe" VALUE "LegalCopyright", "Copyright (C) 2021 extratype" VALUE "OriginalFilename", "chunkdisk.exe" VALUE "ProductName", "chunkdisk" - VALUE "ProductVersion", "0.9.0.0" + VALUE "ProductVersion", "1.0.0.0" END END BLOCK "VarFileInfo" diff --git a/docs/archived.txt b/docs/archived.txt index 70d61c7..cdcd784 100644 --- a/docs/archived.txt +++ b/docs/archived.txt @@ -46,3 +46,16 @@ Performance experiments with DiskSpd: DRAM: > 1M IOPS, so single dispatcher SSD: parallel accesses > outstanding (queued) accesses HDD: better sequential performance with queue, tune total request size + +WinSpd requests while sequential access: + Split in maximum transfer length + + Overlap requests in multiple threads to keep disk busy + Buffered read: 2 ~ 4 threads + Buffered write: up to 5 threads + + Requests more out of order with single dispatcher thread + Appears as if strided + Not queued, read-ahead buffer required + + Memory usage: (maximum transfer length) * (number of threads) diff --git a/docs/changes.txt b/docs/changes.txt index 647bc4d..b00f731 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -34,3 +34,11 @@ v0.9 * Make I/O scheduling deterministic for better sequential performance on HDDs. * Merge unmap ranges across requests for better space efficiency. * Flush file metadata after one minute of inactivity. + +v1.0 + +* Change maximum transfer length to 1MB to maximize sequential performance. +* Revert deterministic I/O scheduling to handle concurrent I/O's as intended. +* Improve handling buffers for small-sized I/O's. +* Fix bugs in unaligned (page-based) I/O's. +* Fix inactivity timer. diff --git a/docs/design.txt b/docs/design.txt index e2104e6..dbd3d8c 100644 --- a/docs/design.txt +++ b/docs/design.txt @@ -39,13 +39,8 @@ Asynchronous I/O: -------------------------------------------------------------------------------- -Scheduling requests in dispatcher: - worker = (address / 1048576) % (# of workers) - choose next worker if QD >= 32, wait if all full - - characteristic: - requests parallelized if depth > 32 - requests serialized if size < 1048576 bytes +One worker thread per dispatcher thread: + Bypass/Synchronous/Asynchronous I/O ChunkDiskService: Chunks: diff --git a/main.cpp b/main.cpp index 71d4411..31ed2e3 100644 --- a/main.cpp +++ b/main.cpp @@ -302,7 +302,7 @@ DWORD CreateStorageUnit(PWSTR chunkdisk_file, BOOLEAN write_protected, PWSTR pip err = [¶ms, write_protected, pipe_name, &unit]() -> DWORD { constexpr wchar_t ProductId[] = L"ChunkDisk"; - constexpr wchar_t ProductRevision[] = L"0.9"; + constexpr wchar_t ProductRevision[] = L"1.0"; auto unit_params = SPD_STORAGE_UNIT_PARAMS(); UuidCreate(&unit_params.Guid);