rost@localhost ~$ ulimit -m 4096
rost@localhost ~$ ./fillmem
Used memory: 1 Mb
Used memory: 2 Mb
Used memory: 3 Mb
Used memory: 4 Mb
Used memory: 5 Mb
Used memory: 6 Mb
Used memory: 7 Mb
Used memory: 8 Mb
Used memory: 9 Mb
Used memory: 10 Mb
Used memory: 11 Mb
Used memory: 12 Mb
Used memory: 13 Mb
Used memory: 14 Mb
Used memory: 15 Mb
Used memory: 16 Mb
rost@localhost ~$ ulimit -a |grep '\-m'
max memory size (kbytes, -m) 4096
wtf? :(
fillmem.c
#include <errno.h>
#include <stdlib.h>
#define MB 16
#define ONEM 1024*1024
int main() {
void *m;
int i;
for(i=0; i<MB; i++) {
m = malloc(ONEM);
if ( m == NULL ) {
printf("Can't malloc: %s\n",strerror(errno));
exit(1);
}
memset(m,'\0',ONEM);
printf("Used memory: %d Mb\n", (i+1));
sleep(1);
}
return(0);
}
Если не ошибаюсь, параметр «as» соответствует ulimit -v, который в свою очередь ограничивает виртуальную память.
Мне бы хотелось ограничить именно реально занимаемую память. Иначе, я не знаю как, например, ограничить память апачу. У него воркеры занимают ~230М вирт памяти и 4М реальной...
Можно, конечно, поставить лимит вирт.памяти 256М. Но так как в системе всего 128МВ рам, то толку от этого будет мало. :)
ИМХО - не поможет. В книге «Ядро Linux» за авторством Д. Бовет и М. Чезати в главе «Процессы» сказано: «Ограничение RLIMIT_RSS(-m) в настоящее время не действует». Информация правда относится к ядру 2.6.11, но по-видимому с той поры ничего не изменилось. Так что кури в сторону cgroups...