From dcaf22b32983387e14b931d9c9378a0dbd3a9eae Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Sat, 9 Jan 2021 12:18:59 +0100 Subject: [PATCH] Config: Detect physical CPU cores to limit number of workers --- go.mod | 1 + go.sum | 3 +++ internal/commands/config.go | 2 +- internal/config/config.go | 15 ++++++++++----- internal/config/flags.go | 4 +++- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index efbb89e55..226d94ff6 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,7 @@ require ( github.com/json-iterator/go v1.1.10 // indirect github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect github.com/karrick/godirwalk v1.16.1 + github.com/klauspost/cpuid/v2 v2.0.3 github.com/leandro-lugaresi/hub v1.1.1 github.com/leonelquinteros/gotext v1.4.0 github.com/lib/pq v1.3.0 // indirect diff --git a/go.sum b/go.sum index c77ff80cc..60a3bd84e 100644 --- a/go.sum +++ b/go.sum @@ -191,6 +191,9 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALr github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= +github.com/klauspost/cpuid/v2 v2.0.3 h1:DNljyrHyxlkk8139OXIAAauCwV8eQGDD6Z8YqnDXdZw= +github.com/klauspost/cpuid/v2 v2.0.3/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= diff --git a/internal/commands/config.go b/internal/commands/config.go index 23d20b8b4..9647a0fbe 100644 --- a/internal/commands/config.go +++ b/internal/commands/config.go @@ -55,7 +55,7 @@ func configAction(ctx *cli.Context) error { fmt.Printf("%-25s %s\n", "img-path", conf.ImgPath()) fmt.Printf("%-25s %s\n", "templates-path", conf.TemplatesPath()) - // Workers. + // Background workers. fmt.Printf("%-25s %d\n", "workers", conf.Workers()) fmt.Printf("%-25s %d\n", "wakeup-interval", conf.WakeupInterval()/time.Second) fmt.Printf("%-25s %d\n", "auto-index", conf.AutoIndex()/time.Second) diff --git a/internal/config/config.go b/internal/config/config.go index a797766fb..c45b1061d 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -20,6 +20,7 @@ import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" _ "github.com/jinzhu/gorm/dialects/sqlite" + "github.com/klauspost/cpuid/v2" "github.com/photoprism/photoprism/internal/event" "github.com/photoprism/photoprism/internal/hub" "github.com/photoprism/photoprism/internal/hub/places" @@ -133,6 +134,10 @@ func (c *Config) Init() error { fs.IgnoreCase() } + if cpuName := cpuid.CPU.BrandName; cpuName != "" { + log.Debugf("config: running on %s", txt.Quote(cpuid.CPU.BrandName)) + } + c.initSettings() c.initHub() @@ -328,19 +333,19 @@ func (c *Config) Shutdown() { // Workers returns the number of workers e.g. for indexing files. func (c *Config) Workers() int { - numCPU := runtime.NumCPU() + cores := cpuid.CPU.PhysicalCores // Limit number of workers when using SQLite to avoid database locking issues. - if c.DatabaseDriver() == SQLite && numCPU >= 8 && c.options.Workers <= 0 { + if c.DatabaseDriver() == SQLite && cores >= 8 && c.options.Workers <= 0 || c.options.Workers > 4 { return 4 } - if c.options.Workers > 0 && c.options.Workers <= numCPU { + if c.options.Workers > 0 && c.options.Workers <= runtime.NumCPU() { return c.options.Workers } - if numCPU > 1 { - return numCPU / 2 + if cores > 1 { + return cores / 2 } return 1 diff --git a/internal/config/flags.go b/internal/config/flags.go index 1f9044418..ae9a38d7c 100644 --- a/internal/config/flags.go +++ b/internal/config/flags.go @@ -1,6 +1,7 @@ package config import ( + "github.com/klauspost/cpuid/v2" "github.com/urfave/cli" ) @@ -95,8 +96,9 @@ var GlobalFlags = []cli.Flag{ }, cli.IntFlag{ Name: "workers, w", - Usage: "`LIMIT` the number of indexing workers to reduce system load", + Usage: "adjusts `MAX` number of indexing workers", EnvVar: "PHOTOPRISM_WORKERS", + Value: cpuid.CPU.PhysicalCores / 2, }, cli.IntFlag{ Name: "wakeup-interval",