Is it possible to apply cgroup memory subsystem controls to threads created with pthread_create() / clone or only tasks that have been created using fork and exec? In testing, we seem to be seeing that all allocations are accounted for against the PPID / TGID and never the pthread_create()'d TID, even though the TID is an LWP and can be seen using top (though RSS is aggregate and global of course). Attached is a simple test program used to print PID / TID and allocate memory from a cloned TID. After setting breakpoints in child and parent and setting up a cgroups hierarchy of 'parent' and 'child', apply memory.limit_in_bytes and memory.memsw.limit_in_bytes to the child cgroup only and adding the PID to the parent group and the TID to the child group we see that behaviour. Is that expected? I realise that the subsystems are all different but what is confusing us slightly is that we have previously used the CPU subsystem to set cpu_shares and adding LWP / TID's to individual cgroups worked just fine for that Am I misconfiguring somehow or is this a known difference between CPU and MEMORY subsystems?
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/syscall.h> void thread_func() { printf( "thread pid=%d, thread tid=%d\n", getpid(), syscall( SYS_gettid ) ); size_t one_hundred_mb = 100 * 1024 * 1024; void * allocatedChunk = malloc ( one_hundred_mb ); memset( allocatedChunk, 0, one_hundred_mb ); if ( allocatedChunk == NULL ) { printf("couldn't allocate\n"); } else { int tid = syscall( SYS_gettid ); printf( "PID: %d, TID: %d - has allocated 100mb\n", getpid(), syscall( SYS_gettid ) ); } sleep(1000); } void main() { printf( "main pid=%d, main tid=%d\n", getpid(), syscall( SYS_gettid ) ); pthread_t thread1; pthread_create( &thread1, NULL, (void *)&thread_func, NULL); /* pid_t childpid; childpid = fork(); if ( childpid >= 0 ) { if ( childpid == 0 ) { thread_func(); // child } else { sleep(1000); // parent } } else { perror("fork"); exit(0); } */ sleep(1000); }