On 19-02-08 21:16:02, Stuart Henderson wrote:
> On 2019/02/08 19:12, Marc Espie wrote:
> > On Fri, Feb 08, 2019 at 12:10:02AM -0500, Ted Unangst wrote:
> > > Go tries to use NCPU cpus. Unfortunately, half of them are turned off 
> > > because
> > > hw.smt=0 by default, and then go spends a lot of time fighting against 
> > > itself.
> > > 
> > > The diff below, against go/src/runtime, changes to use the number of CPUs
> > > online. It's possible for this number to change, and thus become stale, 
> > > but
> > > that's unlikely, and not the default.
> > > 
> > > (This sysctl was added in 6.4.)
> > > 
> > > --- os_openbsd.go.orig    Fri Feb  8 00:02:27 2019
> > > +++ os_openbsd.go Fri Feb  8 00:06:21 2019
> > > @@ -85,8 +85,8 @@
> > >   _KERN_OSREV = 3
> > >  
> > >   _CTL_HW      = 6
> > > - _HW_NCPU     = 3
> > >   _HW_PAGESIZE = 7
> > > + _HW_NCPUONLINE = 25
> > >  )
> > >  
> > >  func sysctlInt(mib []uint32) (int32, bool) {
> > > @@ -101,7 +101,7 @@
> > >  
> > >  func getncpu() int32 {
> > >   // Fetch hw.ncpu via sysctl.
> > > - if ncpu, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPU}); ok {
> > > + if ncpu, ok := sysctlInt([]uint32{_CTL_HW, _HW_NCPUONLINE}); ok {
> > >           return int32(ncpu)
> > >   }
> > >   return 1
> 
> IIRC upstream had some requirement for supporting the previous OS version
> for their builders, so might be better to have fallback code in case
> _HW_NCPUONLINE isn't available.

This is correct - I've landed a diff that just switches to hw.ncpuonline, 
however
a different version will go upstream.

> > Is there at least a knob to turn that off entirely ?
> > 
> > Like, specifically, when you are bulk-building ports, you do not want go
> > to hog on every cpu while it's not alone.
> > 
> > Parallelizing everything is not always (very often not actually) a win.
> 
> On 2019/02/08 19:55, Otto Moerbeek wrote:
> > The GOMACPROCS env var is what you're looking for. If you set it to 1
> > go will use 1 core at max.
> 
> There are two different things.
> 
> go.port.mk's build command line (used for some but not all ports) calls
> "go install -p ${MAKE_JOBS}", that controls how many parallel processes
> are used. (some like sysutils/prometheus use a different build system).
> 
> GOMAXPROCS (X not C) is different - number of threads within one process.

It is the number of threads that can simultaneously execute user-level Go code.
There may be more or less threads than this in a Go process, depending on 
whether there is a need for concurrency and/or if threads are blocked in
system calls.

> So if both are in play maybe you get N(smp_cores) processes * N(smp_cores)
> threads ...

Reply via email to