Hi Godbach, On Fri, Jul 19, 2013 at 04:02:17PM +0800, Godbach wrote: > Oh, one thing may be forgotten mentioned in my first mail: > > >Then I run a simple program which also called calloc to alloc 300Mbytes > >meomory, and the reuslt as below: > > PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND > >17797 root 20 0 304m 300m 332 S 0.0 7.7 0:00.15 tmem > >The RES is 300M just as it supposed to be. > > The simple test program 'tmem' I wrote just allocates memory in > 300Mbytes by calloc, mmap is also be used to do the allocation, the > strace result is as below: > > execve("./tmem", ["./tmem"], [/* 33 vars */]) = 0 > brk(0) = 0xd22000 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) > = 0x7fcb67263000 > 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=114390, ...}) = 0 > mmap(NULL, 114390, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fcb67247000 > close(3) = 0 > open("/lib64/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\0\260\27B\25?\0\0\0"..., > 832) = 832 > fstat(3, {st_mode=S_IFREG|0755, st_size=2076800, ...}) = 0 > mmap(0x3f15400000, 3896632, PROT_READ|PROT_EXEC, > MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3f15400000 > mprotect(0x3f155ad000, 2097152, PROT_NONE) = 0 > mmap(0x3f157ad000, 24576, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ad000) = 0x3f157ad000 > mmap(0x3f157b3000, 17720, PROT_READ|PROT_WRITE, > MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3f157b3000 > close(3) = 0 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) > = 0x7fcb67246000 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) > = 0x7fcb67245000 > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) > = 0x7fcb67244000 > arch_prctl(ARCH_SET_FS, 0x7fcb67245700) = 0 > mprotect(0x3f157ad000, 16384, PROT_READ) = 0 > mprotect(0x3f14e21000, 4096, PROT_READ) = 0 > munmap(0x7fcb67247000, 114390) = 0 > mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, > -1, 0) = 0x7fcb54643000 > pause( > > The last line shows that mmap is used. Since this program can use full > size memory it supposed to, there is a conflict between this result and > the conclusion we talked about before. > > The test codes is as below: > > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > > #define MEMSIZE (300 * 1024 * 1024) > > int main(int argc, char *argv[]) > { > char *p = NULL; > > p = calloc(1, MEMSIZE); > pause(); > free(p); > return 0; > }
I agree and can confirm your results here. Also, if I replace the calloc with a malloc, I still see mmap and we don't have the 300M RSS anymore : willy@pcw:~$ ps auxw|grep a.out willy 31956 0.0 0.0 2880 632 pts/4 S+ 07:36 0:00 strace ./a.out willy 31957 0.0 0.0 308764 320 pts/4 S+ 07:36 0:00 ./a.out So... it's becoming increasingly likely that we have a bug in haproxy or at least that we're overlooking something. That said I don't see what the issue could be considering that we're initializing fdinfo and fdtab with a calloc() just at one place. There's not even a realloc(). Best regards, Willy