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