Thank you. I guess the interesting question here is whether current
SCHED_OTHER behavior makes sense for majority of usecases (or any,
really).

I think current situation makes isolcpus unusable in at least one common
case - when user want to isolate some critical multithreaded application
e.g. benchmark. Usually it's not desirable to add some custom scheduling
logic to such program (e.g. source code may not even be available).

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/2116749

Title:
  Thread affinity broken under isolcpus

Status in linux package in Ubuntu:
  Invalid

Bug description:
  I'd like to report a bug with unexpected scheduling of programs run
  with `taskset` when target cores have been reserved via `isolcpus`
  setting (e.g. for benchmark stability purposes).

  When I try to run multi-threaded program on reserved cores:
  ```
  $ taskset -c 1-3 ./a.out
  ```
  OS will pin all of them to single core for the whole duration of lifetime.

  I would instead expect them to be distributed evenly across allowed
  cores (1-3 in this case). Threads are distributed correctly if program
  is run under `chrt -f 1`.

  The attached small test program illustrates issues with isolcpus and
  taskset (see below). Results were obtained for Ubuntu 24.04 running on
  4-core VirtualBox VM (I've also reproduced them on real PC with Ubuntu
  22.04). Bug has also been reported previously (by another user) in
  https://serverfault.com/questions/573025/taskset-not-working-over-a-
  range-of-cores-in-isolcpus

  Isolcpus is very useful for obtaining stable CPU benchmark results and
  effective lack of support for multi-threaded apps is unfortunate.

  Everything works as expected when isolcpus is not set:

  1) without `taskset` threads run on all cores:
  ```
  yugr@yugr-VirtualBox:~/tasks/isolcpus$ gcc -O2 test.c -pthread
  yugr@yugr-VirtualBox:~/tasks/isolcpus$ ./a.out
  Thread 7 was scheduled on 1 2
  Thread 5 was scheduled on 2 3
  Thread 11 was scheduled on 0 2 3
  Thread 1 was scheduled on 1 2 3
  Thread 2 was scheduled on 0 1 3
  Thread 8 was scheduled on 0 1
  Thread 6 was scheduled on 0 1 2
  Thread 9 was scheduled on 0 1 2 3
  Thread 4 was scheduled on 1 2 3
  Thread 10 was scheduled on 0 2 3
  Thread 0 was scheduled on 0 1 3
  Thread 3 was scheduled on 0 1 2 3
  ```

  2) with taskset threads run according to the mask:
  ```
  yugr@yugr-VirtualBox:~/tasks/isolcpus$ taskset -c 2-3 ./a.out
  Thread 3 was scheduled on 2
  Thread 4 was scheduled on 2
  Thread 0 was scheduled on 2
  Thread 5 was scheduled on 2 3
  Thread 2 was scheduled on 2 3
  Thread 10 was scheduled on 2 3
  Thread 11 was scheduled on 2 3
  Thread 1 was scheduled on 2 3
  Thread 9 was scheduled on 2 3
  Thread 8 was scheduled on 2 3
  Thread 6 was scheduled on 3
  Thread 7 was scheduled on 2 3
  ```

  And here are results after adding `isolcpus=1-3` to
  `GRUB_CMDLINE_LINUX_DEFAULT` in `/etc/default/grub` and doing `sudo
  update-grub`.

  1) without taskset results are expected (everything goes to core 0):
  ```
  yugr@yugr-VirtualBox:~/tasks/isolcpus$ ./a.out
  Thread 11 was scheduled on 0
  Thread 3 was scheduled on 0
  Thread 0 was scheduled on 0
  Thread 1 was scheduled on 0
  Thread 6 was scheduled on 0
  Thread 8 was scheduled on 0
  Thread 4 was scheduled on 0
  Thread 7 was scheduled on 0
  Thread 5 was scheduled on 0
  Thread 10 was scheduled on Thread 9 was scheduled on 0
  Thread 2 was scheduled on 0
  0
  ```

  2) but with taskset for some reason everything goes to single core (rather 
than three, 1-3) as well:
  ```
  yugr@yugr-VirtualBox:~/tasks/isolcpus$ taskset -c 1-3 ./a.out
  Thread 3 was scheduled on 3
  Thread 2 was scheduled on 3
  Thread 0 was scheduled on 3
  Thread 9 was scheduled on 3
  Thread 8 was scheduled on 3
  Thread 1 was scheduled on Thread 6 was scheduled on Thread 5 was scheduled on 
3
  Thread 4 was scheduled on 3
  3
  3
  Thread 11 was scheduled on Thread 7 was scheduled on Thread 10 was scheduled 
on 3
  3
  3
  ```

  Everything fixed with `SCHED_FIFO` policy:
  ```
  yugr@yugr-VirtualBox:~/tasks/isolcpus$ chrt -f 1 taskset -c 1-3 ./a.out
  Thread 2 was scheduled on 1
  Thread 1 was scheduled on 2
  Thread 0 was scheduled on 3
  Thread 5 was scheduled on 3
  Thread 4 was scheduled on 2
  Thread 3 was scheduled on 1
  Thread 7 was scheduled on 2
  Thread 6 was scheduled on 3
  Thread 8 was scheduled on 1
  Thread 9 was scheduled on 2
  Thread 10 was scheduled on 3
  Thread 11 was scheduled on 1
  ```

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2116749/+subscriptions


-- 
Mailing list: https://launchpad.net/~kernel-packages
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~kernel-packages
More help   : https://help.launchpad.net/ListHelp

Reply via email to