我今天才建立起这个意识: ps / top 的输出里,CPU 统计是用户态+内核态,但是!内存 RSS 消耗却只有用户态。
比如下面这个 open 一百万个 /dev/null fd 的进程 (powered by o3)
cat /proc/$PID/status | grep RSS 的结果是 5276 kB,然而用 cgroup v2 memory.current 去看才知道这个进程消耗了 277M RSS。其实去年我已经知道这个,然而并没有建立起意识,一查内存还是先 top -o %MEM。在容器化时代大家用 docker stats 或等价 API 取到的是整个 pod user+sys RSS,这很好,但对于喜欢在 host namespace 微操的阳光彩虹小白马们(指我自己)如果没有这种意识,恐怕要走历史的弯路。
我用了十年学习编程,到今天依然因为学会新知识而激动
比如下面这个 open 一百万个 /dev/null fd 的进程 (powered by o3)
int main(int argc, char *argv[])
{
size_t to_open = 1000000ULL;
if (raise_nofile(to_open + 32) == -1)
fputs("⚠️ Couldn’t lift RLIMIT_NOFILE — continuing anyway\n", stderr);
int *fds = malloc(sizeof(int) * to_open);
if (!fds) {
perror("malloc");
return 1;
}
const char *path = "/dev/null";
size_t opened = 0;
for (; opened < to_open; ++opened) {
int fd = open(path, O_RDONLY | O_CLOEXEC);
if (fd == -1) {
perror("open");
break;
}
fds[opened] = fd;
if ((opened + 1) % 100000 == 0)
fprintf(stderr, "opened %zu FDs\n", opened + 1);
}
printf("✅ Holding %zu file-descriptors open. PID %jd. Sleeping…\n",
opened, (intmax_t)getpid());
pause();
return 0;
}cat /proc/$PID/status | grep RSS 的结果是 5276 kB,然而用 cgroup v2 memory.current 去看才知道这个进程消耗了 277M RSS。其实去年我已经知道这个,然而并没有建立起意识,一查内存还是先 top -o %MEM。在容器化时代大家用 docker stats 或等价 API 取到的是整个 pod user+sys RSS,这很好,但对于喜欢在 host namespace 微操的阳光彩虹小白马们(指我自己)如果没有这种意识,恐怕要走历史的弯路。
我用了十年学习编程,到今天依然因为学会新知识而激动
