// Copyright 2019 The Prometheus Authors// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at//// http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.package procfsimport ()var ( cpuLineRE = regexp.MustCompile(`cpu(\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+) (\d+)`) procLineRE = regexp.MustCompile(`(\d+) (\d+) (\d+)`))// Schedstat contains scheduler statistics from /proc/schedstat//// See// https://www.kernel.org/doc/Documentation/scheduler/sched-stats.txt// for a detailed description of what these numbers mean.//// Note the current kernel documentation claims some of the time units are in// jiffies when they are actually in nanoseconds since 2.6.23 with the// introduction of CFS. A fix to the documentation is pending. See// https://lore.kernel.org/patchwork/project/lkml/list/?series=403473typeSchedstatstruct { CPUs []*SchedstatCPU}// SchedstatCPU contains the values from one "cpu<N>" line.typeSchedstatCPUstruct { CPUNum string RunningNanoseconds uint64 WaitingNanoseconds uint64 RunTimeslices uint64}// ProcSchedstat contains the values from `/proc/<pid>/schedstat`.typeProcSchedstatstruct { RunningNanoseconds uint64 WaitingNanoseconds uint64 RunTimeslices uint64}// Schedstat reads data from `/proc/schedstat`.func ( FS) () (*Schedstat, error) { , := os.Open(.proc.Path("schedstat"))if != nil {returnnil, }defer .Close() := &Schedstat{} := bufio.NewScanner()for .Scan() { := cpuLineRE.FindStringSubmatch(.Text())if != nil { := &SchedstatCPU{} .CPUNum = [1] .RunningNanoseconds, = strconv.ParseUint([8], 10, 64)if != nil {continue } .WaitingNanoseconds, = strconv.ParseUint([9], 10, 64)if != nil {continue } .RunTimeslices, = strconv.ParseUint([10], 10, 64)if != nil {continue } .CPUs = append(.CPUs, ) } }return , nil}func parseProcSchedstat( string) (ProcSchedstat, error) {var (ProcSchedstaterror ) := procLineRE.FindStringSubmatch()if != nil { .RunningNanoseconds, = strconv.ParseUint([1], 10, 64)if != nil {return , } .WaitingNanoseconds, = strconv.ParseUint([2], 10, 64)if != nil {return , } .RunTimeslices, = strconv.ParseUint([3], 10, 64)return , }return , errors.New("could not parse schedstat")}
The pages are generated with Goldsv0.8.2. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.