From c7d6a6d78042876d9a27b13df2ae45783dca7c37 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 4 Mar 2020 20:27:48 +0100 Subject: [PATCH] gui, lib/api: Remove CPU & RAM measurements (fixes #6249) (#6393) --- gui/default/index.html | 8 ---- lib/api/api.go | 12 +---- lib/api/api_test.go | 7 ++- lib/api/mocked_cpuusage_test.go | 13 ------ lib/rc/rc.go | 1 - lib/syncthing/cpuusage.go | 59 ----------------------- lib/syncthing/cpuusage_solaris.go | 78 ------------------------------- lib/syncthing/cpuusage_unix.go | 18 ------- lib/syncthing/cpuusage_windows.go | 27 ----------- lib/syncthing/syncthing.go | 5 +- 10 files changed, 6 insertions(+), 222 deletions(-) delete mode 100644 lib/api/mocked_cpuusage_test.go delete mode 100644 lib/syncthing/cpuusage.go delete mode 100644 lib/syncthing/cpuusage_solaris.go delete mode 100644 lib/syncthing/cpuusage_unix.go delete mode 100644 lib/syncthing/cpuusage_windows.go diff --git a/gui/default/index.html b/gui/default/index.html index a8dfc83e5..05cc8f221 100644 --- a/gui/default/index.html +++ b/gui/default/index.html @@ -604,14 +604,6 @@ - -  RAM Utilization - {{system.sys | binary}}B - - -  CPU Utilization - {{system.cpuPercent | alwaysNumber | percent}} -  Listeners diff --git a/lib/api/api.go b/lib/api/api.go index 262883219..4f4e54bd2 100644 --- a/lib/api/api.go +++ b/lib/api/api.go @@ -81,7 +81,6 @@ type service struct { fss model.FolderSummaryService urService *ur.Service systemConfigMut sync.Mutex // serializes posts to /rest/system/config - cpu Rater contr Controller noUpgrade bool tlsDefaultCommonName string @@ -95,10 +94,6 @@ type service struct { systemLog logger.Recorder } -type Rater interface { - Rate() float64 -} - type Controller interface { ExitUpgrading() Restart() @@ -111,7 +106,7 @@ type Service interface { WaitForStart() error } -func New(id protocol.DeviceID, cfg config.Wrapper, assetDir, tlsDefaultCommonName string, m model.Model, defaultSub, diskSub events.BufferedSubscription, evLogger events.Logger, discoverer discover.CachingMux, connectionsService connections.Service, urService *ur.Service, fss model.FolderSummaryService, errors, systemLog logger.Recorder, cpu Rater, contr Controller, noUpgrade bool) Service { +func New(id protocol.DeviceID, cfg config.Wrapper, assetDir, tlsDefaultCommonName string, m model.Model, defaultSub, diskSub events.BufferedSubscription, evLogger events.Logger, discoverer discover.CachingMux, connectionsService connections.Service, urService *ur.Service, fss model.FolderSummaryService, errors, systemLog logger.Recorder, contr Controller, noUpgrade bool) Service { s := &service{ id: id, cfg: cfg, @@ -130,7 +125,6 @@ func New(id protocol.DeviceID, cfg config.Wrapper, assetDir, tlsDefaultCommonNam systemConfigMut: sync.NewMutex(), guiErrors: errors, systemLog: systemLog, - cpu: cpu, contr: contr, noUpgrade: noUpgrade, tlsDefaultCommonName: tlsDefaultCommonName, @@ -951,9 +945,7 @@ func (s *service) getSystemStatus(w http.ResponseWriter, r *http.Request) { res["connectionServiceStatus"] = s.connectionsService.ListenerStatus() res["lastDialStatus"] = s.connectionsService.ConnectionStatus() - // cpuUsage.Rate() is in milliseconds per second, so dividing by ten - // gives us percent - res["cpuPercent"] = s.cpu.Rate() / 10 / float64(runtime.NumCPU()) + res["cpuPercent"] = 0 // deprecated from API res["pathSeparator"] = string(filepath.Separator) res["urVersionMax"] = ur.Version res["uptime"] = s.urService.UptimeS() diff --git a/lib/api/api_test.go b/lib/api/api_test.go index 7357bf932..c315c28df 100644 --- a/lib/api/api_test.go +++ b/lib/api/api_test.go @@ -107,7 +107,7 @@ func TestStopAfterBrokenConfig(t *testing.T) { } w := config.Wrap("/dev/null", cfg, events.NoopLogger) - srv := New(protocol.LocalDeviceID, w, "", "syncthing", nil, nil, nil, events.NoopLogger, nil, nil, nil, nil, nil, nil, nil, nil, false).(*service) + srv := New(protocol.LocalDeviceID, w, "", "syncthing", nil, nil, nil, events.NoopLogger, nil, nil, nil, nil, nil, nil, nil, false).(*service) defer os.Remove(token) srv.started = make(chan string) @@ -522,12 +522,11 @@ func startHTTP(cfg *mockedConfig) (string, *suture.Supervisor, error) { connections := new(mockedConnections) errorLog := new(mockedLoggerRecorder) systemLog := new(mockedLoggerRecorder) - cpu := new(mockedCPUService) addrChan := make(chan string) // Instantiate the API service urService := ur.New(cfg, m, connections, false) - svc := New(protocol.LocalDeviceID, cfg, assetDir, "syncthing", m, eventSub, diskEventSub, events.NoopLogger, discoverer, connections, urService, &mockedFolderSummaryService{}, errorLog, systemLog, cpu, nil, false).(*service) + svc := New(protocol.LocalDeviceID, cfg, assetDir, "syncthing", m, eventSub, diskEventSub, events.NoopLogger, discoverer, connections, urService, &mockedFolderSummaryService{}, errorLog, systemLog, nil, false).(*service) defer os.Remove(token) svc.started = addrChan @@ -1026,7 +1025,7 @@ func TestEventMasks(t *testing.T) { cfg := new(mockedConfig) defSub := new(mockedEventSub) diskSub := new(mockedEventSub) - svc := New(protocol.LocalDeviceID, cfg, "", "syncthing", nil, defSub, diskSub, events.NoopLogger, nil, nil, nil, nil, nil, nil, nil, nil, false).(*service) + svc := New(protocol.LocalDeviceID, cfg, "", "syncthing", nil, defSub, diskSub, events.NoopLogger, nil, nil, nil, nil, nil, nil, nil, false).(*service) defer os.Remove(token) if mask := svc.getEventMask(""); mask != DefaultEventMask { diff --git a/lib/api/mocked_cpuusage_test.go b/lib/api/mocked_cpuusage_test.go deleted file mode 100644 index c89a1dbad..000000000 --- a/lib/api/mocked_cpuusage_test.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (C) 2017 The Syncthing Authors. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at https://mozilla.org/MPL/2.0/. - -package api - -type mockedCPUService struct{} - -func (*mockedCPUService) Rate() float64 { - return 42 -} diff --git a/lib/rc/rc.go b/lib/rc/rc.go index b677a1578..4ba43f52e 100644 --- a/lib/rc/rc.go +++ b/lib/rc/rc.go @@ -612,7 +612,6 @@ func (p *Process) Connections() (map[string]ConnectionStats, error) { type SystemStatus struct { Alloc int64 - CPUPercent float64 Goroutines int MyID protocol.DeviceID PathSeparator string diff --git a/lib/syncthing/cpuusage.go b/lib/syncthing/cpuusage.go deleted file mode 100644 index 695859c92..000000000 --- a/lib/syncthing/cpuusage.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2017 The Syncthing Authors. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at https://mozilla.org/MPL/2.0/. - -package syncthing - -import ( - "math" - "time" - - metrics "github.com/rcrowley/go-metrics" -) - -const cpuTickRate = 5 * time.Second - -type cpuService struct { - avg metrics.EWMA - stop chan struct{} -} - -func newCPUService() *cpuService { - return &cpuService{ - // 10 second average. Magic alpha value comes from looking at EWMA package - // definitions of EWMA1, EWMA5. The tick rate *must* be five seconds (hard - // coded in the EWMA package). - avg: metrics.NewEWMA(1 - math.Exp(-float64(cpuTickRate)/float64(time.Second)/10.0)), - stop: make(chan struct{}), - } -} - -func (s *cpuService) Serve() { - // Initialize prevUsage to an actual value returned by cpuUsage - // instead of zero, because at least Windows returns a huge negative - // number here that then slowly increments... - prevUsage := cpuUsage() - ticker := time.NewTicker(cpuTickRate) - defer ticker.Stop() - for { - select { - case <-ticker.C: - curUsage := cpuUsage() - s.avg.Update(int64((curUsage - prevUsage) / time.Millisecond)) - prevUsage = curUsage - s.avg.Tick() - case <-s.stop: - return - } - } -} - -func (s *cpuService) Stop() { - close(s.stop) -} - -func (s *cpuService) Rate() float64 { - return s.avg.Rate() -} diff --git a/lib/syncthing/cpuusage_solaris.go b/lib/syncthing/cpuusage_solaris.go deleted file mode 100644 index 74a4e2808..000000000 --- a/lib/syncthing/cpuusage_solaris.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (C) 2014 The Syncthing Authors. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at https://mozilla.org/MPL/2.0/. - -//+build solaris - -package syncthing - -import ( - "encoding/binary" - "fmt" - "os" - "time" -) - -type id_t int32 -type ulong_t uint32 - -type timestruc_t struct { - Tv_sec int64 - Tv_nsec int64 -} - -func (tv timestruc_t) Nano() int64 { - return tv.Tv_sec*1e9 + tv.Tv_nsec -} - -type prusage_t struct { - Pr_lwpid id_t /* lwp id. 0: process or defunct */ - Pr_count int32 /* number of contributing lwps */ - Pr_tstamp timestruc_t /* real time stamp, time of read() */ - Pr_create timestruc_t /* process/lwp creation time stamp */ - Pr_term timestruc_t /* process/lwp termination time stamp */ - Pr_rtime timestruc_t /* total lwp real (elapsed) time */ - Pr_utime timestruc_t /* user level CPU time */ - Pr_stime timestruc_t /* system call CPU time */ - Pr_ttime timestruc_t /* other system trap CPU time */ - Pr_tftime timestruc_t /* text page fault sleep time */ - Pr_dftime timestruc_t /* data page fault sleep time */ - Pr_kftime timestruc_t /* kernel page fault sleep time */ - Pr_ltime timestruc_t /* user lock wait sleep time */ - Pr_slptime timestruc_t /* all other sleep time */ - Pr_wtime timestruc_t /* wait-cpu (latency) time */ - Pr_stoptime timestruc_t /* stopped time */ - Pr_minf ulong_t /* minor page faults */ - Pr_majf ulong_t /* major page faults */ - Pr_nswap ulong_t /* swaps */ - Pr_inblk ulong_t /* input blocks */ - Pr_oublk ulong_t /* output blocks */ - Pr_msnd ulong_t /* messages sent */ - Pr_mrcv ulong_t /* messages received */ - Pr_sigs ulong_t /* signals received */ - Pr_vctx ulong_t /* voluntary context switches */ - Pr_ictx ulong_t /* involuntary context switches */ - Pr_sysc ulong_t /* system calls */ - Pr_ioch ulong_t /* chars read and written */ - -} - -var procFile = fmt.Sprintf("/proc/%d/usage", os.Getpid()) - -func cpuUsage() time.Duration { - fd, err := os.Open(procFile) - if err != nil { - return 0 - } - - var rusage prusage_t - err = binary.Read(fd, binary.LittleEndian, rusage) - fd.Close() - if err != nil { - return 0 - } - - return time.Duration(rusage.Pr_utime.Nano() + rusage.Pr_stime.Nano()) -} diff --git a/lib/syncthing/cpuusage_unix.go b/lib/syncthing/cpuusage_unix.go deleted file mode 100644 index 2b149abb2..000000000 --- a/lib/syncthing/cpuusage_unix.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2014 The Syncthing Authors. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at https://mozilla.org/MPL/2.0/. - -//+build !windows,!solaris - -package syncthing - -import "syscall" -import "time" - -func cpuUsage() time.Duration { - var rusage syscall.Rusage - syscall.Getrusage(syscall.RUSAGE_SELF, &rusage) - return time.Duration(rusage.Utime.Nano() + rusage.Stime.Nano()) -} diff --git a/lib/syncthing/cpuusage_windows.go b/lib/syncthing/cpuusage_windows.go deleted file mode 100644 index 6627b8af7..000000000 --- a/lib/syncthing/cpuusage_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (C) 2014 The Syncthing Authors. -// -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// You can obtain one at https://mozilla.org/MPL/2.0/. - -//+build windows - -package syncthing - -import "syscall" -import "time" - -func cpuUsage() time.Duration { - handle, err := syscall.GetCurrentProcess() - if err != nil { - return 0 - } - defer syscall.CloseHandle(handle) - - var ctime, etime, ktime, utime syscall.Filetime - if err := syscall.GetProcessTimes(handle, &ctime, &etime, &ktime, &utime); err != nil { - return 0 - } - - return time.Duration(ktime.Nanoseconds() + utime.Nanoseconds()) -} diff --git a/lib/syncthing/syncthing.go b/lib/syncthing/syncthing.go index da018e0c9..3bce1f962 100644 --- a/lib/syncthing/syncthing.go +++ b/lib/syncthing/syncthing.go @@ -420,13 +420,10 @@ func (a *App) setupGUI(m model.Model, defaultSub, diskSub events.BufferedSubscri l.Warnln("Insecure admin access is enabled.") } - cpu := newCPUService() - a.mainService.Add(cpu) - summaryService := model.NewFolderSummaryService(a.cfg, m, a.myID, a.evLogger) a.mainService.Add(summaryService) - apiSvc := api.New(a.myID, a.cfg, a.opts.AssetDir, tlsDefaultCommonName, m, defaultSub, diskSub, a.evLogger, discoverer, connectionsService, urService, summaryService, errors, systemLog, cpu, &controller{a}, a.opts.NoUpgrade) + apiSvc := api.New(a.myID, a.cfg, a.opts.AssetDir, tlsDefaultCommonName, m, defaultSub, diskSub, a.evLogger, discoverer, connectionsService, urService, summaryService, errors, systemLog, &controller{a}, a.opts.NoUpgrade) a.mainService.Add(apiSvc) if err := apiSvc.WaitForStart(); err != nil {