Source File
proc_psi.go
Belonging Package
github.com/prometheus/procfs
// 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 procfs// The PSI / pressure interface is described at// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/accounting/psi.txt// Each resource (cpu, io, memory, ...) is exposed as a single file.// Each file may contain up to two lines, one for "some" pressure and one for "full" pressure.// Each line contains several averages (over n seconds) and a total in µs.//// Example io pressure file:// > some avg10=0.06 avg60=0.21 avg300=0.99 total=8537362// > full avg10=0.00 avg60=0.13 avg300=0.96 total=8183134import ()const lineFormat = "avg10=%f avg60=%f avg300=%f total=%d"// PSILine is a single line of values as returned by `/proc/pressure/*`.//// The Avg entries are averages over n seconds, as a percentage.// The Total line is in microseconds.type PSILine struct {Avg10 float64Avg60 float64Avg300 float64Total uint64}// PSIStats represent pressure stall information from /proc/pressure/*//// "Some" indicates the share of time in which at least some tasks are stalled.// "Full" indicates the share of time in which all non-idle tasks are stalled simultaneously.type PSIStats struct {Some *PSILineFull *PSILine}// PSIStatsForResource reads pressure stall information for the specified// resource from /proc/pressure/<resource>. At time of writing this can be// either "cpu", "memory" or "io".func ( FS) ( string) (PSIStats, error) {, := util.ReadFileNoStat(.proc.Path(fmt.Sprintf("%s/%s", "pressure", )))if != nil {return PSIStats{}, fmt.Errorf("%w: psi_stats: unavailable for %q: %w", ErrFileRead, , )}return parsePSIStats(bytes.NewReader())}// parsePSIStats parses the specified file for pressure stall information.func parsePSIStats( io.Reader) (PSIStats, error) {:= PSIStats{}:= bufio.NewScanner()for .Scan() {:= .Text():= strings.Split(, " ")[0]switch {case "some"::= PSILine{}, := fmt.Sscanf(, fmt.Sprintf("some %s", lineFormat), &.Avg10, &.Avg60, &.Avg300, &.Total)if != nil {return PSIStats{},}.Some = &case "full"::= PSILine{}, := fmt.Sscanf(, fmt.Sprintf("full %s", lineFormat), &.Avg10, &.Avg60, &.Avg300, &.Total)if != nil {return PSIStats{},}.Full = &default:// If we encounter a line with an unknown prefix, ignore it and move on// Should new measurement types be added in the future we'll simply ignore them instead// of erroring on retrievalcontinue}}return , nil}
![]() |
The pages are generated with Golds v0.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. |