Pao's town

像石头一样翻滚吧


  • Home

  • Archives

while...sleep vs tail -f /dev/null

Posted on 2018-09-28

问题

发现用户喜欢用while … sleep…来写Dockerfile的 ENTRYPOINT, 忍不住思考,是tail -f /dev/null的开销小,还是while true do sleep 3 done 更小?

答案

tail -f /dev/null is better,因为tail -f 会一直等待 I/O 完成,进程一直处于Waiting状态。
而 while 每隔3秒会重新进行一次进程上下文切换,sleep 是单独起1个进程,而sleep结束后,会通过中断通知cpu,通过strace可以跟踪两者的系统调用

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#strace tail -f /dev/null
execve("/usr/bin/tail", ["tail", "-f", "/dev/null"], [/* 83 vars */]) = 0
brk(NULL) = 0xa80000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=125541, ...}) = 0
mmap(NULL, 125541, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6f19756000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6f19755000
mmap(NULL, 3971488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f6f19186000
mprotect(0x7f6f19346000, 2097152, PROT_NONE) = 0
mmap(0x7f6f19546000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7f6f19546000
mmap(0x7f6f1954c000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f6f1954c000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6f19754000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6f19753000
arch_prctl(ARCH_SET_FS, 0x7f6f19754700) = 0
mprotect(0x7f6f19546000, 16384, PROT_READ) = 0
mprotect(0x60e000, 4096, PROT_READ) = 0
mprotect(0x7f6f19775000, 4096, PROT_READ) = 0
munmap(0x7f6f19756000, 125541) = 0
brk(NULL) = 0xa80000
brk(0xaa1000) = 0xaa1000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4763056, ...}) = 0
mmap(NULL, 4763056, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6f18cfb000
close(3) = 0
open("/dev/null", O_RDONLY) = 3
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 8192) = 0
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
fstatfs(3, {f_type="TMPFS_MAGIC", f_bsize=4096, f_blocks=999603, f_bfree=999603, f_bavail=999603, f_files=999603, f_ffree=999080, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=4130}) = 0
lstat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
inotify_init() = 4
inotify_add_watch(4, "/dev/null", IN_MODIFY) = 1
stat("/dev/null", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 8192) = 0
read(4, "\1\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0", 26) = 16
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 8192) = 0
read(4, "\1\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0", 26) = 16
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 8192) = 0
read(4, "\1\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0", 26) = 16
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 8192) = 0
read(4, "\1\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0", 26) = 16
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 8192) = 0
read(4, "\1\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0", 26) = 16
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 8192) = 0
read(4, "\1\0\0\0\2\0\0\0\0\0\0\0\0\0\0\0", 26) = 16
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 8192) = 0
read(4

在 read(4 卡住。。。 因为I/O 无法完成读取/dev/null

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# strace -p PID_OF_WHILE_SLEEP_SHELL
execve("./sleep.sh", ["./sleep.sh"], [/* 83 vars */]) = 0
brk(NULL) = 0x26ad000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=125541, ...}) = 0
mmap(NULL, 125541, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f4f4b4a1000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\310\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=167240, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4f4b4a0000
mmap(NULL, 2264256, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f4f4b072000
mprotect(0x7f4f4b097000, 2093056, PROT_NONE) = 0
mmap(0x7f4f4b296000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x7f4f4b296000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\r\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14608, ...}) = 0
mmap(NULL, 2109680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f4f4ae6e000
mprotect(0x7f4f4ae71000, 2093056, PROT_NONE) = 0
mmap(0x7f4f4b070000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f4f4b070000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0
mmap(NULL, 3971488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f4f4aaa4000
mprotect(0x7f4f4ac64000, 2097152, PROT_NONE) = 0
mmap(0x7f4f4ae64000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7f4f4ae64000
mmap(0x7f4f4ae6a000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f4f4ae6a000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4f4b49f000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4f4b49e000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4f4b49d000
arch_prctl(ARCH_SET_FS, 0x7f4f4b49e700) = 0
mprotect(0x7f4f4ae64000, 16384, PROT_READ) = 0
mprotect(0x7f4f4b070000, 4096, PROT_READ) = 0
mprotect(0x7f4f4b296000, 16384, PROT_READ) = 0
mprotect(0x6f3000, 4096, PROT_READ) = 0
mprotect(0x7f4f4b4c0000, 4096, PROT_READ) = 0
munmap(0x7f4f4b4a1000, 125541) = 0
open("/dev/tty", O_RDWR|O_NONBLOCK) = 3
close(3) = 0
brk(NULL) = 0x26ad000
brk(0x26ae000) = 0x26ae000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4763056, ...}) = 0
mmap(NULL, 4763056, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f4f4a619000
close(3) = 0
brk(0x26af000) = 0x26af000
brk(0x26b0000) = 0x26b0000
brk(0x26b1000) = 0x26b1000
getuid() = 1000
getgid() = 1000
geteuid() = 1000
getegid() = 1000
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
brk(0x26b2000) = 0x26b2000
sysinfo({uptime=208297, loads=[19616, 40992, 43488], totalram=8243048448, freeram=258646016, sharedram=885608448, bufferram=544690176, totalswap=8467247104, freeswap=7762948096, procs=1236, totalhigh=0, freehigh=0, mem_unit=1}) = 0
brk(0x26b3000) = 0x26b3000
rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x7f4f4aad94b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x7f4f4aad94b0}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
rt_sigaction(SIGQUIT, {SIG_IGN, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
uname({sysname="Linux", nodename="haoyuan-OptiPlex-7050", ...}) = 0
brk(0x26b4000) = 0x26b4000
brk(0x26b5000) = 0x26b5000
brk(0x26b6000) = 0x26b6000
brk(0x26b7000) = 0x26b7000
brk(0x26b8000) = 0x26b8000
brk(0x26b9000) = 0x26b9000
brk(0x26ba000) = 0x26ba000
stat("/home/haoyuan/tmp", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
getpid() = 14702
open("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26258, ...}) = 0
mmap(NULL, 26258, PROT_READ, MAP_SHARED, 3, 0) = 0x7f4f4b4b9000
close(3) = 0
brk(0x26bb000) = 0x26bb000
getppid() = 14700
brk(0x26bc000) = 0x26bc000
brk(0x26bd000) = 0x26bd000
getpgrp() = 14700
rt_sigaction(SIGCHLD, {0x447ad0, [], SA_RESTORER|SA_RESTART, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER|SA_RESTART, 0x7f4f4aad94b0}, 8) = 0
getrlimit(RLIMIT_NPROC, {rlim_cur=31086, rlim_max=31086}) = 0
brk(0x26be000) = 0x26be000
brk(0x26bf000) = 0x26bf000
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("./sleep.sh", O_RDONLY) = 3
ioctl(3, TCGETS, 0x7fff135858d0) = -1 ENOTTY (Inappropriate ioctl for device)
lseek(3, 0, SEEK_CUR) = 0
read(3, "#!/bin/bash\nwhile true\ndo\n\tsleep"..., 80) = 40
lseek(3, 0, SEEK_SET) = 0
getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024*1024}) = 0
fcntl(255, F_GETFD) = -1 EBADF (Bad file descriptor)
dup2(3, 255) = 255
close(3) = 0
fcntl(255, F_SETFD, FD_CLOEXEC) = 0
fcntl(255, F_GETFL) = 0x8000 (flags O_RDONLY|O_LARGEFILE)
fstat(255, {st_mode=S_IFREG|0775, st_size=40, ...}) = 0
lseek(255, 0, SEEK_CUR) = 0
brk(0x26c0000) = 0x26c0000
read(255, "#!/bin/bash\nwhile true\ndo\n\tsleep"..., 40) = 40
stat(".", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
stat("/home/haoyuan/software/google-cloud-sdk/bin/sleep", 0x7fff13585450) = -1 ENOENT (No such file or directory)
stat("/home/haoyuan/bin/sleep", 0x7fff13585450) = -1 ENOENT (No such file or directory)
stat("/home/haoyuan/.local/bin/sleep", 0x7fff13585450) = -1 ENOENT (No such file or directory)
stat("/usr/local/sbin/sleep", 0x7fff13585450) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/sleep", 0x7fff13585450) = -1 ENOENT (No such file or directory)
stat("/usr/sbin/sleep", 0x7fff13585450) = -1 ENOENT (No such file or directory)
stat("/usr/bin/sleep", 0x7fff13585450) = -1 ENOENT (No such file or directory)
stat("/sbin/sleep", 0x7fff13585450) = -1 ENOENT (No such file or directory)
stat("/bin/sleep", {st_mode=S_IFREG|0755, st_size=31408, ...}) = 0
stat("/bin/sleep", {st_mode=S_IFREG|0755, st_size=31408, ...}) = 0
geteuid() = 1000
getegid() = 1000
getuid() = 1000
getgid() = 1000
access("/bin/sleep", X_OK) = 0
stat("/bin/sleep", {st_mode=S_IFREG|0755, st_size=31408, ...}) = 0
geteuid() = 1000
getegid() = 1000
getuid() = 1000
getgid() = 1000
access("/bin/sleep", R_OK) = 0
stat("/bin/sleep", {st_mode=S_IFREG|0755, st_size=31408, ...}) = 0
stat("/bin/sleep", {st_mode=S_IFREG|0755, st_size=31408, ...}) = 0
geteuid() = 1000
getegid() = 1000
getuid() = 1000
getgid() = 1000
access("/bin/sleep", X_OK) = 0
stat("/bin/sleep", {st_mode=S_IFREG|0755, st_size=31408, ...}) = 0
geteuid() = 1000
getegid() = 1000
getuid() = 1000
getgid() = 1000
access("/bin/sleep", R_OK) = 0
brk(0x26c1000) = 0x26c1000
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4f4b49e9d0) = 14703
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14703
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14703, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7fff13584e90, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4f4b49e9d0) = 14706
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14706
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14706, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7fff13584e90, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4f4b49e9d0) = 14707
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14707
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14707, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7fff13584e90, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4f4b49e9d0) = 14708
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14708
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14708, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7fff13584e90, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4f4b49e9d0) = 14711
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 14711
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f4f4aad94b0}, {0x4449b0, [], SA_RESTORER, 0x7f4f4aad94b0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14711, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
wait4(-1, 0x7fff13584e90, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f4f4b49e9d0) = 14712

influxDB-SQL-for-Kubernetes-metrics.md

Posted on 2018-09-27

节点监控指标汇总

  • 这里以 10.35.48.177为例,可以访问172.25.3.194上面的influxdb进行测试
  • InfluxDB 包含mean、group by 等语法,可以视需要使用
  • 本文中仅为示例用法
  • 有些指标是固定的,比如总的的文件系统空间、节点总内存及可分配总内存、总cpu核数、GPU总显存,所以一般搜最新的就好

容器总的cpu利用率(单位%)

SELECT * FROM k8s.”default”.”cpu/node_utilization” WHERE (nodename =~ /^10.35.48.177$/ AND type = ‘node’) AND time >= now() - 1h;

或者

SELECT mean(value) FROM k8s.”default”.”cpu/node_utilization” WHERE (nodename =~ /^10.35.48.177$/ AND type = ‘node’) AND time >= now() - 1h GROUP BY time(1m)

总cpu核数

SELECT mean(value) / 1000 FROM k8s.”default”.”cpu/node_capacity” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 5m GROUP BY time(30s)
部分sql语法可以自己斟酌下哈

内存利用率(单位%)

每1分钟聚合的内存利用率均值: SELECT mean(value) FROM k8s."default"."memory/node_utilization" WHERE (nodename =~ /^10\.35\.48\.177$/ AND type = 'node') AND time >= now() - 1h GROUP BY time(1m)

节点总内存 字节

SELECT mean(value) / 1000 FROM k8s.”default”.”cpu/node_capacity” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h GROUP BY time(30s)

节点总的可分配内存 字节

SELECT mean(value) FROM k8s.”default”.”memory/node_allocatable” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h GROUP BY time(30s)

节点上容器使用的总内存

SELECT value FROM k8s.”default”.”memory/usage” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h

节点上容器使用的RSS内存

SELECT value FROM k8s.”default”.”memory/rss” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h

节点上容器使用的cache内存

SELECT value FROM k8s.”default”.”memory/cache” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h

节点上容器使用的working_set内存

SELECT value FROM k8s.”default”.”memory/working_set” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h

  • memory_usage = RAM usage include pages that have not been accessed in a
    long time.
  • working set = memory usage - inactive memory.

网络读速率

SELECT value FROM k8s.”default”.”network/rx_rate” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h

网络写速率

SELECT value FROM k8s.”default”.”network/tx_rate” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h

磁盘读速率(暂时忽略,上游有bug,会显示负数)

SELECT mean(value) FROM k8s.”default”.”disk/io_read_bytes_rate” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h GROUP BY time(30s)

磁盘写速率(暂时忽略)

SELECT mean(value) FROM k8s.”default”.”disk/io_write_bytes_rate” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1h GROUP BY time(30s)

可用的文件系统空间(按照磁盘分类)

SELECT value FROM k8s.”default”.”filesystem/available” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 10m group by resource_id

已使用的文件系统空间(按照磁盘分类)

SELECT value FROM k8s.”default”.”filesystem/usage” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 10m group by resource_id

总的的文件系统空间

SELECT value FROM k8s.”default”.”filesystem/limit” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1m group by resource_id

GPU总显存

SELECT mean(value) FROM k8s.”default”.”accelerator/memory_total” WHERE nodename =~ /^10.30.21.153$/ AND time >= now() - 1h GROUP BY time(1m)

GPU已使用的显存

SELECT mean(value) FROM k8s.”default”.”accelerator/memory_used” WHERE nodename =~ /^10.30.21.153$/ AND time >= now() - 1h GROUP BY time(1m)

GPU核心利用率

SELECT value FROM k8s.”default”.”accelerator/duty_cycle” WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 10m

uptime 启动时间

SELECT value FROM k8s.”default”.uptime WHERE (type = ‘node’ AND nodename =~ /^10.35.48.177$/) AND time >= now() - 1m

容器内指标

各种服务的基本查询SQL

对于多副本(pod)的无状态服务/有状态服务/短任务,查询到的指标值应该是各个副本的和

无状态服务

1
2
SELECT mean(value) FROM k8s."default"."memory/usage" WHERE (type = 'rc' AND rc_name =~ /^autotest-template-server123-4$/ AND namespace_name =~ /^guxiawei-84$/) AND time >= now() - 1h GROUP BY time(1m)
SELECT mean(value) FROM k8s."default"."cpu/usage_rate" WHERE (type = 'rc' AND rc_name =~ /^autotest-template-server123-4$/ AND namespace_name =~ /^guxiawei-84$/) AND time >= now() - 1h GROUP BY time(1m)

短任务

1
SELECT mean(value) FROM k8s."default"."memory/usage" WHERE (type = 'job' AND job_name =~ /^job-createzy6vgx$/ AND namespace_name =~ /^liuguiying-61$/) AND time >= now() - 1h GROUP BY time(1m)

有状态服务

1
SELECT mean(value) FROM k8s."default"."memory/usage" WHERE (type = 'ss' AND ss_name =~ /^testservice110$/ AND namespace_name =~ /^wangmeng3-154$/) AND time >= now() - 1h GROUP BY time(1m)

pod

1
2
SELECT mean(value) FROM k8s."default"."memory/usage" WHERE (type = 'pod' AND pod_name =~ /^testservice110-0$/ AND namespace_name =~ /^wangmeng3-154$/) AND time >= now() - 1h GROUP BY time(1m)
SELECT mean(value) FROM k8s."default"."cpu/usage_rate" WHERE (type = 'pod' AND pod_name =~ /^autotest-template-server123-4-87ms1$/ AND namespace_name =~ /^guxiawei-84$/) AND time >= now() - 1h GROUP BY time(1m)

容器

  • 根据pod名称和namespace查询,并按照容器名分类

    1
    SELECT value FROM k8s."default"."memory/usage" WHERE (type='pod_container' AND pod_name='gb-groupdn-stable-779-1-rcv9x'  AND namespace_name =~ /^guanbo-225$/) AND time >= now() - 5m group by container_name
  • 按照容器名和pod名和namespace查询

    1
    SELECT value FROM k8s."default"."memory/usage" WHERE (type='pod_container' AND pod_name='gb-groupdn-stable-779-1-rcv9x'  AND namespace_name =~ /^guanbo-225$/ and container_name='media-node') AND time >= now() - 5m
  • 按照容器名和namespace查询(不推荐,容器名可能重名)

    1
    SELECT value FROM k8s."default"."memory/usage" WHERE (type='pod_container' AND namespace_name =~ /^guanbo-225$/ and container_name='media-node') AND time >= now() - 5m

GPU

1
SELECT mean(value) FROM k8s."default"."accelerator/memory_used" WHERE (type = 'pod' AND pod_name =~ /^autotest-template-server123-4-87ms1$/ AND namespace_name =~ /^haoyuan-8$/) AND time >= now() - 1h GROUP BY time(1m)

对于容器,需要的指标有:

  • cpu/limit 容器的cpu限额
  • cpu/request 独占的CPU核数
  • cpu/usage_rate cpu使用率
  • disk/io_read_bytes_rate 磁盘读速率
  • disk/io_write_bytes_rate 磁盘写速率
  • memory/limit 容器的内存限额
  • memory/request 容器独占的内存
  • memory/rss 使用的rss内存
  • memory/usage 内存使用量
  • memory/cache cache内存
  • accelerator/memory_total Memory capacity of an accelerator.
  • accelerator/memory_used Memory used of an accelerator.
  • accelerator/duty_cycle Duty cycle of an accelerator.
  • accelerator/request Number of accelerator devices requested by container.
  • network/rx_rate 网络读速率
  • network/tx_rate 网络写速率

附录:所有heapster指标

  • 参考: https://github.com/kubernetes/heapster/blob/master/docs/storage-schema.md
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    cpu/limit
    cpu/node_allocatable
    cpu/node_capacity
    cpu/node_reservation
    cpu/node_utilization
    cpu/request
    cpu/usage
    cpu/usage_rate
    disk/io_read_bytes
    disk/io_read_bytes_rate
    disk/io_write_bytes
    disk/io_write_bytes_rate
    filesystem/available
    filesystem/inodes
    filesystem/inodes_free
    filesystem/limit
    filesystem/usage
    memory/cache
    memory/limit
    memory/major_page_faults
    memory/major_page_faults_rate
    memory/node_allocatable
    memory/node_capacity
    memory/node_reservation
    memory/node_utilization
    memory/page_faults
    memory/page_faults_rate
    memory/request
    memory/rss
    memory/usage
    memory/working_set
    accelerator/memory_total Memory capacity of an accelerator.
    accelerator/memory_used Memory used of an accelerator.
    accelerator/duty_cycle Duty cycle of an accelerator.
    accelerator/request Number of accelerator devices requested by container.
    network/rx
    network/rx_errors
    network/rx_errors_rate
    network/rx_rate
    network/tx
    network/tx_errors
    network/tx_errors_rate
    network/tx_rate
    restart_count
    uptime

k8s_auth

Posted on 2016-11-26
  • cmd/kube-apiserver/app/server.go
    1
    2
    3
    authorizer, err := apiserver.NewAuthorizerFromAuthorizationConfig(s.AuthorizationMode, s.AuthorizationPolicyFile)

    authenticator, err := apiserver.NewAuthenticator(s.BasicAuthFile, s.ClientCAFile, s.TokenAuthFile, s.ServiceAccountKeyFile, s.ServiceAccountLookup, helper)

printf在kernel中的实现

Posted on 2016-07-02

static void
putch(int ch, int cnt)
{
cputchar(ch);
cnt++;
}

int
vcprintf(const char *fmt, va_list ap)
{
int cnt = 0;

vprintfmt((void*)putch, &cnt, fmt, ap);
return cnt;

}

int
cprintf(const char *fmt, …)
{
va_list ap;
int cnt;

va_start(ap, fmt);
cnt = vcprintf(fmt, ap);
va_end(ap);

return cnt;

}

os-kernel

Posted on 2016-05-22

重新开始刷清华ucore , 取材自MIT 6.828, 操作系统神课,把类似unix的内核手动实现一遍。周末刷了物理内存管理(双向链表维护空闲内存,多级页表映射)
目标今年向向docker贡献源代码!往kubernetes提交pr!先熟悉内核。

test

Posted on 2016-05-22

This is a test.

Got to write in Hexo now!

Pao

Pao's blog

6 posts
14 tags
© 2018 Pao
Powered by Hexo
|
Theme — NexT.Muse v5.1.4