Skip to content

Commit be4bf64

Browse files
committed
cgroups v2: IO stats
1 parent f972982 commit be4bf64

File tree

4 files changed

+62
-7
lines changed
  • cgroup
    • fixtures/cgroup/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod8712f785_1a3e_41ec_a00b_e2dcc77431cb.slice/docker-73051af271105c07e1f493b34856a77e665e3b0b4fc72f76c807dfbffeb881bd.scope
  • containers

4 files changed

+62
-7
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
252:0 rbytes=11 wbytes=630538240 rios=22 wios=57111 dbytes=0 dios=0
2+
253:0 rbytes=33 wbytes=630538241 rios=44 wios=57056 dbytes=0 dios=0

cgroup/blkio.go cgroup/io.go

+45-3
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,21 @@ import (
88
"strings"
99
)
1010

11-
type BlkioStat struct {
11+
type IOStat struct {
1212
ReadOps uint64
1313
WriteOps uint64
1414
ReadBytes uint64
1515
WrittenBytes uint64
1616
}
1717

18-
func (cg *Cgroup) BlkioStat() (map[string]BlkioStat, error) {
18+
func (cg *Cgroup) IOStat() (map[string]IOStat, error) {
19+
if cg.Version == V1 {
20+
return cg.ioStatV1()
21+
}
22+
return cg.ioStatV2()
23+
}
24+
25+
func (cg *Cgroup) ioStatV1() (map[string]IOStat, error) {
1926
ops, err := readBlkioStatFile(path.Join(cgRoot, "blkio", cg.subsystems["blkio"], "blkio.throttle.io_serviced"))
2027
if err != nil {
2128
return nil, err
@@ -24,7 +31,7 @@ func (cg *Cgroup) BlkioStat() (map[string]BlkioStat, error) {
2431
if err != nil {
2532
return nil, err
2633
}
27-
res := map[string]BlkioStat{}
34+
res := map[string]IOStat{}
2835
for _, v := range ops {
2936
stat := res[v.majorMinor]
3037
switch v.name {
@@ -48,6 +55,41 @@ func (cg *Cgroup) BlkioStat() (map[string]BlkioStat, error) {
4855
return res, nil
4956
}
5057

58+
func (cg *Cgroup) ioStatV2() (map[string]IOStat, error) {
59+
payload, err := ioutil.ReadFile(path.Join(cgRoot, cg.subsystems[""], "io.stat"))
60+
if err != nil {
61+
return nil, err
62+
}
63+
res := map[string]IOStat{}
64+
for _, line := range strings.Split(string(payload), "\n") {
65+
parts := strings.Fields(line)
66+
if len(parts) < 5 {
67+
continue
68+
}
69+
s := IOStat{}
70+
for _, value := range parts[1:] {
71+
if kv := strings.SplitN(value, "=", 2); len(kv) == 2 {
72+
v, err := strconv.ParseUint(kv[1], 10, 64)
73+
if err != nil {
74+
continue
75+
}
76+
switch kv[0] {
77+
case "rbytes":
78+
s.ReadBytes = v
79+
case "wbytes":
80+
s.WrittenBytes = v
81+
case "rios":
82+
s.ReadOps = v
83+
case "wios":
84+
s.WriteOps = v
85+
}
86+
}
87+
}
88+
res[parts[0]] = s
89+
}
90+
return res, nil
91+
}
92+
5193
type blkioVariable struct {
5294
majorMinor string
5395
name string

cgroup/blkio_test.go cgroup/io_test.go

+14-3
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,30 @@ import (
66
"testing"
77
)
88

9-
func TestCgroup_BlkioStat(t *testing.T) {
9+
func TestCgroup_IOStat(t *testing.T) {
1010
cgRoot = "fixtures/cgroup"
1111

1212
cg, _ := NewFromProcessCgroupFile(path.Join("fixtures/proc/200/cgroup"))
13-
stat, err := cg.BlkioStat()
13+
stat, err := cg.IOStat()
1414
assert.Nil(t, err)
1515
assert.Equal(t,
16-
map[string]BlkioStat{
16+
map[string]IOStat{
1717
"8:0": {ReadOps: 0, WriteOps: 281, ReadBytes: 0, WrittenBytes: 4603904},
1818
"8:16": {ReadOps: 0, WriteOps: 39, ReadBytes: 0, WrittenBytes: 655360},
1919
"8:32": {ReadOps: 23043666, WriteOps: 28906992, ReadBytes: 998632854016, WrittenBytes: 884175858688},
2020
"8:48": {ReadOps: 20689345, WriteOps: 27906791, ReadBytes: 875529547776, WrittenBytes: 753046432768},
2121
"9:1": {ReadOps: 633949, WriteOps: 4, ReadBytes: 10238894080, WrittenBytes: 49152},
2222
},
2323
stat)
24+
25+
cg, _ = NewFromProcessCgroupFile(path.Join("fixtures/proc/400/cgroup"))
26+
stat, err = cg.IOStat()
27+
assert.Nil(t, err)
28+
assert.Equal(t,
29+
map[string]IOStat{
30+
"252:0": {ReadOps: 22, WriteOps: 57111, ReadBytes: 11, WrittenBytes: 630538240},
31+
"253:0": {ReadOps: 44, WriteOps: 57056, ReadBytes: 33, WrittenBytes: 630538241},
32+
},
33+
stat)
34+
2435
}

containers/container.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ func (c *Container) Collect(ch chan<- prometheus.Metric) {
187187
}
188188

189189
if disks, err := node.GetDisks(); err == nil {
190-
ioStat, _ := c.cgroup.BlkioStat()
190+
ioStat, _ := c.cgroup.IOStat()
191191
for majorMinor, mounts := range c.getMounts() {
192192
dev := disks.GetParentBlockDevice(majorMinor)
193193
if dev == nil {

0 commit comments

Comments
 (0)