I discovered this in another very similar pc, a bit older Lenovo Legion laptop:
$ grep "model" /proc/cpuinfo | sort | uniq -c 12 model : 158 12 model name : Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz $ uname -r 5.4.0-107-generic $ cat /etc/*ease DISTRIB_ID=LinuxMint DISTRIB_RELEASE=19.3 The 100% CPU spikes would sart at any moment and would usually stop after a I made a new http request to the server. El lunes, 11 de abril de 2022 a las 10:15:23 UTC+2, Santiago Corredoira escribió: > Hi Brian, thanks for your help. > > Al my go downloads are from go.dev > In this tests I am using > > $ go version > go version go1.18 linux/amd64 > > I run the tests in a laptop with linux as the main OS, no emulation. > > $ grep "model" /proc/cpuinfo | sort | uniq -c > 12 model : 165 > 12 model name : Intel(R) Core(TM) i7-10750H CPU @ 2.60GHz > > $ uname -r > 5.4.0-107-generic > > $ cat /etc/os-release > NAME="Linux Mint" > VERSION="20.3 (Una)" > > I just spent 5 hours obsesively trying to reproduce it and I know it > sounds very strange. The 100% CPU spikes is how I started noticing this, > because the laptop fan would start spinning at full speed. Since then, I am > using go1.16 from go.dev and "go install golang.org/dl/go1.16@latest && > go1.16 download" and I haven't experienced it again. > > I checked the issue links and it seems similar to what I am seeing, but > only from version 1.17 and on. Also they say you can dissable it with > GODEBUG=asyncpreemptoff=1 but I see the problem in the build version. Maybe > the difference with go run is that it probably adds debug flags? I expected > it to just compile the program in a temp location and run it, but this is a > consistent difference I just tested: > > $ go run test.go > > And in another console: > > $ ps aux | grep test.go > bill 143464 2.5 0.1 1897584 16480 pts/3 Sl+ 09:54 0:00 go run > test.go > bill 143604 0.0 0.0 11568 2764 pts/4 S+ 09:54 0:00 grep > --color=auto test.go > $ sudo strace -f -tt -p 143464 > strace: Process 143464 attached with 17 threads > [pid 143544] 09:54:42.564230 futex(0xc000224148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143485] 09:54:42.564321 futex(0xc00056a148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143478] 09:54:42.564340 epoll_pwait(4, <unfinished ...> > [pid 143477] 09:54:42.564366 futex(0xc000580548, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143476] 09:54:42.564386 futex(0xc000680148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143475] 09:54:42.564407 futex(0xc000580148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143474] 09:54:42.564430 futex(0xc000500148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143473] 09:54:42.564451 futex(0xdf3e80, FUTEX_WAIT_PRIVATE, 0, NULL > <unfinished ...> > [pid 143472] 09:54:42.564471 futex(0xc000400148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143471] 09:54:42.564493 futex(0xc000380148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143470] 09:54:42.564515 futex(0xc000300148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143469] 09:54:42.564535 futex(0xdf3d38, FUTEX_WAIT_PRIVATE, 0, NULL > <unfinished ...> > [pid 143468] 09:54:42.564556 futex(0xc000090148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143467] 09:54:42.564576 futex(0xc000023148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143466] 09:54:42.564596 futex(0xc000022d48, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143465] 09:54:42.564616 restart_syscall(<... resuming interrupted > read ...> <unfinished ...> > [pid 143464] 09:54:42.564637 waitid(P_PID, 143586, <unfinished ...> > [pid 143465] 09:55:14.806222 <... restart_syscall resumed>) = -1 ETIMEDOUT > (Connection timed out) > [pid 143465] 09:55:14.806608 nanosleep({tv_sec=0, tv_nsec=20000}, NULL) = 0 > [pid 143465] 09:55:14.807053 futex(0xdc55d8, FUTEX_WAIT_PRIVATE, 0, > {tv_sec=60, tv_nsec=0} > > In another console I would request multiple times: > > $ curl http://localhost:8080 > or > $ wrk -d2 http://localhost:8080 > > but strace won't show anything else. It just stays like that and CPU's > show 0% activity when is not getting requests. > > On the other hand, if I compile it: > > $ go build test.go > $ ./test > > Check strace in another console, it starts like this: > > $ ps aux | grep ./test > bill 143817 0.0 0.0 1077296 4448 pts/3 Sl+ 09:57 0:00 ./test > bill 143829 0.0 0.0 11568 712 pts/4 S+ 09:58 0:00 grep > --color=auto ./test > $ sudo strace -f -tt -p 143817 > strace: Process 143817 attached with 6 threads > [pid 143818] 09:58:23.811515 restart_syscall(<... resuming interrupted > read ...> <unfinished ...> > [pid 143822] 09:58:23.811538 futex(0x85f438, FUTEX_WAIT_PRIVATE, 0, NULL > <unfinished ...> > [pid 143821] 09:58:23.811561 futex(0xc000080148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143820] 09:58:23.811580 futex(0xc000015148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143819] 09:58:23.811585 futex(0xc000014d48, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143817] 09:58:23.811613 epoll_pwait(5, > > But below is what I get with a single curl request: > > $ sudo strace -f -tt -p 143817 > strace: Process 143817 attached with 6 threads > [pid 143818] 09:58:23.811515 restart_syscall(<... resuming interrupted > read ...> <unfinished ...> > [pid 143822] 09:58:23.811538 futex(0x85f438, FUTEX_WAIT_PRIVATE, 0, NULL > <unfinished ...> > [pid 143821] 09:58:23.811561 futex(0xc000080148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143820] 09:58:23.811580 futex(0xc000015148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143819] 09:58:23.811585 futex(0xc000014d48, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143817] 09:58:23.811613 epoll_pwait(5, <unfinished ...> > [pid 143818] 09:58:42.447774 <... restart_syscall resumed>) = -1 ETIMEDOUT > (Connection timed out) > [pid 143818] 09:58:42.447898 nanosleep({tv_sec=0, tv_nsec=20000}, NULL) = 0 > [pid 143818] 09:58:42.448141 futex(0x830ed8, FUTEX_WAIT_PRIVATE, 0, > {tv_sec=60, tv_nsec=0} <unfinished ...> > [pid 143817] 09:59:30.164453 <... epoll_pwait resumed>[{EPOLLIN, > {u32=1288671128, u64=140674352517016}}], 128, -1, NULL, 0) = 1 > [pid 143817] 09:59:30.164531 futex(0x830ed8, FUTEX_WAKE_PRIVATE, 1) = 1 > [pid 143818] 09:59:30.164725 <... futex resumed>) = 0 > [pid 143817] 09:59:30.164737 accept4(3, <unfinished ...> > [pid 143818] 09:59:30.164859 nanosleep({tv_sec=0, tv_nsec=20000}, > <unfinished ...> > [pid 143817] 09:59:30.164889 <... accept4 resumed>{sa_family=AF_INET6, > sin6_port=htons(40122), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, > "::ffff:127.0.0.1", &sin6_addr), sin6_scope_id=0}, [112->28], > SOCK_CLOEXEC|SOCK_NONBLOCK) = 4 > [pid 143817] 09:59:30.164962 epoll_ctl(5, EPOLL_CTL_ADD, 4, > {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=1288670888, > u64=140674352516776}} <unfinished ...> > [pid 143818] 09:59:30.164993 <... nanosleep resumed>NULL) = 0 > [pid 143817] 09:59:30.165040 <... epoll_ctl resumed>) = 0 > [pid 143818] 09:59:30.165072 nanosleep({tv_sec=0, tv_nsec=20000}, > <unfinished ...> > [pid 143817] 09:59:30.165097 getsockname(4, {sa_family=AF_INET6, > sin6_port=htons(8080), sin6_flowinfo=htonl(0), inet_pton(AF_INET6, > "::ffff:127.0.0.1", &sin6_addr), sin6_scope_id=0}, [112->28]) = 0 > [pid 143817] 09:59:30.165142 setsockopt(4, SOL_TCP, TCP_NODELAY, [1], 4) = > 0 > [pid 143817] 09:59:30.165162 setsockopt(4, SOL_SOCKET, SO_KEEPALIVE, [1], > 4) = 0 > [pid 143817] 09:59:30.165180 setsockopt(4, SOL_TCP, TCP_KEEPINTVL, [15], > 4) = 0 > [pid 143817] 09:59:30.165199 setsockopt(4, SOL_TCP, TCP_KEEPIDLE, [15], 4 > <unfinished ...> > [pid 143818] 09:59:30.165209 <... nanosleep resumed>NULL) = 0 > [pid 143817] 09:59:30.165215 <... setsockopt resumed>) = 0 > [pid 143818] 09:59:30.165222 nanosleep({tv_sec=0, tv_nsec=20000}, > <unfinished ...> > [pid 143817] 09:59:30.165271 futex(0xc000015148, FUTEX_WAKE_PRIVATE, 1) = 1 > [pid 143820] 09:59:30.165311 <... futex resumed>) = 0 > [pid 143817] 09:59:30.165317 accept4(3, 0xc00012db20, [112], > SOCK_CLOEXEC|SOCK_NONBLOCK) = -1 EAGAIN (Resource temporarily unavailable) > [pid 143818] 09:59:30.165373 <... nanosleep resumed>NULL) = 0 > [pid 143820] 09:59:30.165380 epoll_pwait(5, <unfinished ...> > [pid 143818] 09:59:30.165403 nanosleep({tv_sec=0, tv_nsec=20000}, > <unfinished ...> > [pid 143820] 09:59:30.165438 <... epoll_pwait resumed>[{EPOLLIN|EPOLLOUT, > {u32=1288670888, u64=140674352516776}}], 128, 0, NULL, 0) = 1 > [pid 143820] 09:59:30.165501 epoll_pwait(5, <unfinished ...> > [pid 143818] 09:59:30.165509 <... nanosleep resumed>NULL) = 0 > [pid 143817] 09:59:30.165515 read(4, <unfinished ...> > [pid 143818] 09:59:30.165536 nanosleep({tv_sec=0, tv_nsec=20000}, > <unfinished ...> > [pid 143817] 09:59:30.165564 <... read resumed>"GET / HTTP/1.1\r\nHost: > localhost:"..., 4096) = 78 > [pid 143817] 09:59:30.165595 futex(0xc000080148, FUTEX_WAKE_PRIVATE, 1) = 1 > [pid 143821] 09:59:30.165610 <... futex resumed>) = 0 > [pid 143821] 09:59:30.165624 nanosleep({tv_sec=0, tv_nsec=3000}, > <unfinished ...> > [pid 143817] 09:59:30.165632 write(4, "HTTP/1.1 200 OK\r\nDate: Mon, 11 > A"..., 120 <unfinished ...> > [pid 143818] 09:59:30.165642 <... nanosleep resumed>NULL) = 0 > [pid 143817] 09:59:30.165669 <... write resumed>) = 120 > [pid 143821] 09:59:30.165700 <... nanosleep resumed>NULL) = 0 > [pid 143818] 09:59:30.165706 nanosleep({tv_sec=0, tv_nsec=20000}, > <unfinished ...> > [pid 143821] 09:59:30.165716 futex(0xc000080148, FUTEX_WAIT_PRIVATE, 0, > NULL <unfinished ...> > [pid 143817] 09:59:30.165739 read(4, 0xc000176000, 4096) = -1 EAGAIN > (Resource temporarily unavailable) > [pid 143817] 09:59:30.165785 futex(0x830108, FUTEX_WAIT_PRIVATE, 0, NULL > <unfinished ...> > [pid 143820] 09:59:30.165794 <... epoll_pwait > resumed>[{EPOLLIN|EPOLLOUT|EPOLLRDHUP, {u32=1288670888, > u64=140674352516776}}], 128, 4999, NULL, 34914803367208) = 1 > [pid 143820] 09:59:30.165809 read(4, "", 4096) = 0 > [pid 143820] 09:59:30.165832 epoll_ctl(5, EPOLL_CTL_DEL, 4, 0xc000123974) > = 0 > [pid 143820] 09:59:30.165850 close(4 <unfinished ...> > [pid 143818] 09:59:30.165858 <... nanosleep resumed>NULL) = 0 > [pid 143818] 09:59:30.165870 nanosleep({tv_sec=0, tv_nsec=20000}, > <unfinished ...> > [pid 143820] 09:59:30.165879 <... close resumed>) = 0 > [pid 143820] 09:59:30.165892 epoll_pwait(5, [], 128, 0, NULL, 1) = 0 > [pid 143820] 09:59:30.165909 epoll_pwait(5, <unfinished ...> > [pid 143818] 09:59:30.165953 <... nanosleep resumed>NULL) = 0 > [pid 143818] 09:59:30.165963 futex(0x830ed8, FUTEX_WAIT_PRIVATE, 0, > {tv_sec=60, tv_nsec=0} > > 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 > > In htop, without strace attached, CPU is constant about 0.7% for the first > one or two cores. > > > > > El lunes, 11 de abril de 2022 a las 8:54:10 UTC+2, Brian Candler escribió: > >> Those nanosleep calls are at 10ms intervals - i.e. 100 calls per second. >> I think this is normal behaviour of the Go scheduler, which signals itself >> every 10ms to force a preemptive context switch. That feature was >> introduced in go 1.14, at which point you were able to disable it at >> runtime setting environment variable GODEBUG=asyncpreemptoff=1 (I haven't >> tested whether you can still do this). >> >> There were some problems when this feature was first introduced (see this >> <https://github.com/kubernetes/kubernetes/issues/92521> and this >> <https://github.com/cockroachdb/cockroach/pull/52348>) but improvements >> were made in 1.15 and 1.16. I don't see anything in the 1.17 release >> notes <https://go.dev/doc/go1.17> which would affect this. >> >> But in any case: >> 1. That won't cause CPU to go to 100% >> 2. I can't think why there should be any difference between "go run", >> versus "go build" and running the resulting executable. >> 3. I can't think why changing HTTP timeouts from 30 seconds to 1 second >> should make any difference. >> >> Point (2) is going to make the problem hard to reproduce for other people. >> >> To start with, I think you need to be more specific about: >> - exactly what versions of go you're comparing ("go version"), and where >> you got them from (e.g. directly from go downloads page or from OS vendor >> packages) >> - what exact Linux kernel you're running (uname -a) >> - what exact version and distro of Linux you're using >> - your CPU type (grep "model" /proc/cpuinfo | sort | uniq -c) >> - anything that's potentially different about your environment - e.g. are >> you running Linux under an emulation layer like WSL (Windows) >> >> On Sunday, 10 April 2022 at 23:02:40 UTC+1 scorr...@gmail.com wrote: >> >>> Hi, >>> >>> On Linux, if I compile and run this simple program: >>> >>> package main >>> >>> import ( >>> "fmt" >>> "net/http" >>> "time" >>> ) >>> >>> type x struct{} >>> >>> func (x) ServeHTTP(w http.ResponseWriter, r *http.Request) { >>> w.Write([]byte("aaaa")) >>> } >>> >>> func main() { >>> sp := &http.Server{ >>> ReadHeaderTimeout: 5 * time.Second, >>> ReadTimeout: 5 * time.Second, >>> WriteTimeout: 5 * time.Second, >>> IdleTimeout: 30 * time.Second, >>> Addr: ":8080", >>> Handler: x{}, >>> } >>> >>> fmt.Println(sp.ListenAndServe()) >>> } >>> >>> After a while I start to see constant CPU activity (1% to 7%) even when >>> the server is idle. >>> >>> If I run "sudo strace -f -c -p <pid>" I get constant very fast calls >>> like: >>> >>> [pid 131277] 23:42:16 nanosleep({tv_sec=0, tv_nsec=10000000}, NULL) = 0 >>> [pid 131277] 23:42:16 nanosleep({tv_sec=0, tv_nsec=10000000}, NULL) = 0 >>> [pid 131277] 23:42:16 nanosleep({tv_sec=0, tv_nsec=10000000}, NULL) = 0 >>> [pid 131277] 23:42:16 nanosleep({tv_sec=0, tv_nsec=10000000}, NULL) = 0 >>> [pid 131277] 23:42:16 nanosleep({tv_sec=0, tv_nsec=10000000}, NULL) = 0 >>> .... >>> >>> It never stops. Sometimes the CPU goes to 100% for a while and then go >>> back down to 1%.. This happens only in one or two cores. >>> >>> This doesn't happen with Go 1.16. I have been checking all versions and >>> it starts in Go 1.17 >>> >>> If I run the program with go run instead of compiling and running the >>> binary, I can't reproduce it. >>> >>> Sometimes it starts after a couple of http calls and sometimes I do a >>> few "wrk -d2 http://localhost:8080" calls to trigger it (wrk is a web >>> stress tool). But as soon as it starts making the nanosleep calls, it >>> doesn't stop, no matter how long the server is iddle. >>> >>> If I remove the timeout values or set them to a short period, like one >>> second for example, I am also not able to reproduce it. But with longer >>> values it happens very quickly. I am surprised of not seing it reported. >>> >>> Do you know what can be going on? >>> >>> Thank you! >>> >>> -- 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/b35c2508-092b-4aa0-aa95-5cbc3d0cddcfn%40googlegroups.com.