Posted on 

blkio cgroup 异常

blkio cgroup 异常

线上集群 pod 的磁盘监控数据丢失,经过其他同学的诊断发现是 cgroup 异常

blkio 源码分析

k8s 对 cgroup 的支持

https://www.youtube.com/watch?v=u8h0e84HxcE

history

blk-group-support.png
blk-group-support.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@xxx:/home/xxxx# for i in $(ls -d /sys/fs/cgroup/blkio/kubepods/pod*/); do echo $i && cat $i/blkio.io_merged; done
/sys/fs/cgroup/blkio/kubepods/pod10543084-fcc4-11ea-8ffd-525400cdb22d/
Total 0
/sys/fs/cgroup/blkio/kubepods/pod24b4819f-dbb5-11ea-8ffd-525400cdb22d/
Total 0
/sys/fs/cgroup/blkio/kubepods/pod7376584e-e05f-11ea-8ffd-525400cdb22d/
Total 0
/sys/fs/cgroup/blkio/kubepods/pod73cb6fd7-fe57-11ea-8ffd-525400cdb22d/
8:0 Read 0
8:0 Write 0
8:0 Sync 0
8:0 Async 0
8:0 Total 0
Total 0
/sys/fs/cgroup/blkio/kubepods/poddd0ee417-e36e-11ea-8ffd-525400cdb22d/
8:0 Read 0
8:0 Write 0
8:0 Sync 0
8:0 Async 0
8:0 Total 0
Total 0

初步结论 没有按照我对 cgroup 层次概念进行继承,当然也有可能是我理解不对。

测试 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@xxxb:/sys/fs/cgroup/blkio/kubepods# mkdir test

root@xxxb:/sys/fs/cgroup/blkio/kubepods# cat test/blkio.io_merged
Total 0

root@xxxb:/sys/fs/cgroup/blkio/kubepods# cat /proc/23365/cmdline
top
root@xxxb:/sys/fs/cgroup/blkio/kubepods# echo "23365" > test/tasks

root@xxxb:/sys/fs/cgroup/blkio/kubepods# cat test/tasks
23365

root@xxxb:/sys/fs/cgroup/blkio/kubepods# cat test/blkio.io_merged # 不能有效记录 buffer io, 只能记录 direct io
Total 0

的确是没有,发现blkio.io_merged文件有内容。发现 dnode1-1091 发现全部都是 merged total 0

1
2
3
4
5
6
root@xxx:/sys/fs/cgroup/blkio/kubepods# cat /sys/fs/cgroup/blkio/kubepods/pod*/blkio.io_merged
Total 0
Total 0
Total 0
Total 0
Total 0

同一个 pod 的不同 container 也有差异

1
2
3
4
5
6
7
8
9
10
root@xxxa:/sys/fs/cgroup/blkio# cat /sys/fs/cgroup/blkio/kubepods/pod73cb6fd7-fe57-11ea-8ffd-525400cdb22d/e3ddfe3d43d4ad15c84a658b177f933db7a0f84286b27c65f39a7a23aadf193a/blkio.io_merged
Total 0

root@xxxa:/sys/fs/cgroup/blkio# cat /sys/fs/cgroup/blkio/kubepods/pod73cb6fd7-fe57-11ea-8ffd-525400cdb22d/b640917f50fd1235a43e49e5075ef20ca2b79f733e5cd36dd38ead228fb06e54/blkio.io_merged
8:0 Read 0
8:0 Write 0
8:0 Sync 0
8:0 Async 0
8:0 Total 0
Total 0

使用如下两个命令输出没有实质性差异

1
root@xxx:/sys/fs/cgroup/blkio# docker inspect b640917f50fd1235a43e49e5075ef20ca2b79f733e5cd36dd38ead228fb06e54
1
root@xxx:/sys/fs/cgroup/blkio# docker inspect e3ddfe3d43d4ad15c84a658b177f933db7a0f84286b27c65f39a7a23aadf193a

不同版本内核对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
root@xxx:/sys/fs/cgroup/blkio# mkdir test1

root@xxx:/sys/fs/cgroup/blkio# cat test1/blkio.io_merged_recursive
Total 0

root@xxx:/sys/fs/cgroup/blkio# cgexec -g blkio:test1 time dd if=/dev/zero of=/home/test1 bs=1k count=100 oflag=direct
100+0 records in
100+0 records out
102400 bytes (102 kB) copied, 0.00640967 s, 16.0 MB/s
0.00user 0.11system 0:00.11elapsed 95%CPU (0avgtext+0avgdata 2184maxresident)k
0inputs+350outputs (0major+89minor)pagefaults 0swaps

root@xxx:/sys/fs/cgroup/blkio# cat test1/blkio.io_merged_recursive
8:0 Read 0
8:0 Write 0
8:0 Sync 0
8:0 Async 0
8:0 Total 0
Total 0

root@xxx:/sys/fs/cgroup/blkio# cat test1/blkio.io_merged
8:0 Read 0
8:0 Write 0
8:0 Sync 0
8:0 Async 0
8:0 Total 0
Total 0

root@xxx:/sys/fs/cgroup/blkio# uname -sir
Linux 4.9.0-0.bpo.6-amd64 unknown

使用已经存在的 cgroup 去限制 io ,发现 cgroup 里面的数据已经被初始化了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# cgexec -g blkio:kubepods/pod73cb6fd7-fe57-11ea-8ffd-525400cdb22d/e3ddfe3d43d4ad15c84a658b177f933db7a0f84286b27c65f39a7a23aadf193a time dd if=/dev/zero of=/home/test1 bs=1k count=100 oflag=direct
100+0 records in
100+0 records out
102400 bytes (102 kB) copied, 0.119833 s, 855 kB/s
0.00user 0.00system 0:00.12elapsed 3%CPU (0avgtext+0avgdata 2324maxresident)k
0inputs+350outputs (0major+90minor)pagefaults 0swaps

# cat /sys/fs/cgroup/blkio/kubepods/pod73cb6fd7-fe57-11ea-8ffd-525400cdb22d/e3ddfe3d43d4ad15c84a658b177f933db7a0f84286b27c65f39a7a23aadf193a/blkio.io_merged
8:0 Read 0
8:0 Write 0
8:0 Sync 0
8:0 Async 0
8:0 Total 0
Total 0

# docker exec -it 39d9ab5e31a2 dd if=/dev/zero of=/home/test1 bs=1k count=100 oflag=direct
100+0 records in
100+0 records out
102400 bytes (102 kB, 100 KiB) copied, 0.076378 s, 1.3 MB/s

结论

在 4.9.0 版本上 blkio.io_merged 是懒惰初始化,在没有发生 direct io 的之前不会有初始化出这个文件。