I am not sure that is true unless things have changed. You can configure the 
interrupt/kernel handlers to run on specific cpus and keep other cpus and their 
caches completely isolated. There was an issue at one point with clock timings 
but as I recall it was resolved (it’s been several years so I don’t remember 
the specifics).

We were using the Linux with real-time kernel.

> On Sep 27, 2024, at 10:44 AM, 'TheDiveO' via golang-nuts 
> <golang-nuts@googlegroups.com> wrote:
> 
> you need to keep a bunch of per-cpu ("per-core") kernel threads and you need 
> to make sure not to starve them, but for a short test that's okay. oh, and 
> don't have any processes running that use io uring...
> 
> On Friday, September 27, 2024 at 5:37:53 PM UTC+2 robert engels wrote:
> Also, you can configure the kernel at boot to exclude certain cpus from the 
> OS completely so no process can interfere with them - BUT - processes/threads 
> can still be moved to these isolated cpus using setsched().
> 
> 
>> On Sep 27, 2024, at 10:34 AM, robert engels <ren...@ix.netcom.com 
>> <applewebdata://FC938292-ECE6-49EB-888C-A6218D3C7838>> wrote:
>> 
> 
>> What you want to do is start the process with a cset to restrict the cores 
>> it can use - then use the setsched to move certain threads to cores that 
>> have been excluded.
>> 
>>> On Sep 27, 2024, at 10:26 AM, 'TheDiveO' via golang-nuts 
>>> <golan...@googlegroups.com 
>>> <applewebdata://FC938292-ECE6-49EB-888C-A6218D3C7838>> wrote:
>>> 
>>> Are you running this on a multi-core? Your non-fifo tasks can be scheduled 
>>> to other cores, et cetera. BTW, fifo 99 is a recipe for desaster as it can 
>>> starve the kernel on a core, preventing necessary kernel house-keeping. 
>>> Don't ask me how I know...
>>> 
>>> What is the reason for setting GOMAXPROCS, I'm at a loss here, so 
>>> appreciating help! IIRC, OS-thread locked goroutines don't count against 
>>> this limit.
>>> 
>>> This looks like a situation where I personally would fire off recording 
>>> kernel scheduler tracepoint events and then having a close look at in 
>>> kernelshark at what really is going on. There are syscalls in the FIFO 
>>> scheduled path that might cause preemption. I would look at sched_switch 
>>> here, as well as sched_switch_new. Maybe print the TIDs so you can find 
>>> your go-routine related tasks in all the scheduler event noise, but maybe 
>>> the binary's comm (name) might be already sufficient if you give it a 
>>> catchy name.
>>> 
>>> A steeper learning curve would be to prepare a bpftrace script matching on 
>>> the comm/name on the scheduler trace events, to get an idea of whats going 
>>> on.
>>> 
>>> On Thursday, September 26, 2024 at 5:49:53 AM UTC+2 Zhao Weng wrote:
>>> Hi gophers, 
>>> I'm doing a research on how to prioritise some goroutines over others.So I 
>>> can allocate more CPU resource to more important part of the program.
>>> I try to do it by calling runtime.LockOSThread to assign the goroutine 
>>> needs to be prioritise to a designated OS thread, and unix.SchedSetAttr to 
>>> prioritise that OS thread. Here is the code:
>>> 
>>> ```go
>>> package main
>>> 
>>> import (
>>>     "flag"
>>>     "fmt"
>>>     "runtime"
>>>     "sync"
>>>     "time"
>>> 
>>>     "golang.org/x/sys/unix <http://golang.org/x/sys/unix>"
>>> )
>>> 
>>> var (
>>>     nPrioritizedGoroutines = flag.Int("p", 1, "# of prioritized goroutines")
>>>     nNormalGoroutines      = flag.Int("n", 1, "# of normal goroutines")
>>>     restDuration           = flag.Duration("r", 0, "rest for a certain 
>>> amount of time between works")
>>> )
>>> 
>>> func prioritizeThread() {
>>>     // set thread priority to the highest
>>>     a := unix.SchedAttr{
>>>         Size:     unix.SizeofSchedAttr,
>>>         Policy:   1,
>>>         Priority: 99,
>>>     }
>>> 
>>>     if err := unix.SchedSetAttr(0, &a, 0); err != nil {
>>>         panic(err)
>>>     }
>>> }
>>> 
>>> func doWorks(workerId int) {
>>>     t := time.Now()
>>>     for i := 0; i < 100; i++ {
>>>         st := time.Now()
>>>         res := 0
>>>         for ii := 0; ii < 1e9; ii++ {
>>>             res += ii
>>>         }
>>>         fmt.Printf("%d@%d, timecost: %s, res: %d \n", workerId, 
>>> unix.Gettid(), time.Since(st), res)
>>> 
>>>         // sleep for a while to simulate gaps between requests.
>>>         if *restDuration > 0 {
>>>             time.Sleep(*restDuration)
>>>         }
>>>     }
>>>     fmt.Printf("total execute time for worker: %d is %s\n", workerId, 
>>> time.Since(t))
>>> }
>>> 
>>> func main() {
>>>     flag.Parse()
>>> 
>>>     runtime.GOMAXPROCS(*nPrioritizedGoroutines)
>>>     var wg sync.WaitGroup
>>> 
>>>     workerId := 0
>>>     for i := 0; i < *nPrioritizedGoroutines; i++ {
>>>         wg.Add(1)
>>>         go func(workerId int) {
>>>             // assign goroutine to a designated thread
>>>             runtime.LockOSThread()
>>>             // prioritize this thread
>>>             prioritizeThread()
>>> 
>>>             defer wg.Done()
>>>             doWorks(workerId)
>>>         }(workerId)
>>>         workerId++
>>>     }
>>> 
>>>     for i := 0; i < *nNormalGoroutines; i++ {
>>>         wg.Add(1)
>>>         go func(workerId int) {
>>>             defer wg.Done()
>>>             doWorks(workerId)
>>>         }(workerId)
>>>         workerId++
>>>     }
>>> 
>>>     wg.Wait()
>>> }
>>> ```
>>> compile on linux, and run with command `sudo ./sche`, it seems not working, 
>>> CPU resource is shared by two thread, and two goroutine execute `doWorks` 
>>> in similar timecost(1.5 seconds).
>>> 
>>> sudo ./sche
>>> 1@255429, timecost: 1.475347182s, res: 499999999500000000
>>> 0@255425, timecost: 1.517077413s, res: 499999999500000000
>>> 1@255429, timecost: 1.473167148s, res: 499999999500000000
>>> 0@255425, timecost: 1.515322146s, res: 499999999500000000
>>> 1@255429, timecost: 1.494751901s, res: 499999999500000000
>>> 0@255425, timecost: 1.532692691s, res: 499999999500000000
>>> 
>>> while with 1 goroutine only, the timecost will be 0.75 seconds
>>> 
>>> sudo ./sche -n 0
>>> 0@257072, timecost: 751.18938ms, res: 499999999500000000
>>> 0@257072, timecost: 747.364725ms, res: 499999999500000000
>>> 0@257072, timecost: 745.362553ms, res: 499999999500000000
>>> 0@257072, timecost: 748.353778ms, res: 499999999500000000
>>> 
>>> Am I doing anything wrong here?
>>> 
>>> Zhao Weng
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email to golang-nuts...@googlegroups.com 
>>> <applewebdata://FC938292-ECE6-49EB-888C-A6218D3C7838>.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/golang-nuts/27ad2fb1-97df-43eb-84a9-1c83669ad2e2n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/golang-nuts/27ad2fb1-97df-43eb-84a9-1c83669ad2e2n%40googlegroups.com?utm_medium=email&utm_source=footer>.
>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golang-nuts...@googlegroups.com 
>> <applewebdata://FC938292-ECE6-49EB-888C-A6218D3C7838>.
> 
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/golang-nuts/1EA11541-07A1-4A85-8775-F256EC2338EB%40ix.netcom.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/1EA11541-07A1-4A85-8775-F256EC2338EB%40ix.netcom.com?utm_medium=email&utm_source=footer>.
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com 
> <mailto:golang-nuts+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/131cb640-3de2-4ae0-b833-e3fd75c865c3n%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/golang-nuts/131cb640-3de2-4ae0-b833-e3fd75c865c3n%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/44F1F6FF-2486-4FEF-97A5-B5D5A12BB7BB%40ix.netcom.com.

Reply via email to