【问题标题】:Writing to syslog causes heap allocation to steadily increase in size写入 syslog 会导致堆分配的大小稳步增加
【发布时间】:2012-07-31 09:19:57
【问题描述】:

昨天我想知道为什么堆上的分配和释放的数量不断攀升: Valgrind understanding bytes allocated increase in heap summary?

今天我找到了罪魁祸首,但我不明白为什么:

openlog ("XYSV", LOG_PID, LOG_SYSLOG);
syslog (LOG_NOTICE, "server started by %s(%d) on port %d", getenv("USER"),getuid (),servPort);
closelog();

for (;;) /* Run forever */
{
    clntSock = AcceptTCPConnection(servSock);
    char ipstr[INET6_ADDRSTRLEN];

    /* Fork child process and report any errors */
    if ((processID = fork()) < 0)
        DieWithError("fork() failed");
    else if (processID == 0)  /* If this is the child process */
    {
        close(servSock);   /* Child closes parent socket */
        HandleTCPClient(clntSock);

        exit(0);           /* Child process terminates */
    }

    openlog ("XYSV", LOG_PID, LOG_SYSLOG);
    //syslog(LOG_INFO,"%d : created new child process for connect from %s\n", (int) processID,ipstr);
    //syslog(LOG_INFO, "test");
    closelog();

    close(clntSock);       /* Parent closes child socket descriptor */
    childProcCount++;      /* Increment number of outstanding child processes */    
}

一旦我取消注释两个 syslog 条目,堆上的分配(由 Valgrind 报告)就会不断增加。 allocs 也被释放,但是 allocs 的总数不断增加,因此分配的内存的大小。恕我直言,这迟早会导致服务器内存不足。

我的问题是:为什么写入系统日志会导致分配增加。我很好地关闭了系统日志。第一个 syslog 对堆分配没有影响。当我在第二次写入系统日志时将打开和关闭保留在适当的位置,并将实际写入注释掉,一切都很好。一旦我取消注释一两行 syslog 行,alloc 就会开始爬升。

我一定是在监督一些明显的事情。

【问题讨论】:

  • 删除fork,查看内存是否增加。
  • 不是分叉,而是对系统日志的调用。一旦我取消注释两条系统日志消息中的任何一条,内存就会开始增加。我不明白为什么它发生在较低的 syslog 调用中而不是在上面的调用中?

标签: c heap-memory syslog


【解决方案1】:

如果消息大于其本地缓冲区,syslog 调用将分配内存来保存日志消息,然后再传递它。

它实际上写入通过调用open_memstream 创建的FILE *,这是一个实际使用根据需要自动增长的缓冲区的C 文件流。然后它获取缓冲区并将其内容发送到记录器。

来源是here

【讨论】:

  • 谢谢,但是 closelog 不应该释放缓冲区吗?我发送的消息很短(“测试”),并且在实际写入之后调用 closelog()。
  • @lleto:您的 valgrind 输出已经显示所有分配都与 frees 匹配。我以为你在问为什么分配计数增加了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2014-08-24
相关资源
最近更新 更多