ISC DHCPD 内存泄漏解决方案和解决方法

ISC DHCPD 内存泄漏解决方案和解决方法

背景:
我最近负责在 Debian(Lenny)Unix 服务器上安装 ISC DHCPD(4.2.5-P1)时查找内存泄漏的根源和/或修复该问题。

我已经研究这个问题一个多星期了,并且已经检索到了很多关于系统确实泄漏的信息,但我还没有找到为什么会泄漏或如何阻止它的实际答案。

我目前有:

  • 使用 vgdb 模式下的 valgrind 检测内存泄漏并允许对代码进行行检查
  • 使用 valgrind 发现了泄漏的两个可能起点
  • 使用以下方法编译 DHCPD 源代码CFLAGS=-DDEBUG_MEMORY_LEAKAGE_ON_EXIT(这似乎可以阻止内存泄漏)
  • 运行新编译的 DHCPD 二进制文件dhcpd -6 -d -cf /etc/dhcpd6.conf
  • 使用以下脚本在 72 小时内每隔 10 分钟拍摄一次 vsz 和 rss 二进制文件的快照

脚本:

#!/bin/bash
#probably could have used watch
while [[ 0 -eq 0 ]]; do
    ps -eo vsz,rss,command | grep "dhcpd6.conf" | grep -v grep >> memory-usage.txt
    sleep 600
done

我对 VSZ 和 RSS 做了一些研究。如果 RSS 大小保持不变,但 VSZ 大小增加,则似乎存在明显的内存泄漏。但是,在我的情况下,VSZ 和 RSS 都在增加。[第一天的起始大小:VZS=8560 RSS=6292 => 第三天的结束大小:VZS=67168 RSS=64860]

我也查看了/proc/PID/maps是否可以从那里获取任何信息,但没有找到任何有用的东西。

/proc/PID/maps 信息:

08048000-081e3000 r-xp 00000000 08:05 119382     /usr/sbin/dhcpd
081e3000-081e8000 rw-p 0019b000 08:05 119382     /usr/sbin/dhcpd
081e8000-08222000 rw-p 081e8000 00:00 0
09fea000-0a11c000 rw-p 09fea000 00:00 0          [heap]
b72b7000-b72c1000 r-xp 00000000 08:01 6184       /lib/i686/cmov/libnss_files-2.7.so
b72c1000-b72c3000 rw-p 00009000 08:01 6184       /lib/i686/cmov/libnss_files-2.7.so
b72c3000-b7673000 rw-p b72c3000 00:00 0
b7673000-b77c8000 r-xp 00000000 08:01 6192       /lib/i686/cmov/libc-2.7.so
b77c8000-b77c9000 r--p 00155000 08:01 6192       /lib/i686/cmov/libc-2.7.so
b77c9000-b77cb000 rw-p 00156000 08:01 6192       /lib/i686/cmov/libc-2.7.so
b77cb000-b77ce000 rw-p b77cb000 00:00 0
b77cf000-b77d0000 rw-p b77cf000 00:00 0
b77d1000-b77d4000 rw-p b77d1000 00:00 0
b77d4000-b77d5000 r-xp b77d4000 00:00 0          [vdso]
b77d5000-b77ef000 r-xp 00000000 08:01 2022       /lib/ld-2.7.so
b77ef000-b77f1000 rw-p 0001a000 08:01 2022       /lib/ld-2.7.so
bfe0d000-bfe30000 rw-p bffdc000 00:00 0          [stack]

问题):
1. 我应该如何调试这样的内存泄漏?
2. ISC 表示解决方案是每隔一段时间重置服务器,这不是错误。如果我的客户不想重置他们的服务器,有没有折衷方案?(他们想要确凿的证据证明他们必须采取解决方案。)
3. 自 2013 年 1 月以来,有人遇到过与 dhcpd 相关的泄漏吗?
4. 是否有解决方案或解决方法可以解决此问题?

相关链接):
1. https://kb.isc.org/article/AA-00737(ISC 报告)
2. https://access.redhat.com/site/solutions/402713(此错误报告与我的内存泄漏的起点相匹配[OMAPI FUNCTIONALITY])

如果您需要任何可能有助于解决此问题的其他信息,我愿意提供我所能提供的信息。

同时,我将看看是否可以编译二进制文件并禁用 OMAPI 功能。

DHCP 4.3.0a1 刚刚发布,所以我将看看这是否会带来任何改变(变更日志中没有关于错误泄漏修复的信息,但尝试一下也无妨)。

谢谢你的时间。

答案1

作为一种解决方法,你可以考虑在进程管理器下运行具有内存限制的 dhcpd,例如运行

如果 dhcpd 无法分配内存,则希望它中止,此时进程管理器将重新启动它。

或者您可以从 cron 定期重新启动它 - 它仍然比重新启动整个服务器的侵入性更小。

相关内容