From: Christian Franke <Christian.Franke@t-online.de>
To: cygwin@cygwin.com
Subject: Re: Run a Cygwin process with "higher" scheduler priority
Date: Sun, 15 Oct 2023 15:04:06 +0200 [thread overview]
Message-ID: <eb337eaf-40d4-5113-0629-43fcb76a8ffc@t-online.de> (raw)
In-Reply-To: <d4e2d459-59bd-4be5-a47e-aecf7863cbcb@Shaw.ca>
Brian Inglis via Cygwin wrote:
> On 2023-10-14 07:47, Eliot Moss via Cygwin wrote:
>> On 10/14/2023 7:39 AM, Cedric Blancher via Cygwin wrote:
>>> On Fri, 11 Aug 2023 at 19:14, Brian Inglis wrote:
>>>> ...
>>>
>>>> ...
>>>> $ cygcheck -p usr/bin/chrt
>>>> Found 2 matches for usr/bin/chrt
>>>> util-linux-debuginfo-2.33.1-2 - util-linux-debuginfo: Debug info
>>>> for util-linux
>>>> util-linux-2.33.1-2 - util-linux: Collection of basic system utilities
>>>> $ cygcheck -p usr/bin/taskset
>>>> Found 2 matches for usr/bin/taskset
>>>> util-linux-debuginfo-2.33.1-2 - util-linux-debuginfo: Debug info
>>>> for util-linux
>>>> util-linux-2.33.1-2 - util-linux: Collection of basic system utilities
>>>> so you may need to install util-linux (coreutils is already
>>>> installed as a base
>>>> package for Cygwin) then:
>>>> $ man nice renice taskset chrt
>>> chrt does not work, the syscalls for realtime seem to be not
>>> implemented.
These are partly implemented, but sched_setscheduler() always fails with
ENOSYS because scheduler policy (SCHED_*) cannot be changed on Windows.
Changing priority only with sched_setparam() would work, but this is not
used by chrt.
>>>> You may need to run these from an elevated admin shell for other
>>>> user ids,
>>>> unowned processes, or higher (negative) priority.
>>>> It has been years since I tried these so can no longer remember if -20
>>>> corresponds to Windows "RealTime" or if you need to use PowerShell
>>>> to set that e.g.
>>>> $proc = Get-Process -ProcessName "..."
>>>> $proc.PriorityClass = "RealTime"
>>>> and that needs to be done from an elevated admin (Power)Shell.
>>>> Of course, never set that on any system except on a very idle, very
>>>> I/O bound,
>>>> well tested process, such as ntpd, that needs stably fast interrupt
>>>> service and
>>>> non-preemptible cpu access for ms every few seconds, preferably on
>>>> a single or
>>>> few cpus to which affinity is set.
>>> Is there anything in /proc which can tell me the current *Windows*
>>> scheduler priority level? Or a command line tool?
>> I recall getting taskset going in util-linux a while back, but I don't
>> recall working on priority related things. You could look into the
>> cygwin source code to see how Windows priorities relate to the priority
>> values in Cygwin. Then you may be able just to use /proc/[pid]/stat
>> read out what you want.
>
> ISTR testing nice/renice, and found it was a simple priority mapping
> to/from Unix to Windows Idle to RealTime (at the time, process
> Affinity was not supported, so went with a PowerShell startup script
> instead); see:
>
> https://cygwin.com/git/?p=newlib-cygwin.git;a=blob;f=winsup/cygwin/sched.cc#l107
>
>
> https://cygwin.com/git/?p=newlib-cygwin.git;a=blob;f=winsup/cygwin/sched.cc#l234
>
>
> https://cygwin.com/git/?p=newlib-cygwin.git;a=blob;f=winsup/cygwin/sched.cc#l277
>
The above maps priorities for sched_*() API. The mapping for nice() and
get/setpriority() is done here:
https://cygwin.com/git/?p=newlib-cygwin.git;a=blob;f=winsup/cygwin/miscfuncs.cc;h=767384f#l110
> They are documented in proc(5) /proc/PID/stat fields 18 priority and
> 19 nice typically 20 and 0, as shown by `top` PR and NI, shown by
> `procps -l` as 80 and 0, and not shown by Cygwin `ps`.
On Cygwin, field 18 is always equal to (field_19 + 20). The priority
value returned by sched_getparam() is different and could be shown with
'chrt -p PID'.
The output from the command 'nice' without parameter may differ from
/proc/PID/stat field 19 because the latter always reinterprets the
current Windows prio class.
This script prints a table of 'nice' outputs, /proc/PID/stat fields 19
and 18, result of sched_getparam() and corresponding Windows prio class
for different 'nice -n ...' commands:
#!/bin/bash
echo "COMMAND : NICE STAT STPRI RTPRI WINPRI"
for i in {-21..20}; do
nice -n $i sh -e -c '
n=$(nice)
s=$(cut -d" " -f19 /proc/$$/stat)
p=$(cut -d" " -f18 /proc/$$/stat)
r=$(LC_MESSAGES=C chrt -p $$ | sed -n "s,^.*priority: ,,p")
case $r in
3) c="IDLE_PRIORITY_CLASS" ;;
9) c="BELOW_NORMAL_PRIORITY_CLASS" ;;
15) c="NORMAL_PRIORITY_CLASS" ;;
21) c="ABOVE_NORMAL_PRIORITY_CLASS" ;;
27) c="HIGH_PRIORITY_CLASS" ;;
32) c="REALTIME_PRIORITY_CLASS" ;;
*) c="?" ;;
esac
printf "nice -n %3d:%5d %5d %5d %5d %s\\n" \
"'$i'" "$n" "$s" "$p" "$r" "$c"
'
done
--
Regards,
Christian
next prev parent reply other threads:[~2023-10-15 13:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-11 15:44 Cedric Blancher
2023-08-11 17:14 ` Brian Inglis
2023-10-14 11:39 ` Cedric Blancher
2023-10-14 13:47 ` Eliot Moss
2023-10-15 3:55 ` Brian Inglis
2023-10-15 13:04 ` Christian Franke [this message]
2023-10-14 22:52 ` Mark Geisert
2023-10-30 6:09 ` Chris Wagner
2023-10-30 7:43 ` Backwoods BC
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=eb337eaf-40d4-5113-0629-43fcb76a8ffc@t-online.de \
--to=christian.franke@t-online.de \
--cc=cygwin@cygwin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).