【发布时间】: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