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


--
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to