重载后HAproxy双重内存使用情况

由于高stream量和我们的应用程序的性质,以保持连接生活,我们haproxy进程消耗大量的RAM(通常30-40%的可用RAM)。 现在,当我们想添加/删除任何后端,我们必须重新加载haproxy。 在优雅重新加载期间(通过Ubuntu的默认init重新加载),一个新的haproxy进程被创build,它将服务于新的连接,现有的进程保持在那里,直到旧的连接被应用程序closures或由于超时等清理。这种行为是好的。

但是这两个进程几乎占用了所有可用的内存,事实上,如果第一个进程已经消耗了超过50%的RAM,那么任何重新加载都可能导致中断(还没有经历,但是增加的stream量将使其很快发生) 。 这迫使我们要么强行杀死旧的进程(丢失旧的连接),要么一直保持足够的(> 50%)RAM(浪费资源)。

我会很感激在这方面的任何帮助/指针。 我们使用haproxy 1.4.18在Ubuntu 12.04上。

这是一个众所周知的问题。 这就是我们支持DLMALLOC的原因。 只要下载它,用它重buildhaproxy,问题就会消失。 正是由于这个原因,我们正在使用我们的电器(ALOHA)。 Dlmalloc利用mmap()来分配内存,并在地址空间中支持漏洞,所以每次调用free()至less会释放一个页面,这将有效地释放该页面。 标准的malloc几乎不支持这个(它只是在释放大型连续区域时才支持它),所以一旦所有的页面被释放,它也只释放内存。 这是一个很大的区别。