Setting "nice=-5" (i.e. "Above normal" priority) gives fio sufficient
scheduling priority to keep the disk queues full. Otherwise, with more
than 2 disks it can't keep up with SSDs.
--
Bruce
From b08e984dfaaf4b0105c27bb7fe744c405d0abcd4 Mon Sep 17 00:00:00 2001
From: Bruce Cran <bruce.cran@xxxxxxxxx>
Date: Wed, 12 Oct 2016 03:22:47 +0100
Subject: [PATCH] Implement nice() for Windows
Map the following ranges for the "nice" option:
Less than -15: High
-1 through -15: Above normal
0: Normal
1 through 15: Below normal
More than 15: Low/Idle
---
HOWTO | 4 ++++
os/windows/posix.c | 17 +++++++++++++----
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/HOWTO b/HOWTO
index 07419a1..cf1024c 100644
--- a/HOWTO
+++ b/HOWTO
@@ -1066,6 +1066,10 @@ random_generator=str Fio supports the following engines for generating
nice=int Run the job with the given nice value. See man nice(2).
+ On Windows, values less than -15 set the process class to "High";
+ -1 through -15 set "Above Normal"; 1 through 15 "Below Normal";
+ and above 15 "Idle" priority class.
+
prio=int Set the io priority value of this job. Linux limits us to
a positive value between 0 and 7, with 0 being the highest.
See man ionice(1). Refer to an appropriate manpage for
diff --git a/os/windows/posix.c b/os/windows/posix.c
index 3388127..bbd93e9 100755
--- a/os/windows/posix.c
+++ b/os/windows/posix.c
@@ -647,10 +647,19 @@ int setgid(gid_t gid)
int nice(int incr)
{
- if (incr != 0) {
- errno = EINVAL;
- return -1;
- }
+ DWORD prioclass = NORMAL_PRIORITY_CLASS;
+
+ if (incr < -15)
+ prioclass = HIGH_PRIORITY_CLASS;
+ else if (incr < 0)
+ prioclass = ABOVE_NORMAL_PRIORITY_CLASS;
+ else if (incr > 15)
+ prioclass = IDLE_PRIORITY_CLASS;
+ else if (incr > 0)
+ prioclass = BELOW_NORMAL_PRIORITY_CLASS;
+
+ if (!SetPriorityClass(GetCurrentProcess(), prioclass))
+ log_err("fio: SetPriorityClass failed\n");
return 0;
}
--
2.9.3.windows.2