我今天才建立起这个意识: ps / top 的输出里,CPU 统计是用户态+内核态,但是!内存 RSS 消耗却只有用户态。

比如下面这个 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 微操的阳光彩虹小白马们(指我自己)如果没有这种意识,恐怕要走历史的弯路。

我用了十年学习编程,到今天依然因为学会新知识而激动
 
 
Back to Top