Hi, yes, all about the toy program is the same. It was an attempt to get to 
a minimal example that anyone can reproduce so I could ask for help. The 
real problem is with a larger program where I get this 100% CPU usages 
ramdomly when the server is idle.

I was thinking and with the basic example the nanosleep calls maybe is not 
the scheduller signaling itself because:

 - GODEBUG=asyncpreemptoff=1 has no effect
 - It doesn't happen with Go 1.16
 - It is random. If it where the normal working of the scheduler, wouldn't 
it be predictable?


El martes, 12 de abril de 2022 a las 8:59:06 UTC+2, Brian Candler escribió:

> At the start of the thread, you said "if I compile and run this simple 
> program ..."
>
> Does the problem no longer reproduce with that?
>
> On Monday, 11 April 2022 at 22:59:55 UTC+1 scorr...@gmail.com wrote:
>
>> I tried with a more complex application and already got constant 100% CPU 
>> usage twice. 
>>
>> When I attach strace I see the same as with the minimal demo but with 
>> much more frecuency:
>>
>> [pid 42659] 23:36:49.035120 epoll_pwait(3, [], 128, 0, NULL, 
>> 140341803388040) = 0
>> [pid 42659] 23:36:49.035133 epoll_pwait(3, [], 128, 0, NULL, 
>> 18704162493558) = 0
>> [pid 42659] 23:36:49.035145 epoll_pwait(3, [], 128, 0, NULL, 
>> 140341803388040) = 0
>> [pid 42659] 23:36:49.035158 epoll_pwait(3, [], 128, 0, NULL, 
>> 18704162493558) = 0
>> [pid 42659] 23:36:49.035170 epoll_pwait(3, [], 128, 0, NULL, 
>> 140341803388040) = 0
>> [pid 42659] 23:36:49.035182 epoll_pwait(3, [], 128, 0, NULL, 
>> 18704162493558) = 0
>> [pid 42659] 23:36:49.035195 epoll_pwait(3, [], 128, 0, NULL, 
>> 140341803388040) = 0
>> [pid 42659] 23:36:49.035207 epoll_pwait(3, [], 128, 0, NULL, 
>> 18704162493558) = 0
>> [pid 42659] 23:36:49.035219 epoll_pwait(3, [], 128, 0, NULL, 
>> 140341803388040) = 0
>> [pid 42659] 23:36:49.035232 epoll_pwait(3, [], 128, 0, NULL, 
>> 18704162493558) = 0
>> [pid 42659] 23:36:49.035244 epoll_pwait(3, [], 128, 0, NULL, 
>> 140341803388040) = 0
>> [pid 42659] 23:36:49.035257 epoll_pwait(3, [], 128, 0, NULL, 
>> 18704162493558) = 0
>> [pid 42659] 23:36:49.035269 epoll_pwait(3, [], 128, 0, NULL, 
>> 140341803388040) = 0
>> [pid 42659] 23:36:49.035281 epoll_pwait(3, [], 128, 0, NULL, 
>> 18704162493558) = 0
>> [pid 42659] 23:36:49.035293 epoll_pwait(3, [], 128, 0, NULL, 
>> 140341803388040) = 0
>> [pid 42659] 23:36:49.035306 epoll_pwait(3, [], 128, 0, NULL, 
>> 18704162493558) = 0
>>
>> The program is too large to post here. I have tested it with go race and 
>> it doesn't run into any problem. Any idea of what to look for?
>>
>> Thank you!
>>
>> El lunes, 11 de abril de 2022 a las 17:08:40 UTC+2, Santiago Corredoira 
>> escribió:
>>
>>> I tried with the stripped tmp version of "go run" and after a while I 
>>> was able to reproduce it too. It definitely took me more time but probably 
>>> is just random. 
>>>
>>> I tried "$ GODEBUG=asyncpreemptoff=1 ./test" and I kept seeing the the 
>>> calls every 10ms. Is this expected to happen?
>>>
>>> I compiled the test with "$ go1.16 build test.go" and I tried hard to 
>>> reproduce it but I couldn't. It is very strange because this behaviour was 
>>> introduced in Go 1.14 and I only see it in Go 1.17. Also asyncpreemptoff=1 
>>> seems to make no difference.
>>>
>>> I am going to work again with Go 1.18 by default to see if I get the 
>>> 100% CPU usage.
>>>
>>> El lunes, 11 de abril de 2022 a las 13:28:48 UTC+2, Brian Candler 
>>> escribió:
>>>
>>>> On Monday, 11 April 2022 at 09:26:28 UTC+1 scorr...@gmail.com wrote:
>>>>
>>>>> and the output keeps growing like that with every new curl request 
>>>>> until eventually it starts constantly printing output like this:
>>>>>
>>>>>>
>>>>>> [pid 143818] 10:02:22.697120 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.707609 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.718125 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.728753 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.739195 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.749618 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.760160 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.770669 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.781137 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.791581 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.802060 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.812540 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.822981 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>> [pid 143818] 10:02:22.833468 nanosleep({tv_sec=0, tv_nsec=10000000}, 
>>>>>> NULL) = 0
>>>>>>
>>>>>>
>>>> That is normal, I believe, for a process with multiple runnable 
>>>> goroutines - one alarm/wakeup call every 10ms.
>>>>
>>>> What is odd is the 100% CPU utilisation.  Can you attach an strace when 
>>>> that happens?
>>>>
>>>> As for the binary produced by "go run" - use "ps" to see where it is.  
>>>> For example:
>>>>
>>>> ==> sleepy.go <==
>>>> package main
>>>>
>>>> import (
>>>>     "sync"
>>>>         "time"
>>>> )
>>>>
>>>> func main() {
>>>>     var wg sync.WaitGroup
>>>>     wg.Add(1)
>>>>         go func() {
>>>>                 time.Sleep(30 * time.Second)
>>>>                 wg.Done()
>>>>         }()
>>>>     wg.Wait()
>>>> }
>>>> ==> end <==
>>>>
>>>> $ go run sleepy.go
>>>>
>>>> ... in another window ...
>>>> $ ps auxwww | grep sleepy
>>>> ubuntu     17743  0.0  0.1 1237424 12428 pts/1   Sl+  11:23   0:00 go 
>>>> run sleepy.go
>>>> ubuntu     17782  0.0  0.0 702468  1052 pts/1    Sl+  11:23   0:00 
>>>> /tmp/go-build2834561198/b001/exe/sleepy
>>>>
>>>> You can 'cp' it somewhere to keep it safe.
>>>>
>>>> If I compare this with the output of "go build sleepy.go", I see that 
>>>> the "go build" version is larger and unstripped:
>>>>
>>>> $ cp /tmp/go-build2834561198/b001/exe/sleepy sleepy-run
>>>> $ file sleepy-run
>>>> sleepy-run: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), 
>>>> statically linked, stripped
>>>> $ go build sleepy.go
>>>> $ file sleepy
>>>> sleepy: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically 
>>>> linked, not stripped
>>>>
>>>> Then "strip sleepy" gives me a binary which is almost, but not quite, 
>>>> the same size as the one from "go run".  So that gives you another way to 
>>>> try to reproduce the problem - although if the difference is just between 
>>>> stripped and unstripped, then it's most likely some sort of edge timing 
>>>> case.
>>>>
>>>

-- 
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/e2cab20c-a9c5-4d21-9aa8-ab1d0cef4d54n%40googlegroups.com.

Reply via email to