Reading and writing to a channel has locks behind the scenes. Locks are implemented with futexes.
If your program is IO bound the simplest solution is often to use buffering in the IO to perform more work per IO operation. > On Feb 3, 2019, at 5:00 PM, Andrew Medvedev <andrew.y.medve...@gmail.com> > wrote: > > Hi everybody > > > > I have a simple program which parses IP addresses and adds them to the system > routing table using the netlink library. The number is routes is huge > (400_000). My parsing part is very simple and fast, and most of the time is > spent in system calls: > > > > File: loadroutes > > Type: cpu > > Time: Feb 4, 2019 at 12:38am (MSK) > > Duration: 4.64s, Total samples = 4.44s (95.74%) > > Entering interactive mode (type "help" for commands, "o" for options) > > (pprof) top > > Showing nodes accounting for 3790ms, 85.36% of 4440ms total > > Dropped 54 nodes (cum <= 22.20ms) > > Showing top 10 nodes out of 80 > > flat flat% sum% cum cum% > > 1660ms 37.39% 37.39% 1700ms 38.29% syscall.Syscall6 > > 600ms 13.51% 50.90% 660ms 14.86% syscall.Syscall > > 590ms 13.29% 64.19% 950ms 21.40% > github.com/vishvananda/netlink/nl.(*NetlinkSocket).Receive > > 500ms 11.26% 75.45% 500ms 11.26% syscall.RawSyscall > > 120ms 2.70% 78.15% 120ms 2.70% runtime.futex > > 100ms 2.25% 80.41% 400ms 9.01% runtime.mallocgc > > 70ms 1.58% 81.98% 70ms 1.58% runtime.nextFreeFast (inline) > > 50ms 1.13% 83.11% 3930ms 88.51% > github.com/vishvananda/netlink.(*Handle).routeHandle > > 50ms 1.13% 84.23% 50ms 1.13% > golang.org/x/text/encoding/charmap.charmapDecoder.Transform > > 50ms 1.13% 85.36% 60ms 1.35% runtime.heapBitsSetType > > graph > https://drive.google.com/file/d/1yENJMWgOH2dmm8XBAq2zDoAah82slzl6/view?usp=sharing > > > > > > Even though most time is spent in system calls (which seem to be blocking and > can not be speed up at all, but I am not an expert on this), I tried to add a > channel factoring out all the parsing work (a producer channel), profiling > with this channel gives me slightly better times with system calls, but adds > new runtime.futex of roughly 2 seconds: > > > > File: loadroutes > > Type: cpu > > Time: Feb 4, 2019 at 12:59am (MSK) > > Duration: 6.02s, Total samples = 5.34s (88.77%) > > Entering interactive mode (type "help" for commands, "o" for options) > > (pprof) top > > Showing nodes accounting for 4.75s, 88.95% of 5.34s total > > Dropped 49 nodes (cum <= 0.03s) > > Showing top 10 nodes out of 82 > > flat flat% sum% cum cum% > > 2.20s 41.20% 41.20% 2.20s 41.20% runtime.futex > > 1.11s 20.79% 61.99% 1.18s 22.10% syscall.Syscall6 > > 0.45s 8.43% 70.41% 0.67s 12.55% > github.com/vishvananda/netlink/nl.(*NetlinkSocket).Receive > > 0.39s 7.30% 77.72% 0.39s 7.30% syscall.RawSyscall > > 0.35s 6.55% 84.27% 0.38s 7.12% syscall.Syscall > > 0.06s 1.12% 85.39% 0.11s 2.06% runtime.scang > > 0.05s 0.94% 86.33% 0.09s 1.69% runtime.exitsyscall > > 0.05s 0.94% 87.27% 0.05s 0.94% runtime.nextFreeFast (inline) > > 0.05s 0.94% 88.20% 0.05s 0.94% runtime.procyield > > 0.04s 0.75% 88.95% 0.04s 0.75% runtime.exitsyscallfast > > graph: > https://drive.google.com/file/d/19sHVHKG8a8gwCrYlsTFYh6aOW-kW17gr/view?usp=sharing > > > > I wonder what this new runtime.futex cost (2.20s) is? Is this a constant cost > of sending 400_000 values over a channel? If channel is blocked waiting (in > my case, on a customer) I would expect that this time would not add to total > runtime, but these 2 seconds are seemed to be added to total runtime (4.64s > -> 6.02s), I am not sure, why... > > > > > > > > > > -- > 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. > For more options, visit https://groups.google.com/d/optout. -- 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. For more options, visit https://groups.google.com/d/optout.