HAproxy 重新加载后内存使用量增加一倍

HAproxy 重新加载后内存使用量增加一倍

由于流量大且我们的应用需要保持连接,因此我们的 haproxy 进程消耗了大量 RAM(通常为可用 RAM 的 30-40%)。现在,当我们想要添加/删除任何后端时,我们必须重新加载 haproxy。在正常重新加载期间(通过 ubuntu 的默认 init 重新加载),将创建一个新的 haproxy 进程,它将为新连接提供服务,现有进程将一直保留在那里,直到旧连接被应用关闭或由于超时等原因被清除。这种行为是正常的。

但这两个进程几乎占用了所有可用的 RAM,事实上,如果第一个进程已经消耗了超过 50% 的 RAM,那么任何重新加载都可能导致中断(还没有遇到过,但增加流量很快就会发生这种情况),情况会很可怕。这迫使我们要么强制终止旧进程(丢失旧连接),要么必须始终保持足够的(> 50%)RAM 可用(浪费资源)。

我将不胜感激任何帮助/指点。我们使用的是 Ubuntu 12.04 和 haproxy 1.4.18。

答案1

这是一个众所周知的问题。这就是我们支持 DLMALLOC 的原因。只需下载它,使用它重建 haproxy,问题就会消失。这就是我们在设备 (ALOHA) 中为此使用的方法精确的原因。Dlmalloc 使用 mmap() 分配内存,并支持其地址空间中的空洞,因此每次调用 free() 导致至少一个页面被释放,实际上会导致该页面被释放。标准 malloc 几乎不支持这一点(它往往只在释放大片连续区域时才支持这一点),因此它只在所有页面释放后才释放内存那个点也释放了。这是一个很大的区别。

相关内容