cubefs
210 строк · 7.7 Кб
1// Copyright 2019 The Prometheus Authors
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14//go:build !windows
15// +build !windows
16
17package procfs
18
19import (
20"fmt"
21"os"
22"path/filepath"
23"strings"
24
25"github.com/prometheus/procfs/internal/util"
26)
27
28// The VM interface is described at
29// https://www.kernel.org/doc/Documentation/sysctl/vm.txt
30// Each setting is exposed as a single file.
31// Each file contains one line with a single numerical value, except lowmem_reserve_ratio which holds an array
32// and numa_zonelist_order (deprecated) which is a string.
33type VM struct {
34AdminReserveKbytes *int64 // /proc/sys/vm/admin_reserve_kbytes
35BlockDump *int64 // /proc/sys/vm/block_dump
36CompactUnevictableAllowed *int64 // /proc/sys/vm/compact_unevictable_allowed
37DirtyBackgroundBytes *int64 // /proc/sys/vm/dirty_background_bytes
38DirtyBackgroundRatio *int64 // /proc/sys/vm/dirty_background_ratio
39DirtyBytes *int64 // /proc/sys/vm/dirty_bytes
40DirtyExpireCentisecs *int64 // /proc/sys/vm/dirty_expire_centisecs
41DirtyRatio *int64 // /proc/sys/vm/dirty_ratio
42DirtytimeExpireSeconds *int64 // /proc/sys/vm/dirtytime_expire_seconds
43DirtyWritebackCentisecs *int64 // /proc/sys/vm/dirty_writeback_centisecs
44DropCaches *int64 // /proc/sys/vm/drop_caches
45ExtfragThreshold *int64 // /proc/sys/vm/extfrag_threshold
46HugetlbShmGroup *int64 // /proc/sys/vm/hugetlb_shm_group
47LaptopMode *int64 // /proc/sys/vm/laptop_mode
48LegacyVaLayout *int64 // /proc/sys/vm/legacy_va_layout
49LowmemReserveRatio []*int64 // /proc/sys/vm/lowmem_reserve_ratio
50MaxMapCount *int64 // /proc/sys/vm/max_map_count
51MemoryFailureEarlyKill *int64 // /proc/sys/vm/memory_failure_early_kill
52MemoryFailureRecovery *int64 // /proc/sys/vm/memory_failure_recovery
53MinFreeKbytes *int64 // /proc/sys/vm/min_free_kbytes
54MinSlabRatio *int64 // /proc/sys/vm/min_slab_ratio
55MinUnmappedRatio *int64 // /proc/sys/vm/min_unmapped_ratio
56MmapMinAddr *int64 // /proc/sys/vm/mmap_min_addr
57NrHugepages *int64 // /proc/sys/vm/nr_hugepages
58NrHugepagesMempolicy *int64 // /proc/sys/vm/nr_hugepages_mempolicy
59NrOvercommitHugepages *int64 // /proc/sys/vm/nr_overcommit_hugepages
60NumaStat *int64 // /proc/sys/vm/numa_stat
61NumaZonelistOrder string // /proc/sys/vm/numa_zonelist_order
62OomDumpTasks *int64 // /proc/sys/vm/oom_dump_tasks
63OomKillAllocatingTask *int64 // /proc/sys/vm/oom_kill_allocating_task
64OvercommitKbytes *int64 // /proc/sys/vm/overcommit_kbytes
65OvercommitMemory *int64 // /proc/sys/vm/overcommit_memory
66OvercommitRatio *int64 // /proc/sys/vm/overcommit_ratio
67PageCluster *int64 // /proc/sys/vm/page-cluster
68PanicOnOom *int64 // /proc/sys/vm/panic_on_oom
69PercpuPagelistFraction *int64 // /proc/sys/vm/percpu_pagelist_fraction
70StatInterval *int64 // /proc/sys/vm/stat_interval
71Swappiness *int64 // /proc/sys/vm/swappiness
72UserReserveKbytes *int64 // /proc/sys/vm/user_reserve_kbytes
73VfsCachePressure *int64 // /proc/sys/vm/vfs_cache_pressure
74WatermarkBoostFactor *int64 // /proc/sys/vm/watermark_boost_factor
75WatermarkScaleFactor *int64 // /proc/sys/vm/watermark_scale_factor
76ZoneReclaimMode *int64 // /proc/sys/vm/zone_reclaim_mode
77}
78
79// VM reads the VM statistics from the specified `proc` filesystem.
80func (fs FS) VM() (*VM, error) {
81path := fs.proc.Path("sys/vm")
82file, err := os.Stat(path)
83if err != nil {
84return nil, err
85}
86if !file.Mode().IsDir() {
87return nil, fmt.Errorf("%s is not a directory", path)
88}
89
90files, err := os.ReadDir(path)
91if err != nil {
92return nil, err
93}
94
95var vm VM
96for _, f := range files {
97if f.IsDir() {
98continue
99}
100
101name := filepath.Join(path, f.Name())
102// ignore errors on read, as there are some write only
103// in /proc/sys/vm
104value, err := util.SysReadFile(name)
105if err != nil {
106continue
107}
108vp := util.NewValueParser(value)
109
110switch f.Name() {
111case "admin_reserve_kbytes":
112vm.AdminReserveKbytes = vp.PInt64()
113case "block_dump":
114vm.BlockDump = vp.PInt64()
115case "compact_unevictable_allowed":
116vm.CompactUnevictableAllowed = vp.PInt64()
117case "dirty_background_bytes":
118vm.DirtyBackgroundBytes = vp.PInt64()
119case "dirty_background_ratio":
120vm.DirtyBackgroundRatio = vp.PInt64()
121case "dirty_bytes":
122vm.DirtyBytes = vp.PInt64()
123case "dirty_expire_centisecs":
124vm.DirtyExpireCentisecs = vp.PInt64()
125case "dirty_ratio":
126vm.DirtyRatio = vp.PInt64()
127case "dirtytime_expire_seconds":
128vm.DirtytimeExpireSeconds = vp.PInt64()
129case "dirty_writeback_centisecs":
130vm.DirtyWritebackCentisecs = vp.PInt64()
131case "drop_caches":
132vm.DropCaches = vp.PInt64()
133case "extfrag_threshold":
134vm.ExtfragThreshold = vp.PInt64()
135case "hugetlb_shm_group":
136vm.HugetlbShmGroup = vp.PInt64()
137case "laptop_mode":
138vm.LaptopMode = vp.PInt64()
139case "legacy_va_layout":
140vm.LegacyVaLayout = vp.PInt64()
141case "lowmem_reserve_ratio":
142stringSlice := strings.Fields(value)
143pint64Slice := make([]*int64, 0, len(stringSlice))
144for _, value := range stringSlice {
145vp := util.NewValueParser(value)
146pint64Slice = append(pint64Slice, vp.PInt64())
147}
148vm.LowmemReserveRatio = pint64Slice
149case "max_map_count":
150vm.MaxMapCount = vp.PInt64()
151case "memory_failure_early_kill":
152vm.MemoryFailureEarlyKill = vp.PInt64()
153case "memory_failure_recovery":
154vm.MemoryFailureRecovery = vp.PInt64()
155case "min_free_kbytes":
156vm.MinFreeKbytes = vp.PInt64()
157case "min_slab_ratio":
158vm.MinSlabRatio = vp.PInt64()
159case "min_unmapped_ratio":
160vm.MinUnmappedRatio = vp.PInt64()
161case "mmap_min_addr":
162vm.MmapMinAddr = vp.PInt64()
163case "nr_hugepages":
164vm.NrHugepages = vp.PInt64()
165case "nr_hugepages_mempolicy":
166vm.NrHugepagesMempolicy = vp.PInt64()
167case "nr_overcommit_hugepages":
168vm.NrOvercommitHugepages = vp.PInt64()
169case "numa_stat":
170vm.NumaStat = vp.PInt64()
171case "numa_zonelist_order":
172vm.NumaZonelistOrder = value
173case "oom_dump_tasks":
174vm.OomDumpTasks = vp.PInt64()
175case "oom_kill_allocating_task":
176vm.OomKillAllocatingTask = vp.PInt64()
177case "overcommit_kbytes":
178vm.OvercommitKbytes = vp.PInt64()
179case "overcommit_memory":
180vm.OvercommitMemory = vp.PInt64()
181case "overcommit_ratio":
182vm.OvercommitRatio = vp.PInt64()
183case "page-cluster":
184vm.PageCluster = vp.PInt64()
185case "panic_on_oom":
186vm.PanicOnOom = vp.PInt64()
187case "percpu_pagelist_fraction":
188vm.PercpuPagelistFraction = vp.PInt64()
189case "stat_interval":
190vm.StatInterval = vp.PInt64()
191case "swappiness":
192vm.Swappiness = vp.PInt64()
193case "user_reserve_kbytes":
194vm.UserReserveKbytes = vp.PInt64()
195case "vfs_cache_pressure":
196vm.VfsCachePressure = vp.PInt64()
197case "watermark_boost_factor":
198vm.WatermarkBoostFactor = vp.PInt64()
199case "watermark_scale_factor":
200vm.WatermarkScaleFactor = vp.PInt64()
201case "zone_reclaim_mode":
202vm.ZoneReclaimMode = vp.PInt64()
203}
204if err := vp.Err(); err != nil {
205return nil, err
206}
207}
208
209return &vm, nil
210}
211