Ori.livneh has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/98602


Change subject: (WIP) rewrite mwprof in Go
......................................................................

(WIP) rewrite mwprof in Go

Change-Id: I170437fccf44b9b36b4e1508defe6ea19c0ab2e8
---
A src/wikimedia/mwprof/broadcast.py
A src/wikimedia/mwprof/mwprof.go
A src/wikimedia/mwprof/runningstat/runningstat.go
3 files changed, 164 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/software/mwprof 
refs/changes/02/98602/1

diff --git a/src/wikimedia/mwprof/broadcast.py 
b/src/wikimedia/mwprof/broadcast.py
new file mode 100644
index 0000000..95af0e6
--- /dev/null
+++ b/src/wikimedia/mwprof/broadcast.py
@@ -0,0 +1,28 @@
+# stupid script for testing mwprof
+from random import random, choice
+import socket
+import time
+import itertools
+
+sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+addr = ('127.0.0.1', 3812)
+
+
+def func():
+    return choice(('ScribuntoHooks::addCanonicalNamespaces', 
'ScribuntoHooks::contentHandlerDefaultModelFor', '-setup', 'Setup.php', 
'StubObject::_unstub-wgLang', '-total', 'TranslateHooks::setupNamespaces', 
'TranslateSandbox::enforcePermissions', 'TrustedXFF::onIsTrustedProxy', 
'UniversalLanguageSelectorHooks::getLanguage', 'User::getAutomaticGroups', 
'User::getEffectiveGroups', 'User::load', 'User::loadDefaults', 
'VisualEditorHooks::onDoEditSectionLink', 
'VisualEditorHooks::onDoEditSectionLink', 'WebStart.php-conf', 
'WebStart.php-ob_start', 'wfStreamThumb', 'WikiPage::getParserOutput', 
'wmfWBClientExcludeNS'))
+
+def stat():
+    return random() * random() * random()
+
+def iter_stats():
+    while 1:
+        yield '1.23wmf4 - 1 %.6f %.6f %.6f %.6f %s\n' % (stat(), stat(), 
stat(), stat(), func())
+
+
+
+stats = iter_stats()
+
+while 1:
+    s = ''.join(itertools.islice(stats, 4))
+    sock.sendto(s,addr)
+    time.sleep(1)
diff --git a/src/wikimedia/mwprof/mwprof.go b/src/wikimedia/mwprof/mwprof.go
new file mode 100644
index 0000000..5f7e13f
--- /dev/null
+++ b/src/wikimedia/mwprof/mwprof.go
@@ -0,0 +1,77 @@
+package main
+
+import (
+       "bufio"
+       "fmt"
+       "log"
+       "net"
+       "strconv"
+       "strings"
+       "wikimedia/mwprof/runningstat"
+)
+
+type CallStats struct {
+       s_cpu  *runningstat.RunningStat
+       s_real *runningstat.RunningStat
+}
+
+func main() {
+       stats := make(map[string]map[string]*CallStats)
+
+       addr, err := net.ResolveUDPAddr("udp", ":3812")
+       server, err := net.ListenUDP("udp", addr)
+       if err != nil {
+               log.Fatal(err)
+       }
+
+       scanner := bufio.NewScanner(server)
+
+       for scanner.Scan() {
+               sample := scanner.Text()
+               fields := strings.SplitN(sample, " ", 8)
+               if len(fields) < 8 {
+                       log.Println("Invalid input: \"%s\"", sample)
+               }
+               // version
+               // -
+               // count
+               // cpu
+               // cpusq
+               // real
+               // realsq
+               // task
+               // func ParseFloat
+
+               version := fields[0]
+
+               cpu, err := strconv.ParseFloat(fields[3], 64)
+               if err != nil {
+                       log.Println(`Invalid input: "%s"`, sample)
+               }
+               real, err := strconv.ParseFloat(fields[5], 64)
+               if err != nil {
+                       log.Println(`Invalid input: "%s"`, sample)
+               }
+
+               task := fields[7]
+
+               vstats, ok := stats[version]
+               if !ok {
+                       vstats = make(map[string]*CallStats)
+                       stats[version] = vstats
+               }
+
+               callstats, ok := vstats[task]
+               if !ok {
+                       callstats = &CallStats{runningstat.New(), 
runningstat.New()}
+                       vstats[task] = callstats
+               }
+
+               callstats.s_cpu.Push(cpu)
+               callstats.s_real.Push(real)
+       }
+
+       if err := scanner.Err(); err != nil {
+               log.Fatal(err)
+       }
+}
diff --git a/src/wikimedia/mwprof/runningstat/runningstat.go 
b/src/wikimedia/mwprof/runningstat/runningstat.go
new file mode 100644
index 0000000..50deac0
--- /dev/null
+++ b/src/wikimedia/mwprof/runningstat/runningstat.go
@@ -0,0 +1,59 @@
+package runningstat
+
+import "math"
+
+type RunningStat struct {
+       n        uint64  // Number of samples
+       m1, m2   float64 // Statistical moments
+       min, max float64
+}
+
+func (s *RunningStat) Init() *RunningStat {
+       s.n = 0
+       s.m1 = 0.0
+       s.m2 = 0.0
+       s.min = math.NaN()
+       s.max = math.NaN()
+       return s
+}
+
+func New() *RunningStat {
+       return &RunningStat{n: 0, m1: 0, m2: 0, min: math.NaN(), max: 
math.NaN()}
+}
+
+func (s *RunningStat) Push(x float64) {
+       n1 := float64(s.n)
+       s.n++
+
+       delta := x - s.m1
+       delta_n := delta / float64(s.n)
+
+       s.m1 += delta_n
+       s.m2 += delta * delta_n * n1
+}
+
+func (s *RunningStat) Len() uint64 {
+       return s.n
+}
+
+func (s *RunningStat) Mean() float64 {
+       return s.m1
+}
+
+func (s *RunningStat) Variance() float64 {
+       return s.m2 / float64(s.n-1)
+}
+
+func (s *RunningStat) StdDev() float64 {
+       return math.Sqrt(s.Variance())
+}
+
+func (a *RunningStat) Merge(b *RunningStat) {
+       n := a.n + b.n
+       delta := b.m1 - a.m1
+       delta2 := delta * delta
+
+       a.m1 = (float64(a.n)*a.m1 + float64(b.n)*b.m1) / float64(n)
+       a.m2 = a.m2 + b.m2 + delta2*float64(a.n*b.n/n)
+       a.n = n
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/98602
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I170437fccf44b9b36b4e1508defe6ea19c0ab2e8
Gerrit-PatchSet: 1
Gerrit-Project: operations/software/mwprof
Gerrit-Branch: master
Gerrit-Owner: Ori.livneh <o...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to