AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 612381
Accepted
tread
tread
Asked: 2014-07-15 05:07:42 +0800 CST2014-07-15 05:07:42 +0800 CST 2014-07-15 05:07:42 +0800 CST

为什么 Clam 防病毒守护程序不会以无法分配内存错误启动?

  • 772

/etc/init.d/clamd start

错误:

[FAILED] log gives ERROR: daemonize() failed: Cannot Allocate Memory

上Cent OS

total Mem: 510876kb

/etc/init.d/clamd start

在/var/log/clamav

ERROR: daemonize() failed: Cannot Allocate Memory?

这是一个可以解决的问题吗?

我以为Clamd只需要20 - 40 mb

说Memory Free: 273844k

strace 的结果:

waitpid(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0) = 1658
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
waitpid(-1, 0xbff84a2c, WNOHANG)        = -1 ECHILD (No child processes)
sigreturn()                             = ? (mask now [])
rt_sigaction(SIGINT, {SIG_DFL, [], 0}, {0x80810f0, [], 0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(255, "", 1694)                     = 0
exit_group(1)                           = ?

strace -f 的结果:

strace -f -o /tmp/clamd.txt service clamd start

几乎相同,我在寻找某种错误吗?

centos
  • 2 2 个回答
  • 11111 Views

2 个回答

  • Voted
  1. Bodo Hugo Barwich
    2018-06-07T00:44:54+08:002018-06-07T00:44:54+08:00

    我也遇到了同样的问题。
    我观察到它clamd在内存中一次又一次地增长,然后因错误而崩溃:

    Jun  6 08:08:32 <server> clamd[5086]: Received 0 file descriptor(s) from systemd.
    Jun  6 08:08:32 <server> clamd[5086]: clamd daemon 0.99.4 (OS: linux-gnu, ARCH: x86_64, CPU: x86_64)
    Jun  6 08:08:32 <server> clamd[5086]: Running as user clamupdate (UID 992, GID 990)
    Jun  6 08:08:32 <server> clamd[5086]: Log file size limited to 1048576 bytes.
    Jun  6 08:08:32 <server> clamd[5086]: Reading databases from /var/lib/clamav
    Jun  6 08:08:32 <server> clamd[5086]: Not loading PUA signatures.
    Jun  6 08:08:32 <server> clamd[5086]: Bytecode: Security mode set to "TrustSigned".
    Jun  6 08:08:46 <server> clamd[5086]: Loaded 6538218 signatures.
    Jun  6 08:08:48 <server> clamd[5086]: LOCAL: Unix socket file /var/run/clamd/clamd.sock
    Jun  6 08:08:48 <server> clamd[5086]: LOCAL: Setting connection queue length to 4
    Jun  6 08:08:48 <server> clamd[5086]: daemonize() failed: Cannot allocate memory
    Jun  6 08:08:48 <server> clamd[5086]: Closing the main socket.
    Jun  6 08:08:48 <server> clamd[5086]: Socket file removed.
    

    我观察到clamd内存增长到532 MB

    # ps -o pid,size,rss,etime,start,cmd -p 16114|more
      PID  SIZE   RSS     ELAPSED  STARTED CMD
    16114 580024 545672     00:15 08:18:21 /usr/sbin/clamd -c /etc/clamd.d/clamd.conf
    # echo "scale=3; 545672/1024"|bc -l
    532.882
    

    我认为 532 MB 会很紧,但我仍然可以放入小型服务器

    # free -m
                  total        used        free      shared  buff/cache   available
    Mem:           1834         532         626          89         675        1004
    Swap:             0           0           0
    

    一直都知道它clamd会消耗很多内存,但它似乎随着时间的推移变得越来越大。
    所以我想知道什么会消耗这么多内存并用strace.
    我发现它实际上正在将所有数据库文件读入内存,因为它在其日志中声明Reading databases from /var/lib/clamav并创建了一个内存索引6538218 signatures:

    openat(AT_FDCWD, "/var/lib/clamav", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 5
    getdents(5, /* 6 entries */, 32768)     = 176
    stat("/var/lib/clamav/daily.cld", {st_mode=S_IFREG|0644, st_size=141535744, ...}) = 0
    stat("/var/lib/clamav/main.cvd", {st_mode=S_IFREG|0644, st_size=117892267, ...}) = 0
    stat("/var/lib/clamav/bytecode.cvd", {st_mode=S_IFREG|0644, st_size=153228, ...}) = 0
    getdents(5, /* 0 entries */, 32768)     = 0
    close(5)                                = 0
    stat("/var/log/clamd/clamd.log", {st_mode=S_IFREG|0600, st_size=266784, ...}) = 0
    write(3, "Wed Jun  6 08:08:46 2018 -> Load"..., 55) = 55
    sendto(4, "<22>Jun  6 08:08:46 clamd[5086]:"..., 59, MSG_NOSIGNAL, NULL, 0) = 59
    

    在将所有病毒定义读入内存后,它最终会尝试fork尝试克隆 532 MB 内存索引的子进程

    clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd70bb64b10) = -1 ENOMEM (Cannot allocate memory)
    stat("/var/log/clamd/clamd.log", {st_mode=S_IFREG|0600, st_size=266989, ...}) = 0
    write(3, "Wed Jun  6 08:08:48 2018 -> ERRO"..., 78) = 78
    write(2, "ERROR: daemonize() failed: Canno"..., 50) = 50
    sendto(4, "<19>Jun  6 08:08:48 clamd[5086]:"..., 75, MSG_NOSIGNAL, NULL, 0) = 75
    

    所以实际上在启动的那一刻,它会消耗双倍的内存,使其成为内存索引。

    现在为了能够启动和运行这个服务,我至少需要创建一个交换分区来克服这个启动序列。
    正如其他人所评论的那样,增加系统内存可以帮助您克服这种启动内存增加。

    • 6
  2. Best Answer
    hovmand
    2015-01-25T05:21:23+08:002015-01-25T05:21:23+08:00

    我也遇到过同样的问题,发现像这个人一样saslauthd占用了很多内存。

    问题可能是内存泄漏,此处描述了可能的修复方法:https ://www.howtoforge.com/community/threads/saslauthd-memory-leak-fix.52750/

    尝试了修复,但我无法确认,因为问题(如果仍然存在)不会在几周后出现。

    • 2

相关问题

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 使用 crontab 和 /etc/cron.hourly,daily,weekly 的区别

  • 持续监控许多服务器运行状况的简单方法?

  • Hudson 无法在 tomcat5 中启动

  • CentOS 的依赖挑战

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve