public inbox for cygwin@cygwin.com
 help / color / mirror / Atom feed
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


  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).